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