File 0002-Added_the_NoSetter_variable_annotation.patch of Package python-sip.2072

# HG changeset patch
# User Phil Thompson <phil@riverbankcomputing.com>
# Date 1400002994 -3600
# Node ID 422cc3b4ee5b2c1fb81c1fe7a521f81bab231c07
# Parent  dd6840986c03feff52343fd2a6e03087fa4cad28
Added the /NoSetter/ variable annotation.

diff -r dd6840986c03 -r 422cc3b4ee5b sipgen/gencode.c
--- a/sipgen/gencode.c	Tue May 13 18:04:58 2014 +0100
+++ b/sipgen/gencode.c	Tue May 13 18:43:14 2014 +0100
@@ -31,7 +31,7 @@
 #define smtypeName(sm)          (strrchr((sm)->name->text, '.') + 1)
 
 /* Return TRUE if a wrapped variable can be set. */
-#define canSetVariable(vd)      ((vd)->type.nrderefs != 0 || !isConstArg(&(vd)->type))
+#define canSetVariable(vd)      (!noSetter(vd) && ((vd)->type.nrderefs != 0 || !isConstArg(&(vd)->type)))
 
 
 /* Control what generateCalledArgs() actually generates. */
diff -r dd6840986c03 -r 422cc3b4ee5b sipgen/metasrc/parser.y
--- a/sipgen/metasrc/parser.y	Tue May 13 18:04:58 2014 +0100
+++ b/sipgen/metasrc/parser.y	Tue May 13 18:43:14 2014 +0100
@@ -3915,6 +3915,7 @@
                 const char *annos[] = {
                     "DocType",
                     "Encoding",
+                    "NoSetter",
                     "PyInt",
                     "PyName",
                     NULL
@@ -6611,6 +6612,9 @@
     if (isstatic || (escope != NULL && escope->iff->type == namespace_iface))
         setIsStaticVar(var);
 
+    if (getOptFlag(of, "NoSetter", bool_flag) != NULL)
+        setNoSetter(var);
+
     addVariable(pt, var);
 }
 
diff -r dd6840986c03 -r 422cc3b4ee5b sipgen/sip.h.in
--- a/sipgen/sip.h	Tue May 13 18:04:58 2014 +0100
+++ b/sipgen/sip.h	Tue May 13 18:43:14 2014 +0100
@@ -368,12 +368,15 @@
 /* Handle variable flags. */
 
 #define VAR_IS_STATIC       0x01    /* It is a static variable. */
-#define VAR_NEEDS_HANDLER   0x02    /* It the variable needs a handler. */
+#define VAR_NEEDS_HANDLER   0x02    /* The variable needs a handler. */
+#define VAR_NO_SETTER       0x04    /* The variable has no setter. */
 
 #define isStaticVar(v)      ((v)->varflags & VAR_IS_STATIC)
 #define setIsStaticVar(v)   ((v)->varflags |= VAR_IS_STATIC)
 #define needsHandler(v)     ((v)->varflags & VAR_NEEDS_HANDLER)
 #define setNeedsHandler(v)  ((v)->varflags |= VAR_NEEDS_HANDLER)
+#define noSetter(v)         ((v)->varflags & VAR_NO_SETTER)
+#define setNoSetter(v)      ((v)->varflags |= VAR_NO_SETTER)
 
 
 /* Handle argument flags. */
diff -r dd6840986c03 -r 422cc3b4ee5b sphinx/annotations.rst
--- a/sphinx/annotations.rst	Tue May 13 18:04:58 2014 +0100
+++ b/sphinx/annotations.rst	Tue May 13 18:43:14 2014 +0100
@@ -1043,6 +1043,16 @@
     argument annotation when applied to the type of the variable being defined.
 
 
+.. variable-annotation:: NoSetter
+
+    .. versionadded:: 4.16
+
+    This boolean annotation specifies that the variable will have no setter and
+    will be read-only.  Because SIP does not fully understand C/C++ types
+    (particularly ``const`` arrays) it is sometimes necessary to explicitly
+    annotate a variable as being read-only.
+
+
 .. variable-annotation:: PyInt
 
     .. versionadded:: 4.12

openSUSE Build Service is sponsored by