From 2e9ef019df47b1becdbd04c0fcf35850000a9f57 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Mon, 4 Oct 2004 03:18:57 +0000 Subject: [PATCH] fix %extend+overload error git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6298 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Examples/test-suite/extend_placement.i | 74 ++++++++++++++++--- .../python/extend_placement_runme.py | 38 ++++++++-- Source/CParse/parser.y | 2 +- 3 files changed, 98 insertions(+), 16 deletions(-) diff --git a/Examples/test-suite/extend_placement.i b/Examples/test-suite/extend_placement.i index 8ef459853..639fa874e 100644 --- a/Examples/test-suite/extend_placement.i +++ b/Examples/test-suite/extend_placement.i @@ -5,10 +5,11 @@ // Before the class %extend Foo { - Foo(int a) { return new Foo(); } - ~Foo() { delete self;} - int spam(int x) { return x; } - int spam(int x, int y) { return x + y ; } + Foo(int a) { return new Foo(); } + ~Foo() { delete self;} + int spam(int x) { return x; } + int spam(int x, int y) { return x + y ; } + int spam(int x, int y,int z) { return x + y ; } }; %inline %{ @@ -26,14 +27,69 @@ public: %inline %{ class Bar { public: - int spam() { return 1; } - int spam(const char* c) { return 2; } + Bar() { } + int spam() { return 1; } + int spam(const char* c) { return 2; } }; %} %extend Bar { - Bar() { return new Bar(); } - ~Bar() { delete self;} - // int spam(int x) { return x; } + Bar(int a) { return new Bar(); } + ~Bar() { delete self;} + int spam() { return 1} + int spam(int x) { return x; } + int spam(int x, int y) { return x + y ; } + int spam(int x, int y,int z) { return x + y ; } }; + + +// testing templates + +// Before the class + +%extend FooT { + FooT(int a) { return new FooT(); } + ~FooT() { delete self;} + int spam(int x) { return x; } + int spam(int x, int y) { return x + y ; } + int spam(int x, int y,int z) { return x + y ; } +}; + +%inline %{ +template +class FooT { +public: + FooT(){} + + int spam() { return 1; } + int spam(const char* c) { return 2; } +}; +%} + +%template(FooTi) FooT; + + +// After the class + +%inline %{ +template +class BarT { +public: + BarT() { } + int spam() { return 1; } + int spam(const char* c) { return 2; } +}; +%} + + +%extend BarT { + BarT(int a) { return new BarT(); } + ~BarT() { delete self;} + int spam() { return 1} + int spam(int x) { return x; } + int spam(int x, int y) { return x + y ; } + int spam(int x, int y,int z) { return x + y ; } +}; + +%template(BarTi) BarT; diff --git a/Examples/test-suite/python/extend_placement_runme.py b/Examples/test-suite/python/extend_placement_runme.py index b66b04dd5..20ab28519 100644 --- a/Examples/test-suite/python/extend_placement_runme.py +++ b/Examples/test-suite/python/extend_placement_runme.py @@ -1,10 +1,36 @@ import extend_placement -import types +foo = extend_placement.Foo() foo = extend_placement.Foo(1) -print type(foo) -print foo.spam() -print foo.spam("hello") +foo.spam() +foo.spam("hello") +foo.spam(1) +foo.spam(1,1) +foo.spam(1,1,1) -foo = extend_placement.Foo(1) -print type(foo) + +bar = extend_placement.Bar() +bar = extend_placement.Bar(1) +bar.spam() +bar.spam("hello") +bar.spam(1) +bar.spam(1,1) +bar.spam(1,1,1) + + +foo = extend_placement.FooTi() +foo = extend_placement.FooTi(1) +foo.spam() +foo.spam("hello") +foo.spam(1) +foo.spam(1,1) +foo.spam(1,1,1) + + +bar = extend_placement.BarTi() +bar = extend_placement.BarTi(1) +bar.spam() +bar.spam("hello") +bar.spam(1) +bar.spam(1,1) +bar.spam(1,1,1) diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 320a097a1..76b0096a2 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -2520,6 +2520,7 @@ cpp_class_decl : Setattr($$,"allows_typedef","1"); /* Check for pure-abstract class */ Setattr($$,"abstract", pure_abstract($7)); + appendChild($$,$7); /* This bit of code merges in a previously defined %extend directive (if any) */ if (extendhash) { @@ -2535,7 +2536,6 @@ cpp_class_decl : if (!classes) classes = NewHash(); Setattr(classes,Swig_symbol_qualifiedscopename(0),$$); - appendChild($$,$7); p = $9; if (p) { set_nextSibling($$,p);