From d94bb6260d997c99236e7d4c49d433abe8fdd4cb Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Tue, 18 Oct 2005 14:04:14 +0000 Subject: [PATCH] add Luigi's static patch for extended variables git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7679 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/extend_variable.i | 16 +++++++++++ .../python/extend_variable_runme.py | 4 +++ Source/Modules/lang.cxx | 27 ++++++++++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 Examples/test-suite/python/extend_variable_runme.py 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);