diff --git a/SWIG/Examples/test-suite/common.mk b/SWIG/Examples/test-suite/common.mk index 8eea3b44a..7c7495191 100644 --- a/SWIG/Examples/test-suite/common.mk +++ b/SWIG/Examples/test-suite/common.mk @@ -191,6 +191,7 @@ CPP_TEST_CASES += \ sizet \ smart_pointer_const \ smart_pointer_const2 \ + smart_pointer_extend \ smart_pointer_member \ smart_pointer_multi \ smart_pointer_multi_typedef \ diff --git a/SWIG/Examples/test-suite/python/smart_pointer_extend_runme.py b/SWIG/Examples/test-suite/python/smart_pointer_extend_runme.py new file mode 100644 index 000000000..0b2ff0f26 --- /dev/null +++ b/SWIG/Examples/test-suite/python/smart_pointer_extend_runme.py @@ -0,0 +1,19 @@ +from smart_pointer_extend import * + +f = Foo() +b = Bar(f) + +if b.extension() != f.extension(): + raise RuntimeError + + +b = CBase() +d = CDerived() +p = CPtr() + + +if d.foo() != p.foo(): + raise RuntimeError + + + diff --git a/SWIG/Examples/test-suite/python/smart_pointer_member_runme.py b/SWIG/Examples/test-suite/python/smart_pointer_member_runme.py index a18e132b8..49b3ef0f7 100644 --- a/SWIG/Examples/test-suite/python/smart_pointer_member_runme.py +++ b/SWIG/Examples/test-suite/python/smart_pointer_member_runme.py @@ -19,6 +19,3 @@ if b.x != f.x: if b.z != f.z: raise RuntimeError - -if b.extension() != f.extension(): - raise RuntimeError diff --git a/SWIG/Examples/test-suite/smart_pointer_extend.i b/SWIG/Examples/test-suite/smart_pointer_extend.i new file mode 100644 index 000000000..402aecac8 --- /dev/null +++ b/SWIG/Examples/test-suite/smart_pointer_extend.i @@ -0,0 +1,50 @@ +%module smart_pointer_extend + +%inline %{ + +class CBase +{ +}; + +class CDerived : public CBase +{ +}; + +class CPtr +{ +public: + CDerived* operator->(void) {return 0;}; +}; + +%} + +%extend CBase { + int foo(void) {return 1;}; +} + +%extend CDerived { + int foo(void) {return 2;}; +} + + +%extend Foo +{ + int extension(int i, int j) { return i; } + int extension(int i) { return i; } + int extension() { return 1; } +} + +%inline %{ + struct Foo { + }; + + class Bar { + Foo *f; + public: + Bar(Foo *f) : f(f) { } + Foo *operator->() { + return f; + } + }; +%} + diff --git a/SWIG/Examples/test-suite/smart_pointer_member.i b/SWIG/Examples/test-suite/smart_pointer_member.i index 3a2c6fb2f..4c20b9b9e 100644 --- a/SWIG/Examples/test-suite/smart_pointer_member.i +++ b/SWIG/Examples/test-suite/smart_pointer_member.i @@ -1,12 +1,6 @@ %module smart_pointer_member -%extend Foo -{ - int extension(int i, int j) { return i; } - int extension(int i) { return i; } - int extension() { return 1; } -} %inline %{ diff --git a/SWIG/Source/Modules/allocate.cxx b/SWIG/Source/Modules/allocate.cxx index 37cd25a35..773fae204 100644 --- a/SWIG/Source/Modules/allocate.cxx +++ b/SWIG/Source/Modules/allocate.cxx @@ -267,8 +267,8 @@ class Allocate : public Dispatcher { c = nextSibling(c); continue; } - if (Strcmp(nodeType(c),"extend") == 0) { - Append(methods,c); + if (!isconst && (Strcmp(nodeType(c),"extend") == 0)) { + methods = smart_pointer_methods(c, methods, isconst); } else if (Strcmp(nodeType(c),"cdecl") == 0) { if (!Getattr(c,"feature:ignore")) { String *storage = Getattr(c,"storage");