diff --git a/Examples/test-suite/extend_variable.i b/Examples/test-suite/extend_variable.i index a58031399..0d24e6d33 100644 --- a/Examples/test-suite/extend_variable.i +++ b/Examples/test-suite/extend_variable.i @@ -33,3 +33,19 @@ double ExtendMe_ExtendVar_get(ExtendMe *thisptr) { return value; } %} + + +%{ + class Foo + { + }; +%} + + +class Foo { + public: + %extend { + static const int Bar = 42; + } +}; + diff --git a/Examples/test-suite/python/extend_variable_runme.py b/Examples/test-suite/python/extend_variable_runme.py new file mode 100644 index 000000000..6a6628cac --- /dev/null +++ b/Examples/test-suite/python/extend_variable_runme.py @@ -0,0 +1,4 @@ +from extend_variable import * + +if Foo.Bar != 42: + raise RuntimeError diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 92ba9b579..5c2289dcf 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -1371,14 +1371,33 @@ Language::staticmembervariableHandler(Node *n) static const int x = 3; }; - Some discussion of this in section 9.4 of the C++ draft standard. */ + Some discussion of this in section 9.4 of the C++ draft standard. + + Also, we have to manage the case: + + class Foo { + public: + %extend { + static const int x = 3; + } + }; + + in which there's no actual Foo::x variable to refer to. In this case, + the best we can do is to wrap the given value verbatim. + */ String *name = Getattr(n,"name"); String *cname = NewStringf("%s::%s", classname,name); - String* value = SwigType_namestr(cname); - Setattr(n, "value", value); - + if (Getattr(n,"feature:extend")) { + /* the variable is a synthesized one. + There's nothing we can do; we just keep the given value */ + } else { + /* we refer to the value as Foo::x */ + String* value = SwigType_namestr(cname); + Setattr(n, "value", value); + } + SwigType *t1 = SwigType_typedef_resolve_all(Getattr(n,"type")); SwigType *t2 = SwigType_strip_qualifiers(t1); Setattr(n, "type", t2);