From: <wsf...@us...> - 2012-08-04 20:24:29
|
Revision: 13504 http://swig.svn.sourceforge.net/swig/?rev=13504&view=rev Author: wsfulton Date: 2012-08-04 20:24:22 +0000 (Sat, 04 Aug 2012) Log Message: ----------- Fix using declarations and templates. %template was putting the instantiated template into the global namespace instead of the namespace of the template definition. This fixes regression in swig-2.0.5 copying the std::pair typemaps which occurs with a 'using std::pair' declaration. This also fixes lots of other using declarations of template problems (template forward declarations. combinations using directives). Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Source/CParse/parser.y Added Paths: ----------- trunk/Examples/test-suite/java/template_namespace_forward_declaration_runme.java trunk/Examples/test-suite/java/template_using_directive_and_declaration_forward_runme.java trunk/Examples/test-suite/li_std_pair_using.i trunk/Examples/test-suite/python/li_std_pair_using_runme.py trunk/Examples/test-suite/template_namespace_forward_declaration.i trunk/Examples/test-suite/template_using_directive_and_declaration_forward.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-04 20:23:31 UTC (rev 13503) +++ trunk/CHANGES.current 2012-08-04 20:24:22 UTC (rev 13504) @@ -16,7 +16,56 @@ 2012-07-20: kwwette [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). +2012-07-02: wsfulton + Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced + in swig-2.0.5: + %include<stl.i> + using std::pair; + %template(StrPair) pair<std::string, std::string>; + +2012-07-02: wsfulton + Fix using declarations combined with using directives with forward class declarations so that + types are correctly found in scope for templates. Example: + + namespace Outer2 { + namespace Space2 { + template<typename T> class Thing2; + } + } + using namespace Outer2; + using Space2::Thing2; + template<typename T> class Thing2 {}; + // STILL BROKEN void useit2(Thing2<int> t) {} + void useit2a(Outer2::Space2::Thing2<int> t) {} + void useit2b(::Outer2::Space2::Thing2<int> t) {} + void useit2c(Space2::Thing2<int> t) {} + namespace Outer2 { + void useit2d(Space2::Thing2<int> t) {} + } + + %template(Thing2Int) Thing2<int>; + + 2012-06-30: wsfulton + Fix template namespace problems for symbols declared with a forward class declarations, such as: + + namespace Space1 { + namespace Space2 { + template<typename T> struct YYY; + } + template<typename T> struct Space2::YYY { + T yyy(T h) { + return h; + } + }; + void testYYY1(Space1::Space2::YYY<int> yy) {} + void testYYY2(Space2::YYY<int> yy) {} + void testYYY3(::Space1::Space2::YYY<int> yy) {} + } + + %template(YYYInt) Space1::Space2::YYY<int>; + +2012-06-30: wsfulton Fix namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2012-08-04 20:23:31 UTC (rev 13503) +++ trunk/Examples/test-suite/common.mk 2012-08-04 20:24:22 UTC (rev 13504) @@ -370,6 +370,8 @@ template_inherit_abstract \ template_int_const \ template_methods \ + template_namespace_forward_declaration \ + template_using_directive_and_declaration_forward \ template_nested \ template_nested_typemaps \ template_ns \ @@ -476,6 +478,7 @@ li_std_except \ li_std_map \ li_std_pair \ + li_std_pair_using \ li_std_string \ li_std_vector \ li_std_vector_enum \ Added: trunk/Examples/test-suite/java/template_namespace_forward_declaration_runme.java =================================================================== --- trunk/Examples/test-suite/java/template_namespace_forward_declaration_runme.java (rev 0) +++ trunk/Examples/test-suite/java/template_namespace_forward_declaration_runme.java 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,26 @@ + +import template_namespace_forward_declaration.*; + +public class template_namespace_forward_declaration_runme { + + static { + try { + System.loadLibrary("template_namespace_forward_declaration"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + XXXInt xxx = new XXXInt(); + template_namespace_forward_declaration.testXXX1(xxx); + template_namespace_forward_declaration.testXXX2(xxx); + template_namespace_forward_declaration.testXXX3(xxx); + YYYInt yyy = new YYYInt(); + template_namespace_forward_declaration.testYYY1(yyy); + template_namespace_forward_declaration.testYYY2(yyy); + template_namespace_forward_declaration.testYYY3(yyy); + } +} + Added: trunk/Examples/test-suite/java/template_using_directive_and_declaration_forward_runme.java =================================================================== --- trunk/Examples/test-suite/java/template_using_directive_and_declaration_forward_runme.java (rev 0) +++ trunk/Examples/test-suite/java/template_using_directive_and_declaration_forward_runme.java 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,53 @@ + +import template_using_directive_and_declaration_forward.*; + +public class template_using_directive_and_declaration_forward_runme { + + static { + try { + System.loadLibrary("template_using_directive_and_declaration_forward"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + template_using_directive_and_declaration_forward.useit1(new Thing1Int()); + template_using_directive_and_declaration_forward.useit1a(new Thing1Int()); + template_using_directive_and_declaration_forward.useit1b(new Thing1Int()); + template_using_directive_and_declaration_forward.useit1c(new Thing1Int()); + +//BROKEN template_using_directive_and_declaration_forward.useit2(new Thing2Int()); + template_using_directive_and_declaration_forward.useit2a(new Thing2Int()); + template_using_directive_and_declaration_forward.useit2b(new Thing2Int()); + template_using_directive_and_declaration_forward.useit2c(new Thing2Int()); + template_using_directive_and_declaration_forward.useit2d(new Thing2Int()); + +//BROKEN template_using_directive_and_declaration_forward.useit3(new Thing3Int()); + template_using_directive_and_declaration_forward.useit3a(new Thing3Int()); + template_using_directive_and_declaration_forward.useit3b(new Thing3Int()); + template_using_directive_and_declaration_forward.useit3c(new Thing3Int()); + template_using_directive_and_declaration_forward.useit3d(new Thing3Int()); + +//BROKEN template_using_directive_and_declaration_forward.useit4(new Thing4Int()); + template_using_directive_and_declaration_forward.useit4a(new Thing4Int()); + template_using_directive_and_declaration_forward.useit4b(new Thing4Int()); + template_using_directive_and_declaration_forward.useit4c(new Thing4Int()); + template_using_directive_and_declaration_forward.useit4d(new Thing4Int()); + +//BROKEN template_using_directive_and_declaration_forward.useit5(new Thing5Int()); + template_using_directive_and_declaration_forward.useit5a(new Thing5Int()); + template_using_directive_and_declaration_forward.useit5b(new Thing5Int()); + template_using_directive_and_declaration_forward.useit5c(new Thing5Int()); + template_using_directive_and_declaration_forward.useit5d(new Thing5Int()); + + +//BROKEN template_using_directive_and_declaration_forward.useit7(new Thing7Int()); + template_using_directive_and_declaration_forward.useit7a(new Thing7Int()); + template_using_directive_and_declaration_forward.useit7b(new Thing7Int()); + template_using_directive_and_declaration_forward.useit7c(new Thing7Int()); + template_using_directive_and_declaration_forward.useit7d(new Thing7Int()); + } +} Added: trunk/Examples/test-suite/li_std_pair_using.i =================================================================== --- trunk/Examples/test-suite/li_std_pair_using.i (rev 0) +++ trunk/Examples/test-suite/li_std_pair_using.i 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,21 @@ +%module li_std_pair_using + +%include<stl.i> +using std::pair; + +%template(StringStringPair) pair<std::string, std::string>; + +%inline %{ +typedef int Integer; +using std::string; +%} + +%template(StringIntPair) pair<string, int>; + +%inline %{ +typedef std::string String; +typedef string Streeng; +std::pair<String, Streeng> bounce(std::pair<std::string, string> p) { + return p; +} +%} Added: trunk/Examples/test-suite/python/li_std_pair_using_runme.py =================================================================== --- trunk/Examples/test-suite/python/li_std_pair_using_runme.py (rev 0) +++ trunk/Examples/test-suite/python/li_std_pair_using_runme.py 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,10 @@ +from li_std_pair_using import * + +one_tuple = ("one", "numero uno") +one = StringStringPair(one_tuple) +two_tuple = ("two", 2) +two = StringIntPair(two_tuple) + +if bounce(one) != one_tuple: + raise RuntimeError + Added: trunk/Examples/test-suite/template_namespace_forward_declaration.i =================================================================== --- trunk/Examples/test-suite/template_namespace_forward_declaration.i (rev 0) +++ trunk/Examples/test-suite/template_namespace_forward_declaration.i 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,38 @@ +%module template_namespace_forward_declaration + +%inline %{ + namespace Space1 { + namespace Space2 { + template<typename T> struct XXX; + template<typename T> struct YYY; + } + + template<typename T> struct Space2::YYY { + T yyy(T h) { + return h; + } + }; + template<typename T> struct Space1::Space2::XXX { + T xxx(T h) { + return h; + } + }; + + void testXXX1(Space1::Space2::XXX<int> xx) { + } + void testXXX2(Space2::XXX<int> xx) { + } + void testXXX3(::Space1::Space2::XXX<int> xx) { + } + void testYYY1(Space1::Space2::YYY<int> yy) { + } + void testYYY2(Space2::YYY<int> yy) { + } + void testYYY3(::Space1::Space2::YYY<int> yy) { + } + } +%} + +%template(XXXInt) Space1::Space2::XXX<int>; +%template(YYYInt) Space1::Space2::YYY<int>; + Added: trunk/Examples/test-suite/template_using_directive_and_declaration_forward.i =================================================================== --- trunk/Examples/test-suite/template_using_directive_and_declaration_forward.i (rev 0) +++ trunk/Examples/test-suite/template_using_directive_and_declaration_forward.i 2012-08-04 20:24:22 UTC (rev 13504) @@ -0,0 +1,133 @@ +%module template_using_directive_and_declaration_forward +// Test using directives combined with using declarations and forward declarations (templates) + +%inline %{ +namespace Outer1 { + namespace Space1 { + template<typename T> class Thing1; + } +} +using namespace Outer1::Space1; +using Outer1::Space1::Thing1; +template<typename T> class Thing1 {}; +void useit1(Thing1<int> t) {} +void useit1a(Outer1::Space1::Thing1<int> t) {} +void useit1b(::Outer1::Space1::Thing1<int> t) {} +namespace Outer1 { + void useit1c(Space1::Thing1<int> t) {} +} + + +namespace Outer2 { + namespace Space2 { + template<typename T> class Thing2; + } +} +using namespace Outer2; +using Space2::Thing2; +template<typename T> class Thing2 {}; +// BROKEN void useit2(Thing2<int> t) {} +void useit2a(Outer2::Space2::Thing2<int> t) {} +void useit2b(::Outer2::Space2::Thing2<int> t) {} +void useit2c(Space2::Thing2<int> t) {} +namespace Outer2 { + void useit2d(Space2::Thing2<int> t) {} +} + + +namespace Outer3 { + namespace Space3 { + namespace Middle3 { + template<typename T> class Thing3; + } + } +} +using namespace Outer3; +using namespace Space3; +using Middle3::Thing3; +template<typename T> class Thing3 {}; +// BROKEN void useit3(Thing3<int> t) {} +void useit3a(Outer3::Space3::Middle3::Thing3<int> t) {} +void useit3b(::Outer3::Space3::Middle3::Thing3<int> t) {} +void useit3c(Middle3::Thing3<int> t) {} +namespace Outer3 { + namespace Space3 { + void useit3d(Middle3::Thing3<int> t) {} + } +} + + +namespace Outer4 { + namespace Space4 { + namespace Middle4 { + template<typename T> class Thing4; + } + } +} +using namespace Outer4::Space4; +using Middle4::Thing4; +template<typename T> class Thing4 {}; +// BROKEN void useit4(Thing4<int> t) {} +void useit4a(Outer4::Space4::Middle4::Thing4<int> t) {} +void useit4b(::Outer4::Space4::Middle4::Thing4<int> t) {} +void useit4c(Middle4::Thing4<int> t) {} +namespace Outer4 { + namespace Space4 { + void useit4d(Middle4::Thing4<int> t) {} + } +} + + +namespace Outer5 { + namespace Space5 { + namespace Middle5 { + namespace More5 { + template<typename T> class Thing5; + } + } + } +} +using namespace ::Outer5::Space5; +using namespace Middle5; +using More5::Thing5; +template<typename T> class Thing5 {}; +// BROKEN void useit5(Thing5<int> t) {} +void useit5a(Outer5::Space5::Middle5::More5::Thing5<int> t) {} +void useit5b(::Outer5::Space5::Middle5::More5::Thing5<int> t) {} +void useit5c(Middle5::More5::Thing5<int> t) {} +namespace Outer5 { + namespace Space5 { + void useit5d(Middle5::More5::Thing5<int> t) {} + } +} + +namespace Outer7 { + namespace Space7 { + namespace Middle7 { + template<typename T> class Thing7; + } + } +} +using namespace Outer7::Space7; +template<typename T> class Middle7::Thing7 {}; +using Middle7::Thing7; +// BROKEN void useit7(Thing7<int> t) {} +void useit7a(Outer7::Space7::Middle7::Thing7<int> t) {} +void useit7b(::Outer7::Space7::Middle7::Thing7<int> t) {} +void useit7c(Middle7::Thing7<int> t) {} +namespace Outer7 { + namespace Space7 { + void useit7d(Middle7::Thing7<int> t) {} + } +} + +%} + +%template(Thing1Int) Thing1<int>; +%template(Thing2Int) Thing2<int>; +%template(Thing3Int) Thing3<int>; +%template(Thing4Int) Thing4<int>; +%template(Thing5Int) Thing5<int>; +%template(Thing7Int) Thing7<int>; + + Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2012-08-04 20:23:31 UTC (rev 13503) +++ trunk/Source/CParse/parser.y 2012-08-04 20:24:22 UTC (rev 13504) @@ -879,20 +879,19 @@ nscope = 0; nscope_inner = 0; - if (Swig_scopename_check(cname)) { - String *prefix = Swig_scopename_prefix(cname); - if (prefix && (Strncmp(prefix,"::",2) == 0)) - skip_lookup = 1; - } + if (Strncmp(cname,"::",2) == 0) + skip_lookup = 1; + cname_node = skip_lookup ? 0 : Swig_symbol_clookup_no_inherit(cname, 0); if (cname_node) { /* The symbol has been defined already or is in another scope. If it is a weak symbol, it needs replacing and if it was brought into the current scope - via a using declaration, the scope needs adjusting appropriately for the new symbol. */ + via a using declaration, the scope needs adjusting appropriately for the new symbol. + Similarly for defined templates. */ Symtab *symtab = Getattr(cname_node, "sym:symtab"); Node *sym_weak = Getattr(cname_node, "sym:weak"); - if (symtab && sym_weak) { + if ((symtab && sym_weak) || Equal(nodeType(cname_node), "template")) { /* Check if the scope is the current scope */ String *current_scopename = Swig_symbol_qualifiedscopename(0); String *found_scopename = Swig_symbol_qualifiedscopename(symtab); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-04 22:38:50
|
Revision: 13509 http://swig.svn.sourceforge.net/swig/?rev=13509&view=rev Author: wsfulton Date: 2012-08-04 22:38:44 +0000 (Sat, 04 Aug 2012) Log Message: ----------- Remove unnecessary keyword warning when parsing 'using' Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Swig/naming.c Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-04 20:26:08 UTC (rev 13508) +++ trunk/CHANGES.current 2012-08-04 22:38:44 UTC (rev 13509) @@ -5,10 +5,16 @@ Version 2.0.8 (in progress) =========================== -2012-06-27: wsfulton +2012-08-04: wsfulton + Remove incorrect warning (314) about target language keywords which were triggered + by using declarations and using directives. For example 'string' is a keyword in C#: + namespace std { class string; } + using std::string; + +2012-07-21: wsfulton Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. -2012-06-27: wsfulton +2012-07-21: wsfulton Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window rather than stdout. This fixes display problems in gdbtui and the ensures the output appears where expected in other gdb based debuggers such as Eclipse CDT. Modified: trunk/Source/Swig/naming.c =================================================================== --- trunk/Source/Swig/naming.c 2012-08-04 20:26:08 UTC (rev 13508) +++ trunk/Source/Swig/naming.c 2012-08-04 22:38:44 UTC (rev 13509) @@ -883,13 +883,16 @@ int Swig_need_name_warning(Node *n) { int need = 1; /* - we don't use name warnings for: + We don't use name warnings for: - class forwards, no symbol is generated at the target language. - template declarations, only for real instances using %template(name). - - typedefs, they have no effect at the target language. + - typedefs, have no effect at the target language. + - using declarations and using directives, have no effect at the target language. */ if (checkAttribute(n, "nodeType", "classforward")) { need = 0; + } else if (checkAttribute(n, "nodeType", "using")) { + need = 0; } else if (checkAttribute(n, "storage", "typedef")) { need = 0; } else if (Getattr(n, "hidden")) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-05 10:15:14
|
Revision: 13513 http://swig.svn.sourceforge.net/swig/?rev=13513&view=rev Author: wsfulton Date: 2012-08-05 10:15:08 +0000 (Sun, 05 Aug 2012) Log Message: ----------- #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using Perl 5.16 and later. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/perl5/noembed.h Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-05 08:38:16 UTC (rev 13512) +++ trunk/CHANGES.current 2012-08-05 10:15:08 UTC (rev 13513) @@ -5,6 +5,10 @@ Version 2.0.8 (in progress) =========================== +2012-08-05: wsfulton + [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using + Perl 5.16 and later. + 2012-08-04: wsfulton Remove incorrect warning (314) about target language keywords which were triggered by using declarations and using directives. For example 'string' is a keyword in C#: Modified: trunk/Lib/perl5/noembed.h =================================================================== --- trunk/Lib/perl5/noembed.h 2012-08-05 08:38:16 UTC (rev 13512) +++ trunk/Lib/perl5/noembed.h 2012-08-05 10:15:08 UTC (rev 13513) @@ -64,9 +64,6 @@ #ifdef eof #undef eof #endif -#ifdef bool - #undef bool -#endif #ifdef close #undef close #endif @@ -106,3 +103,11 @@ #ifdef stat #undef stat #endif + +#ifdef bool + /* Leave if macro is from C99 stdbool.h */ + #ifndef __bool_true_false_are_defined + #undef bool + #endif +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-05 15:49:49
|
Revision: 13519 http://swig.svn.sourceforge.net/swig/?rev=13519&view=rev Author: wsfulton Date: 2012-08-05 15:49:43 +0000 (Sun, 05 Aug 2012) Log Message: ----------- Fix invalid code sometimes being generated for C# director methods with many arguments Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/director_classes.i trunk/Source/Modules/csharp.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-05 14:18:46 UTC (rev 13518) +++ trunk/CHANGES.current 2012-08-05 15:49:43 UTC (rev 13519) @@ -6,6 +6,10 @@ =========================== 2012-08-05: wsfulton + [C#] Fix #3536360 - Invalid code sometimes being generated for director methods + with many arguments. + +2012-08-05: wsfulton [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using Perl 5.16 and later. Modified: trunk/Examples/test-suite/director_classes.i =================================================================== --- trunk/Examples/test-suite/director_classes.i 2012-08-05 14:18:46 UTC (rev 13518) +++ trunk/Examples/test-suite/director_classes.i 2012-08-05 15:49:43 UTC (rev 13519) @@ -108,3 +108,20 @@ %} + +%feature(director) BaseClass; +%feature(director) DerivedClass; + +%inline %{ +class BaseClass +{ +public: +virtual ~BaseClass() {}; +virtual int dofoo(int& one, int& two, int& three) {return 0;} +}; + +class DerivedClass : public BaseClass +{ +}; +%} + Modified: trunk/Source/Modules/csharp.cxx =================================================================== --- trunk/Source/Modules/csharp.cxx 2012-08-05 14:18:46 UTC (rev 13518) +++ trunk/Source/Modules/csharp.cxx 2012-08-05 15:49:43 UTC (rev 13519) @@ -3728,7 +3728,6 @@ Delete(ln); Delete(arg); Delete(c_decl); - Delete(c_param_type); } /* header declaration, start wrapper definition */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-05 16:16:29
|
Revision: 13521 http://swig.svn.sourceforge.net/swig/?rev=13521&view=rev Author: wsfulton Date: 2012-08-05 16:16:23 +0000 (Sun, 05 Aug 2012) Log Message: ----------- Error checking for stale DOH object use - also with documentation. Modified Paths: -------------- trunk/Doc/Devel/internals.html trunk/Source/DOH/memory.c Modified: trunk/Doc/Devel/internals.html =================================================================== --- trunk/Doc/Devel/internals.html 2012-08-05 15:53:56 UTC (rev 13520) +++ trunk/Doc/Devel/internals.html 2012-08-05 16:16:23 UTC (rev 13521) @@ -42,6 +42,7 @@ <li><a name="i7" href="#7">7. Debugging SWIG</a> <ul> <li><a name="i7.1" href="#7.1">7.1 Debugging DOH Types The Hard Way</a> +<li><a name="i7.2" href="#7.2">7.2 Debugging DOH memory allocation problems</a> </ul> </ul> @@ -1179,6 +1180,34 @@ </ul> +<a name="7.2" href="#i7.2"> +<h3>7.2 Debugging DOH memory allocation problems</h3> +</a> + +<p> +The DOH objects are reference counted and use pools for memory allocation. +The implementation is in <tt>memory.c</tt>. When there are memory corruption problems, +various memory allocator tools are normally used to diagnose problems. These can be used +on SWIG and can be very useful. However, they won't necessarily find use of stale DOH objects, +that is, DOH objects +that are used after they have been deleted. This is because the DOH memory allocator +grabs a chunk of memory from the C memory allocator and manages the usage internally. +Stale DOH object usage can be checked for by defining <tt>DOH_DEBUG_MEMORY_POOLS</tt> in +<tt>memory.c</tt>. If an attempt to use an object is made after the reference count is +zero, an assertion is triggered instead of quietly re-using the stale object... +</p> + +<blockquote> +<pre> +swig: DOH/memory.c:91: DohCheck: Assertion `!DOH_object_already_deleted' failed. +</pre> +</blockquote> + +<p> +This can be memory intensive as previously used memory in the pool is not re-used so is +only recommended for diagnosing memory corruption problems. +</p> + <hr> Copyright (C) 1999-2010 SWIG Development Team. Modified: trunk/Source/DOH/memory.c =================================================================== --- trunk/Source/DOH/memory.c 2012-08-05 15:53:56 UTC (rev 13520) +++ trunk/Source/DOH/memory.c 2012-08-05 16:16:23 UTC (rev 13521) @@ -21,9 +21,7 @@ #endif /* Checks stale DOH object use - will use a lot more memory as pool memory is not re-used. */ -/* -#define DEBUG_MEMORY_POOLS -*/ +#define DOH_DEBUG_MEMORY_POOLS static int PoolSize = DOH_POOL_SIZE; @@ -87,10 +85,10 @@ register char *cptr = (char *) ptr; while (p) { if ((cptr >= p->pbeg) && (cptr < p->pend)) { -#ifdef DEBUG_MEMORY_POOLS +#ifdef DOH_DEBUG_MEMORY_POOLS DohBase *b = (DohBase *) ptr; - int already_deleted = b->type == 0; - assert(!already_deleted); + int DOH_object_already_deleted = b->type == 0; + assert(!DOH_object_already_deleted); #endif return 1; } @@ -121,7 +119,7 @@ DohBase *obj; if (!pools_initialized) InitPools(); -#ifndef DEBUG_MEMORY_POOLS +#ifndef DOH_DEBUG_MEMORY_POOLS if (FreeList) { obj = FreeList; FreeList = (DohBase *) obj->data; @@ -132,7 +130,7 @@ } obj = Pools->ptr + Pools->current; ++Pools->current; -#ifndef DEBUG_MEMORY_POOLS +#ifndef DOH_DEBUG_MEMORY_POOLS } #endif obj->type = type; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gra...@us...> - 2012-08-08 09:19:37
|
Revision: 13559 http://swig.svn.sourceforge.net/swig/?rev=13559&view=rev Author: grayswandir Date: 2012-08-08 09:19:26 +0000 (Wed, 08 Aug 2012) Log Message: ----------- Fix somes typos Modified Paths: -------------- trunk/CHANGES trunk/Doc/Manual/Android.html trunk/Examples/xml/example_apply.expected-xml trunk/Examples/xml/example_xml.expected-xml trunk/Lib/perl5/reference.i Modified: trunk/CHANGES =================================================================== --- trunk/CHANGES 2012-08-08 06:08:36 UTC (rev 13558) +++ trunk/CHANGES 2012-08-08 09:19:26 UTC (rev 13559) @@ -3303,7 +3303,7 @@ [C#] Added missing support for C++ class member pointers. 08/09/2007: wsfulton - [C#, Java] Add support for $owner in the "out" typemaps like in the the scripting + [C#, Java] Add support for $owner in the "out" typemaps like in the scripting language modules. Note that $owner has always been supported in the "javaout" / "csout" typemaps. @@ -4003,7 +4003,7 @@ 10/12/2006: wsfulton [Java] Remove potential race condition on the proxy class' delete() method (it is now a synchronized method, but is now customisable by changing the - methodmodifiers attribute in the the javadestruct or javadestruct_derived typemap) + methodmodifiers attribute in the javadestruct or javadestruct_derived typemap) [C#] Remove potential race condition on the proxy class' Dispose() method, similar to Java's delete() above. @@ -4811,7 +4811,7 @@ %naturalvar std::string; %include <std_string.i> - that will tell swig to use the the 'natural' wrapping + that will tell swig to use the 'natural' wrapping mechanism to all std::string global and member variables. @@ -8318,7 +8318,7 @@ b = B() b.bar(1) - note the the methods are emitted inside the classes, + note the methods are emitted inside the classes, and hence, the %template name refers to the 'member' method name, not a global namespace name. @@ -16266,7 +16266,7 @@ %feature, %rename, %ignore, %exception, and related directives: - Namespaces are fully integrated into the the renaming and declaration + Namespaces are fully integrated into the renaming and declaration matcher. For example: %rename(display) Foo::print; // Rename in namespace Foo Modified: trunk/Doc/Manual/Android.html =================================================================== --- trunk/Doc/Manual/Android.html 2012-08-08 06:08:36 UTC (rev 13558) +++ trunk/Doc/Manual/Android.html 2012-08-08 09:19:26 UTC (rev 13559) @@ -45,7 +45,7 @@ <p> -The examples require the the <a href="http://developer.android.com/sdk/index.html">Android SDK</a> and <a href="http://developer.android.com/sdk/ndk/index.html">Android NDK</a> which can be installed as per instructions in the links. +The examples require the <a href="http://developer.android.com/sdk/index.html">Android SDK</a> and <a href="http://developer.android.com/sdk/ndk/index.html">Android NDK</a> which can be installed as per instructions in the links. The Eclipse version is not required for these examples as just the command line tools are used (shown for Linux as the host, but Windows will be very similar, if not identical in most places). Add the SDK tools and NDK tools to your path and create a directory somewhere for your Android projects (adjust PATH as necessary to where you installed the tools): </p> Modified: trunk/Examples/xml/example_apply.expected-xml =================================================================== --- trunk/Examples/xml/example_apply.expected-xml 2012-08-08 06:08:36 UTC (rev 13558) +++ trunk/Examples/xml/example_apply.expected-xml 2012-08-08 09:19:26 UTC (rev 13559) @@ -1225,7 +1225,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = SvIV(tempsv); $target = &dvalue; @@ -1248,7 +1248,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $target = &dvalue; @@ -1271,7 +1271,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $target = &dvalue; @@ -1294,7 +1294,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned int) SvIV(tempsv); $target = &dvalue; @@ -1317,7 +1317,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned short) SvIV(tempsv); $target = &dvalue; @@ -1340,7 +1340,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned long) SvIV(tempsv); $target = &dvalue; Modified: trunk/Examples/xml/example_xml.expected-xml =================================================================== --- trunk/Examples/xml/example_xml.expected-xml 2012-08-08 06:08:36 UTC (rev 13558) +++ trunk/Examples/xml/example_xml.expected-xml 2012-08-08 09:19:26 UTC (rev 13559) @@ -1257,7 +1257,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = SvIV(tempsv); $target = &dvalue; @@ -1280,7 +1280,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $target = &dvalue; @@ -1303,7 +1303,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $target = &dvalue; @@ -1326,7 +1326,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned int) SvIV(tempsv); $target = &dvalue; @@ -1349,7 +1349,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned short) SvIV(tempsv); $target = &dvalue; @@ -1372,7 +1372,7 @@ } tempsv = SvRV($source); if (!SvIOK(tempsv)) { - croak("expected a integer reference"); + croak("expected an integer reference"); } dvalue = (unsigned long) SvIV(tempsv); $target = &dvalue; Modified: trunk/Lib/perl5/reference.i =================================================================== --- trunk/Lib/perl5/reference.i 2012-08-08 06:08:36 UTC (rev 13558) +++ trunk/Lib/perl5/reference.i 2012-08-08 09:19:26 UTC (rev 13559) @@ -85,7 +85,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv); $1 = &dvalue; @@ -99,7 +99,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $1 = &dvalue; @@ -112,7 +112,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $1 = &dvalue; @@ -125,7 +125,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (unsigned int) SvUV(tempsv); $1 = &dvalue; @@ -138,7 +138,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (unsigned short) SvUV(tempsv); $1 = &dvalue; @@ -151,7 +151,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (unsigned long) SvUV(tempsv); $1 = &dvalue; @@ -165,7 +165,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (unsigned char) SvUV(tempsv); $1 = &dvalue; @@ -179,7 +179,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = (signed char) SvIV(tempsv); $1 = &dvalue; @@ -193,7 +193,7 @@ } tempsv = SvRV($input); if (!SvIOK(tempsv)) { - SWIG_croak("expected a integer reference"); + SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv) ? true : false; $1 = &dvalue; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-08 22:24:53
|
Revision: 13571 http://swig.svn.sourceforge.net/swig/?rev=13571&view=rev Author: wsfulton Date: 2012-08-08 22:24:46 +0000 (Wed, 08 Aug 2012) Log Message: ----------- Suppress -Werror=unused-but-set-variable gcc warning in Python wrappers Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/python/pyinit.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-08 16:44:53 UTC (rev 13570) +++ trunk/CHANGES.current 2012-08-08 22:24:46 UTC (rev 13571) @@ -6,6 +6,9 @@ =========================== 2012-08-05: wsfulton + [Python] #3530021 Fix unused variable warning. + +2012-08-05: wsfulton [C#] Fix #3536360 - Invalid code sometimes being generated for director methods with many arguments. Modified: trunk/Lib/python/pyinit.swg =================================================================== --- trunk/Lib/python/pyinit.swg 2012-08-08 16:44:53 UTC (rev 13570) +++ trunk/Lib/python/pyinit.swg 2012-08-08 22:24:46 UTC (rev 13571) @@ -398,6 +398,7 @@ m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); + (void)md; SWIG_InitializeModule(0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dr...@us...> - 2012-08-12 15:21:45
|
Revision: 13601 http://swig.svn.sourceforge.net/swig/?rev=13601&view=rev Author: drjoe Date: 2012-08-12 15:21:39 +0000 (Sun, 12 Aug 2012) Log Message: ----------- change R components so that pointers are visible through ref Modified Paths: -------------- trunk/Lib/r/rtype.swg trunk/Source/Modules/r.cxx Modified: trunk/Lib/r/rtype.swg =================================================================== --- trunk/Lib/r/rtype.swg 2012-08-12 15:16:40 UTC (rev 13600) +++ trunk/Lib/r/rtype.swg 2012-08-12 15:21:39 UTC (rev 13601) @@ -12,6 +12,8 @@ %apply int {unsigned int} %apply int {short} %apply int {unsigned short} +%apply int {signed char} +%apply int {unsigned char} %typemap("rtype") long, long *, long & "integer"; %apply long {long long} @@ -36,10 +38,9 @@ %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; -%typemap("rtypecheck") int, int &, long, long &, - unsigned char, unsigned char & +%typemap("rtypecheck") int, int &, long, long & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} -%typemap("rtypecheck") int *, long *, unsigned char * +%typemap("rtypecheck") int *, long * %{ is.integer($arg) || is.numeric($arg) %} @@ -107,9 +108,8 @@ %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} - %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE & - %{ %} + %{ if (.hasSlot($input, "ref")) $input = slot($input,"ref") %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const @@ -141,7 +141,7 @@ long *, long &, long[ANY] - "$input = as.integer($input); "; + "$input = as.integer($input);"; %typemap(scoercein) char *, string, std::string, string &, std::string & @@ -159,19 +159,31 @@ %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} +#%typemap(scoerceout) SWIGTYPE +# %{ class($result) <- "$&R_class"; %} -%typemap(scoerceout) SWIGTYPE - %{ class($result) <- "$&R_class"; %} +#%typemap(scoerceout) SWIGTYPE & +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE & - %{ class($result) <- "$R_class"; %} +#%typemap(scoerceout) SWIGTYPE * +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE * - %{ class($result) <- "$R_class"; %} +#%typemap(scoerceout) SWIGTYPE *const +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE *const - %{ class($result) <- "$R_class"; %} + %typemap(scoerceout) SWIGTYPE + %{ $result <- new("$&R_class", ref=$result); %} + + %typemap(scoerceout) SWIGTYPE & + %{ $result <- new("$R_class", ref=$result) ; %} + + %typemap(scoerceout) SWIGTYPE * + %{ $result <- new("$R_class", ref=$result) ; %} + + %typemap(scoerceout) SWIGTYPE *const + %{ $result <- new("$R_class", ref=$result) ; %} + /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, @@ -208,8 +220,10 @@ signed long &, unsigned long, unsigned long &, - unsigned char *, - unsigned char & + signed char, + signed char &, + unsigned char, + unsigned char & %{ %} #if 0 Modified: trunk/Source/Modules/r.cxx =================================================================== --- trunk/Source/Modules/r.cxx 2012-08-12 15:16:40 UTC (rev 13600) +++ trunk/Source/Modules/r.cxx 2012-08-12 15:21:39 UTC (rev 13601) @@ -1891,6 +1891,9 @@ if(nargs == -1) nargs = getFunctionPointerNumArgs(p, tt); + Printv(sfun->code, "if (.hasSlot(", name, ", \"ref\")) {\n", + name, " = slot(", name, ", \"ref\");\n", + "}\n", NIL); String *snargs = NewStringf("%d", nargs); Printv(sfun->code, "if(is.function(", name, ")) {", "\n", "assert('...' %in% names(formals(", name, @@ -2112,7 +2115,8 @@ { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); - Printf(sfun->code, "reg.finalizer(ans, delete_%s)\n", finalizer); + Printf(sfun->code, "if (.hasSlot(ans, \"ref\")) {\n" + "reg.finalizer(ans@ref, delete_%s); }\n", finalizer); } Printf(sfun->code, "ans\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-13 21:41:17
|
Revision: 13606 http://swig.svn.sourceforge.net/swig/?rev=13606&view=rev Author: wsfulton Date: 2012-08-13 21:41:08 +0000 (Mon, 13 Aug 2012) Log Message: ----------- Add assumeoverride feature option for Java directors to improve performance when it can be assumed that all methods are overridden by the Java derived classes Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Java.html trunk/Examples/test-suite/common.mk trunk/Source/Modules/java.cxx Added Paths: ----------- trunk/Examples/test-suite/java/java_director_assumeoverride_runme.java trunk/Examples/test-suite/java_director_assumeoverride.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-13 16:22:30 UTC (rev 13605) +++ trunk/CHANGES.current 2012-08-13 21:41:08 UTC (rev 13606) @@ -5,6 +5,10 @@ Version 2.0.8 (in progress) =========================== +2012-08-13: wsfulton + [Java] Patch from David Baum to add the assumeoverride feature for Java directors to + improve performance when all overridden methods can be assumed to be overridden. + 2012-08-05: wsfulton [Python] #3530021 Fix unused variable warning. Modified: trunk/Doc/Manual/Java.html =================================================================== --- trunk/Doc/Manual/Java.html 2012-08-13 16:22:30 UTC (rev 13605) +++ trunk/Doc/Manual/Java.html 2012-08-13 21:41:08 UTC (rev 13606) @@ -86,6 +86,7 @@ <li><a href="#Java_directors_overhead">Overhead and code bloat</a> <li><a href="#Java_directors_example">Simple directors example</a> <li><a href="#Java_directors_threading">Director threading issues</a> +<li><a href="#Java_directors_performance">Director performance tuning</a> </ul> <li><a href="#Java_allprotected">Accessing protected members</a> <li><a href="#Java_common_customization">Common customization features</a> @@ -3525,6 +3526,27 @@ </pre> </div> +<H3><a name="Java_directors_performance"></a>24.5.6 Director performance tuning</H3> + +<p> +When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff. +</p> + +<p> +However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the <tt>assumeoverride</tt> attribute. For example: +</p> + +<div class="code"> +<pre> +%feature("director", assumeoverride=1) Foo; +</pre> +</div> + +<p> +The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical. +</p> + + <H2><a name="Java_allprotected"></a>24.6 Accessing protected members</H2> @@ -7862,4 +7884,3 @@ </body> </html> - Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2012-08-13 16:22:30 UTC (rev 13605) +++ trunk/Examples/test-suite/common.mk 2012-08-13 21:41:08 UTC (rev 13606) @@ -161,6 +161,7 @@ destructor_reprotected \ director_abstract \ director_alternating \ + director_assumeoverride \ director_basic \ director_binary_string \ director_classes \ Added: trunk/Examples/test-suite/java/java_director_assumeoverride_runme.java =================================================================== --- trunk/Examples/test-suite/java/java_director_assumeoverride_runme.java (rev 0) +++ trunk/Examples/test-suite/java/java_director_assumeoverride_runme.java 2012-08-13 21:41:08 UTC (rev 13606) @@ -0,0 +1,27 @@ + +import java_director_assumeoverride.*; + +public class java_director_assumeoverride_runme { + + static { + try { + System.loadLibrary("java_director_assumeoverride"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + static class MyOverrideMe extends OverrideMe { + } + + public static void main(String argv[]) { + OverrideMe overrideMe = new MyOverrideMe(); + + // MyOverrideMe doesn't actually override func(), but because assumeoverride + // was set to true, the C++ side will believe it was overridden. + if (!java_director_assumeoverride.isFuncOverridden(overrideMe)) { + throw new RuntimeException ( "isFuncOverridden()" ); + } + } +} Added: trunk/Examples/test-suite/java_director_assumeoverride.i =================================================================== --- trunk/Examples/test-suite/java_director_assumeoverride.i (rev 0) +++ trunk/Examples/test-suite/java_director_assumeoverride.i 2012-08-13 21:41:08 UTC (rev 13606) @@ -0,0 +1,30 @@ +%module(directors="1") java_director_assumeoverride +#pragma SWIG nowarn=SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR + +%{ +class OverrideMe { +public: + virtual ~OverrideMe() {} + virtual void func() {}; +}; + +#include "java_director_assumeoverride_wrap.h" +bool isFuncOverridden(OverrideMe* f) { + SwigDirector_OverrideMe* director = dynamic_cast<SwigDirector_OverrideMe*>(f); + if (!director) { + return false; + } + return director->swig_overrides(0); +} + +%} + +%feature("director", assumeoverride=1) OverrideMe; + +class OverrideMe { +public: + virtual ~OverrideMe(); + virtual void func(); +}; + +bool isFuncOverridden(OverrideMe* f); Modified: trunk/Source/Modules/java.cxx =================================================================== --- trunk/Source/Modules/java.cxx 2012-08-13 16:22:30 UTC (rev 13605) +++ trunk/Source/Modules/java.cxx 2012-08-13 21:41:08 UTC (rev 13606) @@ -4318,12 +4318,30 @@ Printf(w->code, " methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " if (!methods[i].base_methid) return;\n"); Printf(w->code, " }\n"); - Printf(w->code, " swig_override[i] = false;\n"); - Printf(w->code, " if (derived) {\n"); - Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); - Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); - Printf(w->code, " jenv->ExceptionClear();\n"); - Printf(w->code, " }\n"); + // Generally, derived classes have a mix of overridden and + // non-overridden methods and it is worth making a GetMethodID + // check during initialization to determine if each method is + // overridden, thus avoiding unnecessary calls into Java. + // + // On the other hand, when derived classes are + // expected to override all director methods then the + // GetMethodID calls are inefficient, and it is better to let + // the director unconditionally call up into Java. The resulting code + // will still behave correctly (though less efficiently) when Java + // code doesn't override a given method. + // + // The assumeoverride feature on a director controls whether or not + // overrides are assumed. + if (GetFlag(n, "feature:director:assumeoverride")) { + Printf(w->code, " swig_override[i] = derived;\n"); + } else { + Printf(w->code, " swig_override[i] = false;\n"); + Printf(w->code, " if (derived) {\n"); + Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); + Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); + Printf(w->code, " jenv->ExceptionClear();\n"); + Printf(w->code, " }\n"); + } Printf(w->code, "}\n"); } else { Printf(f_directors_h, "public:\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-15 07:49:04
|
Revision: 13608 http://swig.svn.sourceforge.net/swig/?rev=13608&view=rev Author: wsfulton Date: 2012-08-15 07:48:57 +0000 (Wed, 15 Aug 2012) Log Message: ----------- Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3 Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/python/pyhead.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-13 21:59:14 UTC (rev 13607) +++ trunk/CHANGES.current 2012-08-15 07:48:57 UTC (rev 13608) @@ -5,6 +5,9 @@ Version 2.0.8 (in progress) =========================== +2012-08-15: wsfulton + [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. + 2012-08-13: wsfulton [Java] Patch from David Baum to add the assumeoverride feature for Java directors to improve performance when all overridden methods can be assumed to be overridden. Modified: trunk/Lib/python/pyhead.swg =================================================================== --- trunk/Lib/python/pyhead.swg 2012-08-13 21:59:14 UTC (rev 13607) +++ trunk/Lib/python/pyhead.swg 2012-08-15 07:48:57 UTC (rev 13608) @@ -5,6 +5,7 @@ #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-15 22:36:21
|
Revision: 13619 http://swig.svn.sourceforge.net/swig/?rev=13619&view=rev Author: wsfulton Date: 2012-08-15 22:36:15 +0000 (Wed, 15 Aug 2012) Log Message: ----------- Add discard and add methods to std::set and std::multiset wrappers so that pyabc.i can be used ensuring MutableSet is a valid abstract base class Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/python/python_abstractbase_runme3.py trunk/Lib/python/std_set.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-15 22:35:24 UTC (rev 13618) +++ trunk/CHANGES.current 2012-08-15 22:36:15 UTC (rev 13619) @@ -6,6 +6,11 @@ =========================== 2012-08-15: wsfulton + [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring + MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. + Similarly for std::multiset. + +2012-08-15: wsfulton [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. 2012-08-13: wsfulton Modified: trunk/Examples/test-suite/python/python_abstractbase_runme3.py =================================================================== --- trunk/Examples/test-suite/python/python_abstractbase_runme3.py 2012-08-15 22:35:24 UTC (rev 13618) +++ trunk/Examples/test-suite/python/python_abstractbase_runme3.py 2012-08-15 22:36:15 UTC (rev 13619) @@ -10,3 +10,11 @@ assert issubclass(IntMultiset, MutableSet) assert issubclass(IntVector, MutableSequence) assert issubclass(IntList, MutableSequence) + +mapii = Mapii() +multimapii = Multimapii() +intset = IntSet() +intmultiset = IntMultiset() +intvector = IntVector() +intlist = IntList() + Modified: trunk/Lib/python/std_set.i =================================================================== --- trunk/Lib/python/std_set.i 2012-08-15 22:35:24 UTC (rev 13618) +++ trunk/Lib/python/std_set.i 2012-08-15 22:36:15 UTC (rev 13619) @@ -49,6 +49,14 @@ return *(swig::cgetpos(self, i)); } + void add(value_type x) { + self->insert(x); + } + + void discard(value_type x) { + self->erase(x); + } + }; %enddef This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-15 23:04:32
|
Revision: 13620 http://swig.svn.sourceforge.net/swig/?rev=13620&view=rev Author: wsfulton Date: 2012-08-15 23:04:26 +0000 (Wed, 15 Aug 2012) Log Message: ----------- Add some missing STL container typedefs for Perl Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/perl5/std_list.i trunk/Lib/perl5/std_vector.i trunk/Lib/std/_std_deque.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-15 22:36:15 UTC (rev 13619) +++ trunk/CHANGES.current 2012-08-15 23:04:26 UTC (rev 13620) @@ -6,6 +6,9 @@ =========================== 2012-08-15: wsfulton + [Perl] Add size_type, value_type, const_reference to the STL containers. + +2012-08-15: wsfulton [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. Similarly for std::multiset. Modified: trunk/Lib/perl5/std_list.i =================================================================== --- trunk/Lib/perl5/std_list.i 2012-08-15 22:36:15 UTC (rev 13619) +++ trunk/Lib/perl5/std_list.i 2012-08-15 23:04:26 UTC (rev 13620) @@ -188,6 +188,10 @@ } } public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; + list(); list(const list<T> &); @@ -337,6 +341,10 @@ } } public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; + list(); list(const list<T> &); Modified: trunk/Lib/perl5/std_vector.i =================================================================== --- trunk/Lib/perl5/std_vector.i 2012-08-15 22:36:15 UTC (rev 13619) +++ trunk/Lib/perl5/std_vector.i 2012-08-15 23:04:26 UTC (rev 13620) @@ -180,6 +180,9 @@ } } public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector<T> &); @@ -349,6 +352,9 @@ } } public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T *value); vector(const vector<T *> &); @@ -517,6 +523,9 @@ } } public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T value); vector(const vector<T> &); Modified: trunk/Lib/std/_std_deque.i =================================================================== --- trunk/Lib/std/_std_deque.i 2012-08-15 22:36:15 UTC (rev 13619) +++ trunk/Lib/std/_std_deque.i 2012-08-15 23:04:26 UTC (rev 13620) @@ -25,8 +25,13 @@ */ %define %std_deque_methods_noempty(T) - typedef T &reference; - typedef const T& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; deque(); deque(unsigned int size, const T& value=T()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-20 21:20:25
|
Revision: 13713 http://swig.svn.sourceforge.net/swig/?rev=13713&view=rev Author: wsfulton Date: 2012-08-20 21:20:19 +0000 (Mon, 20 Aug 2012) Log Message: ----------- Revert r13601 as it breaks older versions of R Revision Links: -------------- http://swig.svn.sourceforge.net/swig/?rev=13601&view=rev Modified Paths: -------------- trunk/Lib/r/rtype.swg trunk/Source/Modules/r.cxx Modified: trunk/Lib/r/rtype.swg =================================================================== --- trunk/Lib/r/rtype.swg 2012-08-20 21:14:24 UTC (rev 13712) +++ trunk/Lib/r/rtype.swg 2012-08-20 21:20:19 UTC (rev 13713) @@ -12,8 +12,6 @@ %apply int {unsigned int} %apply int {short} %apply int {unsigned short} -%apply int {signed char} -%apply int {unsigned char} %typemap("rtype") long, long *, long & "integer"; %apply long {long long} @@ -38,9 +36,10 @@ %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; -%typemap("rtypecheck") int, int &, long, long & +%typemap("rtypecheck") int, int &, long, long &, + unsigned char, unsigned char & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} -%typemap("rtypecheck") int *, long * +%typemap("rtypecheck") int *, long *, unsigned char * %{ is.integer($arg) || is.numeric($arg) %} @@ -108,8 +107,9 @@ %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} + %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE & - %{ if (.hasSlot($input, "ref")) $input = slot($input,"ref") %} + %{ %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const @@ -141,7 +141,7 @@ long *, long &, long[ANY] - "$input = as.integer($input);"; + "$input = as.integer($input); "; %typemap(scoercein) char *, string, std::string, string &, std::string & @@ -159,31 +159,19 @@ %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} -#%typemap(scoerceout) SWIGTYPE -# %{ class($result) <- "$&R_class"; %} -#%typemap(scoerceout) SWIGTYPE & -# %{ class($result) <- "$R_class"; %} +%typemap(scoerceout) SWIGTYPE + %{ class($result) <- "$&R_class"; %} -#%typemap(scoerceout) SWIGTYPE * -# %{ class($result) <- "$R_class"; %} +%typemap(scoerceout) SWIGTYPE & + %{ class($result) <- "$R_class"; %} -#%typemap(scoerceout) SWIGTYPE *const -# %{ class($result) <- "$R_class"; %} +%typemap(scoerceout) SWIGTYPE * + %{ class($result) <- "$R_class"; %} - %typemap(scoerceout) SWIGTYPE - %{ $result <- new("$&R_class", ref=$result); %} - - %typemap(scoerceout) SWIGTYPE & - %{ $result <- new("$R_class", ref=$result) ; %} - - %typemap(scoerceout) SWIGTYPE * - %{ $result <- new("$R_class", ref=$result) ; %} - - %typemap(scoerceout) SWIGTYPE *const - %{ $result <- new("$R_class", ref=$result) ; %} +%typemap(scoerceout) SWIGTYPE *const + %{ class($result) <- "$R_class"; %} - /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, @@ -220,10 +208,8 @@ signed long &, unsigned long, unsigned long &, - signed char, - signed char &, - unsigned char, - unsigned char & + unsigned char *, + unsigned char & %{ %} #if 0 Modified: trunk/Source/Modules/r.cxx =================================================================== --- trunk/Source/Modules/r.cxx 2012-08-20 21:14:24 UTC (rev 13712) +++ trunk/Source/Modules/r.cxx 2012-08-20 21:20:19 UTC (rev 13713) @@ -1891,9 +1891,6 @@ if(nargs == -1) nargs = getFunctionPointerNumArgs(p, tt); - Printv(sfun->code, "if (.hasSlot(", name, ", \"ref\")) {\n", - name, " = slot(", name, ", \"ref\");\n", - "}\n", NIL); String *snargs = NewStringf("%d", nargs); Printv(sfun->code, "if(is.function(", name, ")) {", "\n", "assert('...' %in% names(formals(", name, @@ -2115,8 +2112,7 @@ { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); - Printf(sfun->code, "if (.hasSlot(ans, \"ref\")) {\n" - "reg.finalizer(ans@ref, delete_%s); }\n", finalizer); + Printf(sfun->code, "reg.finalizer(ans, delete_%s)\n", finalizer); } Printf(sfun->code, "ans\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-20 21:21:31
|
Revision: 13714 http://swig.svn.sourceforge.net/swig/?rev=13714&view=rev Author: wsfulton Date: 2012-08-20 21:21:24 +0000 (Mon, 20 Aug 2012) Log Message: ----------- 2.0.8 release date added Modified Paths: -------------- trunk/ANNOUNCE trunk/CHANGES.current trunk/Doc/Manual/Sections.html trunk/README Modified: trunk/ANNOUNCE =================================================================== --- trunk/ANNOUNCE 2012-08-20 21:20:19 UTC (rev 13713) +++ trunk/ANNOUNCE 2012-08-20 21:21:24 UTC (rev 13714) @@ -1,4 +1,4 @@ -*** ANNOUNCE: SWIG 2.0.8 (in progress) *** +*** ANNOUNCE: SWIG 2.0.8 (20 August 2012) *** http://www.swig.org Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-20 21:20:19 UTC (rev 13713) +++ trunk/CHANGES.current 2012-08-20 21:21:24 UTC (rev 13714) @@ -2,8 +2,8 @@ See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. -Version 2.0.8 (in progress) -=========================== +Version 2.0.8 (20 August 2012) +============================== 2012-08-15: wsfulton [Perl] Add size_type, value_type, const_reference to the STL containers. Modified: trunk/Doc/Manual/Sections.html =================================================================== --- trunk/Doc/Manual/Sections.html 2012-08-20 21:20:19 UTC (rev 13713) +++ trunk/Doc/Manual/Sections.html 2012-08-20 21:21:24 UTC (rev 13714) @@ -6,7 +6,7 @@ <body bgcolor="#ffffff"> <H1><a name="Sections"></a>SWIG-2.0 Documentation</H1> -Last update : SWIG-2.0.8 (in progress) +Last update : SWIG-2.0.8 (20 August 2012) <H2>Sections</H2> Modified: trunk/README =================================================================== --- trunk/README 2012-08-20 21:20:19 UTC (rev 13713) +++ trunk/README 2012-08-20 21:21:24 UTC (rev 13714) @@ -1,6 +1,6 @@ SWIG (Simplified Wrapper and Interface Generator) -Version: 2.0.8 (in progress) +Version: 2.0.8 (20 August 2012) Tagline: SWIG is a compiler that integrates C and C++ with languages including Perl, Python, Tcl, Ruby, PHP, Java, Ocaml, Lua, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-08-21 22:11:18
|
Revision: 13718 http://swig.svn.sourceforge.net/swig/?rev=13718&view=rev Author: wsfulton Date: 2012-08-21 22:11:07 +0000 (Tue, 21 Aug 2012) Log Message: ----------- Bump version to 2.0.9 Modified Paths: -------------- trunk/ANNOUNCE trunk/CHANGES trunk/CHANGES.current trunk/Doc/Manual/Sections.html trunk/README trunk/configure.in Modified: trunk/ANNOUNCE =================================================================== --- trunk/ANNOUNCE 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/ANNOUNCE 2012-08-21 22:11:07 UTC (rev 13718) @@ -1,8 +1,8 @@ -*** ANNOUNCE: SWIG 2.0.8 (20 August 2012) *** +*** ANNOUNCE: SWIG 2.0.9 (in progress) *** http://www.swig.org -We're pleased to announce SWIG-2.0.8, the latest SWIG release. +We're pleased to announce SWIG-2.0.9, the latest SWIG release. What is SWIG? ============= @@ -21,11 +21,11 @@ ============ The release is available for download on Sourceforge at - http://prdownloads.sourceforge.net/swig/swig-2.0.8.tar.gz + http://prdownloads.sourceforge.net/swig/swig-2.0.9.tar.gz A Windows version is also available at - http://prdownloads.sourceforge.net/swig/swigwin-2.0.8.zip + http://prdownloads.sourceforge.net/swig/swigwin-2.0.9.zip Please report problems with this release to the swig-devel mailing list, details at http://www.swig.org/mail.html. Modified: trunk/CHANGES =================================================================== --- trunk/CHANGES 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/CHANGES 2012-08-21 22:11:07 UTC (rev 13718) @@ -3,6 +3,163 @@ See the CHANGES.current file for changes in the current version. See the RELEASENOTES file for a summary of changes in each release. +Version 2.0.8 (20 August 2012) +============================== + +2012-08-15: wsfulton + [Perl] Add size_type, value_type, const_reference to the STL containers. + +2012-08-15: wsfulton + [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring + MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. + Similarly for std::multiset. + +2012-08-15: wsfulton + [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. + +2012-08-13: wsfulton + [Java] Patch from David Baum to add the assumeoverride feature for Java directors to + improve performance when all overridden methods can be assumed to be overridden. + +2012-08-05: wsfulton + [Python] #3530021 Fix unused variable warning. + +2012-08-05: wsfulton + [C#] Fix #3536360 - Invalid code sometimes being generated for director methods + with many arguments. + +2012-08-05: wsfulton + [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using + Perl 5.16 and later. + +2012-08-04: wsfulton + Remove incorrect warning (314) about target language keywords which were triggered + by using declarations and using directives. For example 'string' is a keyword in C#: + namespace std { class string; } + using std::string; + +2012-07-21: wsfulton + Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. + +2012-07-21: wsfulton + Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window + rather than stdout. This fixes display problems in gdbtui and the ensures the output + appears where expected in other gdb based debuggers such as Eclipse CDT. + +2012-07-20: kwwette + [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). + +2012-07-02: wsfulton + Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced + in swig-2.0.5: + %include<stl.i> + using std::pair; + %template(StrPair) pair<std::string, std::string>; + +2012-07-02: wsfulton + Fix using declarations combined with using directives with forward class declarations so that + types are correctly found in scope for templates. Example: + + namespace Outer2 { + namespace Space2 { + template<typename T> class Thing2; + } + } + using namespace Outer2; + using Space2::Thing2; + template<typename T> class Thing2 {}; + // STILL BROKEN void useit2(Thing2<int> t) {} + void useit2a(Outer2::Space2::Thing2<int> t) {} + void useit2b(::Outer2::Space2::Thing2<int> t) {} + void useit2c(Space2::Thing2<int> t) {} + namespace Outer2 { + void useit2d(Space2::Thing2<int> t) {} + } + + %template(Thing2Int) Thing2<int>; + + +2012-06-30: wsfulton + Fix template namespace problems for symbols declared with a forward class declarations, such as: + + namespace Space1 { + namespace Space2 { + template<typename T> struct YYY; + } + template<typename T> struct Space2::YYY { + T yyy(T h) { + return h; + } + }; + void testYYY1(Space1::Space2::YYY<int> yy) {} + void testYYY2(Space2::YYY<int> yy) {} + void testYYY3(::Space1::Space2::YYY<int> yy) {} + } + + %template(YYYInt) Space1::Space2::YYY<int>; + +2012-06-30: wsfulton + Fix namespace problems for symbols declared with a forward class declarations, such as: + + namespace Space1 { + namespace Space2 { + struct XXX; + struct YYY; + } + + struct Space2::YYY {}; + struct Space1::Space2::XXX {}; + + void testXXX2(Space2::XXX xx) {} + void testYYY2(Space2::YYY yy) {} + } + + where xx and yy were not recognised as the proxy classes XXX and YYY. + +2012-06-30: wsfulton + Fix using declarations combined with using directives with forward class declarations so that + types are correctly found in scope. + + namespace Outer2 { + namespace Space2 { + class Thing2; + } + } + using namespace Outer2; + using Space2::Thing2; + class Thing2 {}; + // None of the methods below correctly used the Thing2 proxy class + void useit2(Thing2 t) {} + void useit2a(Outer2::Space2::Thing2 t) {} + void useit2b(::Outer2::Space2::Thing2 t) {} + void useit2c(Space2::Thing2 t) {} + namespace Outer2 { + void useit2d(Space2::Thing2 t) {} + } + +2012-06-25: wsfulton + Fix using declarations combined with using directives so that types are correctly found in scope. + Example: + + namespace Outer2 { + namespace Space2 { + class Thing2 {}; + } + } + using namespace Outer2; // using directive + using Space2::Thing2; // using declaration + void useit2(Thing2 t) {} + + Similarly for templated classes. + +2012-05-29: wsfulton + Fix #3529601 - seg fault when a protected method has the "director" + feature but the parent class does not. Also fix similar problems with + the allprotected feature. + +2012-05-28: wsfulton + Fix seg fault when attempting to warn about an illegal destructor - #3530055, 3530078 and #3530118. + Version 2.0.7 (26 May 2012) =========================== 2012-05-26: wsfulton Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/CHANGES.current 2012-08-21 22:11:07 UTC (rev 13718) @@ -2,160 +2,6 @@ See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. -Version 2.0.8 (20 August 2012) -============================== +Version 2.0.9 (in progress) +=========================== -2012-08-15: wsfulton - [Perl] Add size_type, value_type, const_reference to the STL containers. - -2012-08-15: wsfulton - [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring - MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. - Similarly for std::multiset. - -2012-08-15: wsfulton - [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. - -2012-08-13: wsfulton - [Java] Patch from David Baum to add the assumeoverride feature for Java directors to - improve performance when all overridden methods can be assumed to be overridden. - -2012-08-05: wsfulton - [Python] #3530021 Fix unused variable warning. - -2012-08-05: wsfulton - [C#] Fix #3536360 - Invalid code sometimes being generated for director methods - with many arguments. - -2012-08-05: wsfulton - [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using - Perl 5.16 and later. - -2012-08-04: wsfulton - Remove incorrect warning (314) about target language keywords which were triggered - by using declarations and using directives. For example 'string' is a keyword in C#: - namespace std { class string; } - using std::string; - -2012-07-21: wsfulton - Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. - -2012-07-21: wsfulton - Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window - rather than stdout. This fixes display problems in gdbtui and the ensures the output - appears where expected in other gdb based debuggers such as Eclipse CDT. - -2012-07-20: kwwette - [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). - -2012-07-02: wsfulton - Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced - in swig-2.0.5: - %include<stl.i> - using std::pair; - %template(StrPair) pair<std::string, std::string>; - -2012-07-02: wsfulton - Fix using declarations combined with using directives with forward class declarations so that - types are correctly found in scope for templates. Example: - - namespace Outer2 { - namespace Space2 { - template<typename T> class Thing2; - } - } - using namespace Outer2; - using Space2::Thing2; - template<typename T> class Thing2 {}; - // STILL BROKEN void useit2(Thing2<int> t) {} - void useit2a(Outer2::Space2::Thing2<int> t) {} - void useit2b(::Outer2::Space2::Thing2<int> t) {} - void useit2c(Space2::Thing2<int> t) {} - namespace Outer2 { - void useit2d(Space2::Thing2<int> t) {} - } - - %template(Thing2Int) Thing2<int>; - - -2012-06-30: wsfulton - Fix template namespace problems for symbols declared with a forward class declarations, such as: - - namespace Space1 { - namespace Space2 { - template<typename T> struct YYY; - } - template<typename T> struct Space2::YYY { - T yyy(T h) { - return h; - } - }; - void testYYY1(Space1::Space2::YYY<int> yy) {} - void testYYY2(Space2::YYY<int> yy) {} - void testYYY3(::Space1::Space2::YYY<int> yy) {} - } - - %template(YYYInt) Space1::Space2::YYY<int>; - -2012-06-30: wsfulton - Fix namespace problems for symbols declared with a forward class declarations, such as: - - namespace Space1 { - namespace Space2 { - struct XXX; - struct YYY; - } - - struct Space2::YYY {}; - struct Space1::Space2::XXX {}; - - void testXXX2(Space2::XXX xx) {} - void testYYY2(Space2::YYY yy) {} - } - - where xx and yy were not recognised as the proxy classes XXX and YYY. - -2012-06-30: wsfulton - Fix using declarations combined with using directives with forward class declarations so that - types are correctly found in scope. - - namespace Outer2 { - namespace Space2 { - class Thing2; - } - } - using namespace Outer2; - using Space2::Thing2; - class Thing2 {}; - // None of the methods below correctly used the Thing2 proxy class - void useit2(Thing2 t) {} - void useit2a(Outer2::Space2::Thing2 t) {} - void useit2b(::Outer2::Space2::Thing2 t) {} - void useit2c(Space2::Thing2 t) {} - namespace Outer2 { - void useit2d(Space2::Thing2 t) {} - } - -2012-06-25: wsfulton - Fix using declarations combined with using directives so that types are correctly found in scope. - Example: - - namespace Outer2 { - namespace Space2 { - class Thing2 {}; - } - } - using namespace Outer2; // using directive - using Space2::Thing2; // using declaration - void useit2(Thing2 t) {} - - Similarly for templated classes. - -2012-05-29: wsfulton - Fix #3529601 - seg fault when a protected method has the "director" - feature but the parent class does not. Also fix similar problems with - the allprotected feature. - -2012-05-28: wsfulton - Fix seg fault when attempting to warn about an illegal destructor - #3530055, 3530078 and #3530118. - Modified: trunk/Doc/Manual/Sections.html =================================================================== --- trunk/Doc/Manual/Sections.html 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/Doc/Manual/Sections.html 2012-08-21 22:11:07 UTC (rev 13718) @@ -6,7 +6,7 @@ <body bgcolor="#ffffff"> <H1><a name="Sections"></a>SWIG-2.0 Documentation</H1> -Last update : SWIG-2.0.8 (20 August 2012) +Last update : SWIG-2.0.9 (in progress) <H2>Sections</H2> Modified: trunk/README =================================================================== --- trunk/README 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/README 2012-08-21 22:11:07 UTC (rev 13718) @@ -1,6 +1,6 @@ SWIG (Simplified Wrapper and Interface Generator) -Version: 2.0.8 (20 August 2012) +Version: 2.0.9 (in progress) Tagline: SWIG is a compiler that integrates C and C++ with languages including Perl, Python, Tcl, Ruby, PHP, Java, Ocaml, Lua, Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2012-08-21 13:29:58 UTC (rev 13717) +++ trunk/configure.in 2012-08-21 22:11:07 UTC (rev 13718) @@ -2,7 +2,7 @@ dnl The macros which aren't shipped with the autotools are stored in the dnl Tools/config directory in .m4 files. -AC_INIT([swig],[2.0.8],[http://www.swig.org]) +AC_INIT([swig],[2.0.9],[http://www.swig.org]) dnl NB: When this requirement is increased to 2.60 or later, AC_PROG_SED dnl definition below can be removed This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dr...@us...> - 2012-08-26 03:35:10
|
Revision: 13721 http://swig.svn.sourceforge.net/swig/?rev=13721&view=rev Author: drjoe Date: 2012-08-26 03:35:04 +0000 (Sun, 26 Aug 2012) Log Message: ----------- make ExternalReference slot ref to contain reference Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/r/rtype.swg trunk/Source/Modules/r.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-08-26 02:09:53 UTC (rev 13720) +++ trunk/CHANGES.current 2012-08-26 03:35:04 UTC (rev 13721) @@ -4,4 +4,8 @@ Version 2.0.9 (in progress) =========================== +2012-08-26: drjoe + [R] make ExternalReference slot ref to contain reference +2012-08-26: drjoe + [R] fix Examples/Makefile to use C in $(CC) rather than $(CXX) Modified: trunk/Lib/r/rtype.swg =================================================================== --- trunk/Lib/r/rtype.swg 2012-08-26 02:09:53 UTC (rev 13720) +++ trunk/Lib/r/rtype.swg 2012-08-26 03:35:04 UTC (rev 13721) @@ -4,24 +4,9 @@ */ %typemap("rtype") int, int *, int & "integer"; -%apply int {size_t} -%apply int {std::size_t} -%apply int {ptrdiff_t} -%apply int {std::ptrdiff_t} -%apply int {signed int} -%apply int {unsigned int} -%apply int {short} -%apply int {unsigned short} - %typemap("rtype") long, long *, long & "integer"; -%apply long {long long} -%apply long {signed long long} -%apply long {unsigned long long} -%apply long {signed long} -%apply long {unsigned long} - +%typemap("rtype") float, float*, float & "numeric"; %typemap("rtype") double, double*, double & "numeric"; -%typemap("rtype") float, float *, float & "numeric"; %typemap("rtype") char *, char ** "character"; %typemap("rtype") char "character"; %typemap("rtype") string, string *, string & "character"; @@ -36,16 +21,15 @@ %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; -%typemap("rtypecheck") int, int &, long, long &, - unsigned char, unsigned char & +%typemap("rtypecheck") int, int &, long, long & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} -%typemap("rtypecheck") int *, long *, unsigned char * +%typemap("rtypecheck") int *, long * %{ is.integer($arg) || is.numeric($arg) %} -%typemap("rtypecheck") double, double &, float, float & +%typemap("rtypecheck") float, double %{ is.numeric($arg) && length($arg) == 1 %} -%typemap("rtypecheck") double*, float * +%typemap("rtypecheck") float *, double * %{ is.numeric($arg) %} %typemap("rtypecheck") bool, bool & @@ -88,10 +72,9 @@ %{ $input = as.integer($input); %} %typemap(scoercein) long, long *, long & %{ $input = as.integer($input); %} -%typemap(scoercein) double, double *, double & +%typemap(scoercein) float, float*, float &, + double, double *, double & %{ %} -%typemap(scoercein) float, float *, float & - %{ %} %typemap(scoercein) char, char *, char & %{ $input = as($input, "character"); %} %typemap(scoercein) string, string *, string & @@ -107,9 +90,8 @@ %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} - %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE & - %{ %} + %{ $input = slot($input,"ref") %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const @@ -136,12 +118,10 @@ %typemap(scoercein) int, int *, int &, - int[ANY], long, long *, - long &, - long[ANY] - "$input = as.integer($input); "; + long & + "$input = as.integer($input);"; %typemap(scoercein) char *, string, std::string, string &, std::string & @@ -159,27 +139,41 @@ %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} +#%typemap(scoerceout) SWIGTYPE +# %{ class($result) <- "$&R_class"; %} -%typemap(scoerceout) SWIGTYPE - %{ class($result) <- "$&R_class"; %} +#%typemap(scoerceout) SWIGTYPE & +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE & - %{ class($result) <- "$R_class"; %} +#%typemap(scoerceout) SWIGTYPE * +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE * - %{ class($result) <- "$R_class"; %} +#%typemap(scoerceout) SWIGTYPE *const +# %{ class($result) <- "$R_class"; %} -%typemap(scoerceout) SWIGTYPE *const - %{ class($result) <- "$R_class"; %} + %typemap(scoerceout) SWIGTYPE + %{ $result <- new("$&R_class", ref=$result); %} + + %typemap(scoerceout) SWIGTYPE & + %{ $result <- new("$R_class", ref=$result) ; %} + + %typemap(scoerceout) SWIGTYPE * + %{ $result <- new("$R_class", ref=$result) ; %} + + %typemap(scoerceout) SWIGTYPE *const + %{ $result <- new("$R_class", ref=$result) ; %} + /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, char &, - double, - double &, float, + double, + float*, + double*, float &, + double &, int, int &, long, @@ -208,10 +202,94 @@ signed long &, unsigned long, unsigned long &, - unsigned char *, - unsigned char & + signed char, + signed char &, + unsigned char, + unsigned char & %{ %} +%apply int {size_t, +std::size_t, +ptrdiff_t, +std::ptrdiff_t, +signed int, +unsigned int, +short, +unsigned short, +signed char, +unsigned char} + +%apply int* {size_t[], +std::size_t[], +ptrdiff_t[], +std::ptrdiff_t[], +signed int[], +unsigned int[], +short[], +unsigned short[], +signed char[], +unsigned char[]} + +%apply int* {size_t[ANY], +std::size_t[ANY], +ptrdiff_t[ANY], +std::ptrdiff_t[ANY], +signed int[ANY], +unsigned int[ANY], +short[ANY], +unsigned short[ANY], +signed char[ANY], +unsigned char[ANY]} + +%apply int* {size_t*, +std::size_t*, +ptrdiff_t*, +std::ptrdiff_t*, +signed int*, +unsigned int*, +short*, +unsigned short*, +signed char*, +unsigned char*} + +%apply long { + long long, + signed long long, + unsigned long long, + signed long, + unsigned long} + +%apply long* { + long long*, + signed long long*, + unsigned long long*, + signed long*, + unsigned long*, + long long[], + signed long long[], + unsigned long long[], + signed long[], + unsigned long[], + long long[ANY], + signed long long[ANY], + unsigned long long[ANY], + signed long[ANY], + unsigned long[ANY]} + +%apply float* { + float[], + float[ANY] +} +%apply double * { + double[], + double[ANY] +} + +%apply bool* { + bool[], + bool[ANY] +} + #if 0 Just examining the values for a SWIGTYPE. Modified: trunk/Source/Modules/r.cxx =================================================================== --- trunk/Source/Modules/r.cxx 2012-08-26 02:09:53 UTC (rev 13720) +++ trunk/Source/Modules/r.cxx 2012-08-26 03:35:04 UTC (rev 13721) @@ -1903,6 +1903,8 @@ "\n};\n", "if(is(", name, ", \"NativeSymbolInfo\")) {\n", name, " = ", name, "$address", ";\n}\n", + "if(is(", name, ", \"ExternalReference\")) {\n", + name, " = ", name, "@ref;\n}\n", "}; \n", NIL); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-09-07 06:03:27
|
Revision: 13734 http://swig.svn.sourceforge.net/swig/?rev=13734&view=rev Author: wsfulton Date: 2012-09-07 06:03:20 +0000 (Fri, 07 Sep 2012) Log Message: ----------- Move contributors to COPYRIGHT file. Modified Paths: -------------- trunk/COPYRIGHT trunk/Lib/chicken/typemaps.i trunk/Lib/mzscheme/mzrun.swg Modified: trunk/COPYRIGHT =================================================================== --- trunk/COPYRIGHT 2012-09-06 20:56:19 UTC (rev 13733) +++ trunk/COPYRIGHT 2012-09-07 06:03:20 UTC (rev 13734) @@ -65,7 +65,7 @@ James Michael DuPont, Clark McGrew, Dustin Mitchell, Ian Cooke, Catalin Dumitrescu, Baran Kovuk, Oleg Tolmatcev, Tal Shalif, Lluis Padro, Chris Seatory, Igor Bely, Robin Dunn, Edward Zimmermann, David Ascher, Dominique Dumont, Pier Giorgio Esposito, Hasan Baran Kovuk, - Klaus Wiederänders, Richard Beare + Klaus Wiederänders, Richard Beare, Hans Oesterholt. (See CHANGES and CHANGES.current and the bug tracker for a more complete list). Past students: Modified: trunk/Lib/chicken/typemaps.i =================================================================== --- trunk/Lib/chicken/typemaps.i 2012-09-06 20:56:19 UTC (rev 13733) +++ trunk/Lib/chicken/typemaps.i 2012-09-07 06:03:20 UTC (rev 13734) @@ -93,7 +93,6 @@ */ -// These typemaps contributed by Robin Dunn //---------------------------------------------------------------------- // // T_OUTPUT typemap (and helper function) to return multiple argouts as Modified: trunk/Lib/mzscheme/mzrun.swg =================================================================== --- trunk/Lib/mzscheme/mzrun.swg 2012-09-06 20:56:19 UTC (rev 13733) +++ trunk/Lib/mzscheme/mzrun.swg 2012-09-07 06:03:20 UTC (rev 13734) @@ -91,7 +91,6 @@ /* ----------------------------------------------------------------------- * mzscheme 30X support code - * Contributed by Hans Oesterholt * ----------------------------------------------------------------------- */ #ifndef SCHEME_STR_VAL @@ -252,10 +251,6 @@ return new_type; } -/*** DLOPEN PATCH ****************************************************** - * Contributed by Hans Oesterholt-Dijkema (jan. 2006) - ***********************************************************************/ - #if defined(_WIN32) || defined(__WIN32__) #define __OS_WIN32 #endif @@ -442,10 +437,6 @@ } } -/*** DLOPEN PATCH ****************************************************** - * Contributed by Hans Oesterholt-Dijkema (jan. 2006) - ***********************************************************************/ - /* The interpreter will store a pointer to this structure in a global variable called swig-runtime-data-type-pointer. The instance of this struct is only used if no other module has yet been loaded */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-09-07 06:07:29
|
Revision: 13736 http://swig.svn.sourceforge.net/swig/?rev=13736&view=rev Author: wsfulton Date: 2012-09-07 06:07:20 +0000 (Fri, 07 Sep 2012) Log Message: ----------- Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/director_binary_string.i trunk/Examples/test-suite/java/director_binary_string_runme.java trunk/Lib/java/java.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-09-07 06:06:00 UTC (rev 13735) +++ trunk/CHANGES.current 2012-09-07 06:07:20 UTC (rev 13736) @@ -4,6 +4,9 @@ Version 2.0.9 (in progress) =========================== +2012-09-06: wsfulton + [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. + 2012-08-26: drjoe [R] make ExternalReference slot ref to contain reference Modified: trunk/Examples/test-suite/director_binary_string.i =================================================================== --- trunk/Examples/test-suite/director_binary_string.i 2012-09-07 06:06:00 UTC (rev 13735) +++ trunk/Examples/test-suite/director_binary_string.i 2012-09-07 06:07:20 UTC (rev 13736) @@ -15,8 +15,10 @@ public: virtual ~Callback() {} virtual void run(char* dataBufferAA, int sizeAA, char* dataBufferBB, int sizeBB) { - memset(dataBufferAA, -1, sizeAA); - memset(dataBufferBB, -1, sizeBB); + if (dataBufferAA) + memset(dataBufferAA, -1, sizeAA); + if (dataBufferBB) + memset(dataBufferBB, -1, sizeBB); } }; @@ -45,6 +47,9 @@ } return sum; } + void call_null() { + _callback->run(NULL, 0, NULL, 0); + } }; %} Modified: trunk/Examples/test-suite/java/director_binary_string_runme.java =================================================================== --- trunk/Examples/test-suite/java/director_binary_string_runme.java 2012-09-07 06:06:00 UTC (rev 13735) +++ trunk/Examples/test-suite/java/director_binary_string_runme.java 2012-09-07 06:07:20 UTC (rev 13736) @@ -21,6 +21,11 @@ if (sum != 9*2*8 + 13*3*5) throw new RuntimeException("Unexpected sum: " + sum); + + new Callback().run(null, null); + callback = new DirectorBinaryStringCallback(); + caller.setCallback(callback); + caller.call_null(); } } @@ -32,11 +37,13 @@ @Override public void run(byte[] dataBufferAA, byte[] dataBufferBB) { - for (int i = 0; i < dataBufferAA.length; i++) - dataBufferAA[i] = (byte)(dataBufferAA[i] * 2); + if (dataBufferAA != null) + for (int i = 0; i < dataBufferAA.length; i++) + dataBufferAA[i] = (byte)(dataBufferAA[i] * 2); - for (int i = 0; i < dataBufferBB.length; i++) - dataBufferBB[i] = (byte)(dataBufferBB[i] * 3); + if (dataBufferBB != null) + for (int i = 0; i < dataBufferBB.length; i++) + dataBufferBB[i] = (byte)(dataBufferBB[i] * 3); } } Modified: trunk/Lib/java/java.swg =================================================================== --- trunk/Lib/java/java.swg 2012-09-07 06:06:00 UTC (rev 13735) +++ trunk/Lib/java/java.swg 2012-09-07 06:07:20 UTC (rev 13736) @@ -1301,11 +1301,16 @@ %typemap(javain) (char *STRING, size_t LENGTH) "$javainput" %typemap(freearg) (char *STRING, size_t LENGTH) "" %typemap(in) (char *STRING, size_t LENGTH) { + if ($input) { $1 = (char *) JCALL2(GetByteArrayElements, jenv, $input, 0); - $2 = (size_t) JCALL1(GetArrayLength, jenv, $input); + $2 = (size_t) JCALL1(GetArrayLength, jenv, $input); + } else { + $1 = 0; + $2 = 0; + } } %typemap(argout) (char *STRING, size_t LENGTH) { - JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); + if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); } %typemap(directorin, descriptor="[B") (char *STRING, size_t LENGTH) { jbyteArray jb = (jenv)->NewByteArray($2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-09-13 19:02:11
|
Revision: 13834 http://swig.svn.sourceforge.net/swig/?rev=13834&view=rev Author: wsfulton Date: 2012-09-13 19:02:02 +0000 (Thu, 13 Sep 2012) Log Message: ----------- Apply patch for Java to fix direct use of a weak global reference in directors sometimes causing seg faults especially on Android. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/android/extend/src/org/swig/extendexample/SwigExtend.java trunk/Lib/java/director.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-09-13 18:55:52 UTC (rev 13833) +++ trunk/CHANGES.current 2012-09-13 19:02:02 UTC (rev 13834) @@ -4,6 +4,10 @@ Version 2.0.9 (in progress) =========================== +2012-09-11: wsfulton + [Java] Fix #3535304 - Direct use of a weak global reference in directors + sometimes causing seg faults especially on Android. + 2012-09-06: wsfulton [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. Modified: trunk/Examples/android/extend/src/org/swig/extendexample/SwigExtend.java =================================================================== --- trunk/Examples/android/extend/src/org/swig/extendexample/SwigExtend.java 2012-09-13 18:55:52 UTC (rev 13833) +++ trunk/Examples/android/extend/src/org/swig/extendexample/SwigExtend.java 2012-09-13 19:02:02 UTC (rev 13834) @@ -118,9 +118,7 @@ // Time to delete the EmployeeList, which will delete all the Employee* // items it contains. The last item is our CEO, which gets destroyed as well. - /* Causes app to die list.delete(); - */ outputText.append( "----------------------\n" ); } Modified: trunk/Lib/java/director.swg =================================================================== --- trunk/Lib/java/director.swg 2012-09-13 18:55:52 UTC (rev 13833) +++ trunk/Lib/java/director.swg 2012-09-13 19:02:02 UTC (rev 13834) @@ -149,7 +149,7 @@ void swig_disconnect_director_self(const char *disconn_method) { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; - jobject jobj = swig_self_.peek(); + jobject jobj = swig_self_.get(jenv); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; #endif @@ -162,6 +162,7 @@ jenv->CallVoidMethod(jobj, disconn_meth); } } + jenv->DeleteLocalRef(jobj); } public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-09-13 19:03:30
|
Revision: 13835 http://swig.svn.sourceforge.net/swig/?rev=13835&view=rev Author: wsfulton Date: 2012-09-13 19:03:24 +0000 (Thu, 13 Sep 2012) Log Message: ----------- Android docs on examples update and cosmetic change to Android extend example. Modified Paths: -------------- trunk/Doc/Manual/Android.html trunk/Doc/Manual/Contents.html trunk/Examples/android/extend/jni/Application.mk Modified: trunk/Doc/Manual/Android.html =================================================================== --- trunk/Doc/Manual/Android.html 2012-09-13 19:02:02 UTC (rev 13834) +++ trunk/Doc/Manual/Android.html 2012-09-13 19:03:24 UTC (rev 13835) @@ -15,6 +15,7 @@ <li><a href="#Android_examples_intro">Examples introduction</a> <li><a href="#Android_example_simple">Simple C example</a> <li><a href="#Android_example_class">C++ class example</a> +<li><a href="#Android_examples_other">Other examples</a> </ul> </ul> </div> @@ -744,6 +745,13 @@ <center><img src="android-class.png" alt="Android screenshot of SwigClass example"></center> +<H3><a name="Android_examples_other"></a>18.2.4 Other examples</H3> + + +<p> +The Examples/android directory contains further examples which can be run and installed in a similar manner to the previous two examples. +</p> + </body> </html> Modified: trunk/Doc/Manual/Contents.html =================================================================== --- trunk/Doc/Manual/Contents.html 2012-09-13 19:02:02 UTC (rev 13834) +++ trunk/Doc/Manual/Contents.html 2012-09-13 19:03:24 UTC (rev 13835) @@ -645,6 +645,7 @@ <li><a href="Android.html#Android_examples_intro">Examples introduction</a> <li><a href="Android.html#Android_example_simple">Simple C example</a> <li><a href="Android.html#Android_example_class">C++ class example</a> +<li><a href="Android.html#Android_examples_other">Other examples</a> </ul> </ul> </div> Modified: trunk/Examples/android/extend/jni/Application.mk =================================================================== --- trunk/Examples/android/extend/jni/Application.mk 2012-09-13 19:02:02 UTC (rev 13834) +++ trunk/Examples/android/extend/jni/Application.mk 2012-09-13 19:03:24 UTC (rev 13835) @@ -1 +1,2 @@ +# File: Application.mk APP_STL := gnustl_static This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-09-14 22:25:41
|
Revision: 13840 http://swig.svn.sourceforge.net/swig/?rev=13840&view=rev Author: wsfulton Date: 2012-09-14 22:25:35 +0000 (Fri, 14 Sep 2012) Log Message: ----------- Add new warning if an empty template declaration is used on a base class, minor docs improvement for empty template declarations. Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/SWIGPlus.html trunk/Examples/test-suite/errors/cpp_inherit.i trunk/Examples/test-suite/errors/expected.log trunk/Source/Modules/lang.cxx trunk/Source/Modules/typepass.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/CHANGES.current 2012-09-14 22:25:35 UTC (rev 13840) @@ -4,6 +4,19 @@ Version 2.0.9 (in progress) =========================== +2012-09-14: wsfulton + Add new warning if the empty template instantiation is used as a base class, for example: + + template <typename T> class Base {}; + %template() Base<int>; + class Derived : public Base<int> {}; + + gives the following warning instead of silently ignoring the base: + + cpp_inherit.i:52: Warning 401: Base class 'Base< int >' has no name as it is an empty template instantiated with '%template()'. Ignored. + cpp_inherit.i:51: Warning 401: The %template directive must be written before 'Base< int >' is used as a base class and be declared with a name. + + 2012-09-11: wsfulton [Java] Fix #3535304 - Direct use of a weak global reference in directors sometimes causing seg faults especially on Android. Modified: trunk/Doc/Manual/SWIGPlus.html =================================================================== --- trunk/Doc/Manual/SWIGPlus.html 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/Doc/Manual/SWIGPlus.html 2012-09-14 22:25:35 UTC (rev 13840) @@ -3121,8 +3121,8 @@ <div class="shell"> <pre> -example.h:42. Nothing known about class 'List<int >' (ignored). -example.h:42. Maybe you forgot to instantiate 'List<int >' using %template. +example.h:42: Warning 401. Nothing known about class 'List<int >'. Ignored. +example.h:42: Warning 401. Maybe you forgot to instantiate 'List<int >' using %template. </pre> </div> @@ -3163,7 +3163,7 @@ Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply -use <tt>%template</tt> with no name. For example: +use the empty template instantiation, that is, <tt>%template</tt> with no name. For example: </p> <div class="code"> Modified: trunk/Examples/test-suite/errors/cpp_inherit.i =================================================================== --- trunk/Examples/test-suite/errors/cpp_inherit.i 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/Examples/test-suite/errors/cpp_inherit.i 2012-09-14 22:25:35 UTC (rev 13840) @@ -45,3 +45,11 @@ { }; %} + + +template <typename T> class Base {}; +%template() Base<int>; +class Derived : public Base<int> {}; +class Derived2 : public Base<double> {}; +%template(BaseDouble) Base<double>; + Modified: trunk/Examples/test-suite/errors/expected.log =================================================================== --- trunk/Examples/test-suite/errors/expected.log 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/Examples/test-suite/errors/expected.log 2012-09-14 22:25:35 UTC (rev 13840) @@ -268,6 +268,10 @@ cpp_inherit.i:26: Warning 401: Nothing known about base class 'A7< int >'. Ignored. cpp_inherit.i:26: Warning 401: Maybe you forgot to instantiate 'A7< int >' using %template. cpp_inherit.i:45: Warning 323: Recursive scope inheritance of 'Recursive'. +cpp_inherit.i:52: Warning 401: Base class 'Base< int >' has no name as it is an empty template instantiated with '%template()'. Ignored. +cpp_inherit.i:51: Warning 401: The %template directive must be written before 'Base< int >' is used as a base class and be declared with a name. +cpp_inherit.i:53: Warning 401: Base class 'Base< double >' undefined. +cpp_inherit.i:54: Warning 401: 'Base< double >' must be defined before it is used as a base class. :::::::::::::::::::::::::::::::: cpp_macro_locator.i ::::::::::::::::::::::::::::::::::: cpp_macro_locator.i:66: Warning 204: CPP #warning, "inline warning message one". Modified: trunk/Source/Modules/lang.cxx =================================================================== --- trunk/Source/Modules/lang.cxx 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/Source/Modules/lang.cxx 2012-09-14 22:25:35 UTC (rev 13840) @@ -965,7 +965,7 @@ DohIncref(type); Setattr(n, "type", ty); if (GetFlag(n, "feature:onlychildren") && !GetFlag(n, "feature:ignore")) { - // Found an unignored templated method that has a an empty template instantiation (%template()) + // Found an unignored templated method that has an empty template instantiation (%template()) // Ignore it unless it has been %rename'd if (Strncmp(symname, "__dummy_", 8) == 0) { SetFlag(n, "feature:ignore"); Modified: trunk/Source/Modules/typepass.cxx =================================================================== --- trunk/Source/Modules/typepass.cxx 2012-09-13 20:15:03 UTC (rev 13839) +++ trunk/Source/Modules/typepass.cxx 2012-09-14 22:25:35 UTC (rev 13840) @@ -185,9 +185,14 @@ bcls = 0; } else { if (Getattr(bcls, "typepass:visit")) { - if (!ilist) - ilist = alist = NewList(); - Append(ilist, bcls); + if (!Getattr(bcls, "feature:onlychildren")) { + if (!ilist) + ilist = alist = NewList(); + Append(ilist, bcls); + } else { + Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); + Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); + } } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' undefined.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "'%s' must be defined before it is used as a base class.\n", SwigType_namestr(bname)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ian...@us...> - 2012-10-05 04:58:07
|
Revision: 13864 http://swig.svn.sourceforge.net/swig/?rev=13864&view=rev Author: ianlancetaylor Date: 2012-10-05 04:58:00 +0000 (Fri, 05 Oct 2012) Log Message: ----------- Adjust for change in the size of the Go type int. Until some time in the future, require a -intgosize option when invoking SWIG. Otherwise there is no reliable way for us to know the size of int, and we need to know. Modified Paths: -------------- trunk/Doc/Manual/Go.html trunk/Examples/Makefile.in trunk/Lib/go/goruntime.swg trunk/Source/Modules/go.cxx trunk/configure.in Modified: trunk/Doc/Manual/Go.html =================================================================== --- trunk/Doc/Manual/Go.html 2012-10-04 20:52:51 UTC (rev 13863) +++ trunk/Doc/Manual/Go.html 2012-10-05 04:58:00 UTC (rev 13864) @@ -94,6 +94,18 @@ </tr> <tr> +<td>-intgo-type-size %lt;s%gt;</td> +<td>Set the size for the Go type <tt>int</tt>. This controls the size + that the C/C++ code expects to see. The %lt;s%gt; argument should + be 32 or 64. This option is currently required during the + transition from Go 1.0 to Go 1.1, as the size of <tt>int</tt> on + 64-bit x86 systems changes between those releases (from 32 bits to + 64 bits). In the future the option may become optional, and SWIG + will assume that the size of <tt>int</tt> is the size of a C + pointer.</td> +</tr> + +<tr> <td>-gccgo</td> <td>Generate code for gccgo. The default is to generate code for 6g/8g/5g.</td> Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2012-10-04 20:52:51 UTC (rev 13863) +++ trunk/Examples/Makefile.in 2012-10-05 04:58:00 UTC (rev 13864) @@ -1169,6 +1169,7 @@ GOGCC = @GOGCC@ GO1 = @GO1@ GOC = @GOC@ +GOOPT = @GOOPT@ GOSWIGARG = `if $(GOGCC) ; then echo -gccgo; fi` GOCOMPILEARG = `if $(GOGCC) ; then echo -c -g; elif $(GO1) ; then echo tool $(GOC:c=g) ; fi` @@ -1191,7 +1192,7 @@ # ---------------------------------------------------------------- go: $(SRCS) - $(SWIG) -go $(GOSWIGARG) $(SWIGOPT) $(INTERFACEPATH) + $(SWIG) -go $(GOOPT) $(GOSWIGARG) $(SWIGOPT) $(INTERFACEPATH) $(CC) -g -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(SO) $(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(GOSRCS) @@ -1205,7 +1206,7 @@ # ---------------------------------------------------------------- go_cpp: $(SRCS) - $(SWIG) -go -c++ $(GOSWIGARG) $(SWIGOPT) $(INTERFACEPATH) + $(SWIG) -go -c++ $(GOOPT) $(GOSWIGARG) $(SWIGOPT) $(INTERFACEPATH) $(CXX) -g -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(SO) $(COMPILETOOL) $(GO) $(GOCOMPILEARG) -I . $(GOSRCS) Modified: trunk/Lib/go/goruntime.swg =================================================================== --- trunk/Lib/go/goruntime.swg 2012-10-04 20:52:51 UTC (rev 13863) +++ trunk/Lib/go/goruntime.swg 2012-10-05 04:58:00 UTC (rev 13864) @@ -5,15 +5,35 @@ * ------------------------------------------------------------ */ %insert(runtime) %{ +#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/types.h> -typedef struct { char *p; int n; } _gostring_; -typedef struct { void* array; unsigned int len; unsigned int cap; } _goslice_; +%} +#if SWIGGO_INTGO_SIZE == 32 +%insert(runtime) %{ +typedef int intgo; %} +#elif SWIGGO_INTGO_SIZE == 64 +%insert(runtime) %{ +typedef long long intgo; +%} +#else +%insert(runtime) %{ +typedef ptrdiff_t intgo; +%} +#endif +%insert(runtime) %{ + +typedef struct { char *p; intgo n; } _gostring_; +typedef struct { void* array; intgo len; intgo cap; } _goslice_; + +%} + #ifndef SWIGGO_GCCGO /* Boilerplate for C/C++ code when using 6g/8g. This code is compiled with gcc. */ Modified: trunk/Source/Modules/go.cxx =================================================================== --- trunk/Source/Modules/go.cxx 2012-10-04 20:52:51 UTC (rev 13863) +++ trunk/Source/Modules/go.cxx 2012-10-05 04:58:00 UTC (rev 13864) @@ -28,6 +28,8 @@ String *soname; // Size in bits of the C type "long". int long_type_size; + // Size in bits of the Go type "int". 0 if not specified. + int intgo_type_size; /* Output files */ File *f_c_begin; @@ -88,6 +90,7 @@ go_prefix(NULL), soname(NULL), long_type_size(32), + intgo_type_size(0), f_c_begin(NULL), f_go_begin(NULL), f_gc_begin(NULL), @@ -173,6 +176,19 @@ } else { Swig_arg_error(); } + } else if (strcmp(argv[i], "-intgosize") == 0) { + if (argv[i + 1]) { + intgo_type_size = atoi(argv[i + 1]); + if (intgo_type_size != 32 && intgo_type_size != 64) { + Printf(stderr, "-intgosize not 32 or 64\n"); + Swig_arg_error(); + } + Swig_mark_arg(i); + Swig_mark_arg(i + 1); + ++i; + } else { + Swig_arg_error(); + } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } @@ -196,6 +212,22 @@ Preprocessor_define("SWIGGO_LONG_TYPE_SIZE 64", 0); } + // This test may be removed in the future, when we can assume that + // everybody has upgraded to Go 1.1. The code below is prepared + // for this test to simply be taken out. + if (intgo_type_size == 0) { + Printf(stderr, "SWIG -go: -intgosize option required but not specified\n"); + SWIG_exit(EXIT_FAILURE); + } + + if (intgo_type_size == 32) { + Preprocessor_define("SWIGGO_INTGO_SIZE 32", 0); + } else if (intgo_type_size == 64) { + Preprocessor_define("SWIGGO_INTGO_SIZE 64", 0); + } else { + Preprocessor_define("SWIGGO_INTGO_SIZE 0", 0); + } + // Add typemap definitions. SWIG_typemap_lang("go"); SWIG_config_file("go.swg"); @@ -1130,9 +1162,8 @@ // A string has a pointer and a length. Append(orig, "(2 * SWIG_PARM_SIZE)"); } else if (Strncmp(go, "[]", 2) == 0) { - // A slice has a pointer, a length, and a capacity. The - // length and capacity are always 4 bytes. - Append(orig, "(SWIG_PARM_SIZE + 8)"); + // A slice has a pointer, a length, and a capacity. + Append(orig, "(3 * SWIG_PARM_SIZE)"); } else if (Strcmp(go, "float64") == 0) { Append(orig, "8"); } else if (Strcmp(go, "complex64") == 0) { @@ -1186,7 +1217,7 @@ Printv(f->code, "\tstruct swigargs {\n", NULL); if (parm_count > required_count) { - Printv(f->code, "\t\tint _swig_optargc;\n", NULL); + Printv(f->code, "\t\tintgo _swig_optargc;\n", NULL); } Parm *p = parms; @@ -1298,7 +1329,7 @@ Printv(fnname, go_prefix, "_", wname, "(", NULL); if (parm_count > required_count) { - Printv(fnname, "int _swig_optargc", NULL); + Printv(fnname, "intgo _swig_optargc", NULL); } Parm *p = parms; @@ -4614,19 +4645,20 @@ bool is_member = Strcmp(gt, "_swig_memberptr") == 0; bool is_complex64 = Strcmp(gt, "complex64") == 0; bool is_complex128 = Strcmp(gt, "complex128") == 0; - bool is_char = false; - bool is_short = false; - bool is_int = false; - bool is_long = false; - bool is_float = false; - bool is_double = false; + bool is_int8 = false; + bool is_int16 = false; + bool is_int = Strcmp(gt, "int") == 0 || Strcmp(gt, "uint") == 0; + bool is_int32 = false; + bool is_int64 = false; + bool is_float32 = false; + bool is_float64 = false; if ((n != NULL && Getattr(n, "tmap:gotype") != NULL) || hasGoTypemap(n, type)) { - is_char = Strcmp(gt, "int8") == 0 || Strcmp(gt, "uint8") == 0 || Strcmp(gt, "byte") == 0; - is_short = Strcmp(gt, "int16") == 0 || Strcmp(gt, "uint16") == 0; - is_int = Strcmp(gt, "int") == 0 || Strcmp(gt, "int32") == 0 || Strcmp(gt, "uint32") == 0; - is_long = Strcmp(gt, "int64") == 0 || Strcmp(gt, "uint64") == 0; - is_float = Strcmp(gt, "float32") == 0; - is_double = Strcmp(gt, "float64") == 0; + is_int8 = Strcmp(gt, "int8") == 0 || Strcmp(gt, "uint8") == 0 || Strcmp(gt, "byte") == 0; + is_int16 = Strcmp(gt, "int16") == 0 || Strcmp(gt, "uint16") == 0; + is_int32 = Strcmp(gt, "int32") == 0 || Strcmp(gt, "uint32") == 0; + is_int64 = Strcmp(gt, "int64") == 0 || Strcmp(gt, "uint64") == 0; + is_float32 = Strcmp(gt, "float32") == 0; + is_float64 = Strcmp(gt, "float64") == 0; } Delete(gt); @@ -4677,7 +4709,12 @@ if (Strcmp(q, "const") == 0) { SwigType_del_qualifier(t); if (hasGoTypemap(n, t) || SwigType_ispointer(t)) { - ret = SwigType_lstr(t, name); + if (is_int) { + ret = NewString("intgo "); + Append(ret, name); + } else { + ret = SwigType_lstr(t, name); + } Delete(q); Delete(t); return ret; @@ -4687,17 +4724,19 @@ } } Delete(t); - if (is_char) { + if (is_int8) { ret = NewString("char "); - } else if (is_short) { + } else if (is_int16) { ret = NewString("short "); } else if (is_int) { + ret = NewString("intgo "); + } else if (is_int32) { ret = NewString("int "); - } else if (is_long) { + } else if (is_int64) { ret = NewString("long long "); - } else if (is_float) { + } else if (is_float32) { ret = NewString("float "); - } else if (is_double) { + } else if (is_float64) { ret = NewString("double "); } else { return SwigType_lstr(type, name); @@ -4871,6 +4910,7 @@ -gccgo - Generate code for gccgo rather than 6g/8g\n\ -go-prefix <p> - Like gccgo -fgo-prefix option\n\ -longsize <s> - Set size of C/C++ long type--32 or 64 bits\n\ + -intgosize <s> - Set size of Go int type--32 or 64 bits\n\ -package <name> - Set name of the Go package to <name>\n\ -soname <name> - Set shared library holding C/C++ code to <name>\n\ \n"; Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2012-10-04 20:52:51 UTC (rev 13863) +++ trunk/configure.in 2012-10-05 04:58:00 UTC (rev 13864) @@ -2055,6 +2055,7 @@ GOC= GO1=false GOGCC=false + GOOPT= else if test "x$GOBIN" = xyes; then @@ -2065,6 +2066,7 @@ GOGCC=false GO1=false + GOOPT= if test -n "$GO" ; then if $GO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then GOGCC=true @@ -2074,10 +2076,30 @@ AC_MSG_RESULT([yes - minimum version is 4.7.0]) else AC_MSG_RESULT([no]) + if test "$go_version" -lt 480; then + GOOPT="-intgosize 32" + else + AC_CHECK_SIZEOF([void *], [4]) + if test "$ac_cv_sizeof_void_p" = "8"; then + GOOPT="-intgosize 64" + else + GOOPT="-intgosize 32" + fi + fi fi elif test "`echo $GO | sed -e 's|.*/||'`" = "go"; then GO1=true GOC=$(sh -c "$(go env) && echo \$GOCHAR")c + go_version=$($GO version | sed -e 's/go version //') + case $go_version in + go1.0*) GOOPT="-intgosize 32" ;; + *) if test "$GOC" = "6c"; then + GOOPT="-intgosize 64" + else + GOOPT="-intgosize 32" + fi + ;; + esac else GOC=`echo $GO | sed -e 's/g/c/'` AC_MSG_CHECKING([whether Go ($GO) version is too old]) @@ -2089,6 +2111,7 @@ else AC_MSG_RESULT([no]) fi + GOOPT="-intgosize 32" fi fi fi @@ -2097,6 +2120,7 @@ AC_SUBST(GO) AC_SUBST(GOC) AC_SUBST(GO1) +AC_SUBST(GOOPT) #---------------------------------------------------------------- # Look for D This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-10-11 19:24:34
|
Revision: 13870 http://swig.svn.sourceforge.net/swig/?rev=13870&view=rev Author: wsfulton Date: 2012-10-11 19:24:24 +0000 (Thu, 11 Oct 2012) Log Message: ----------- Two additional special variable are expanded in %exception - $parentname and $parentsymname Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Customization.html trunk/Examples/test-suite/java/special_variables_runme.java trunk/Examples/test-suite/special_variables.i trunk/Source/Modules/emit.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-10-11 19:22:13 UTC (rev 13869) +++ trunk/CHANGES.current 2012-10-11 19:24:24 UTC (rev 13870) @@ -10,6 +10,11 @@ size of the type is changing from Go 1.0 to Go 1.1 for x86_64. 2012-09-14: wsfulton + Additional new special variables in %exception are expanded as follows: + $parentname - The parent class name (if any) for a method. + $parentsymname - The target language parent class name (if any) for a method. + +2012-09-14: wsfulton Add new warning if the empty template instantiation is used as a base class, for example: template <typename T> class Base {}; Modified: trunk/Doc/Manual/Customization.html =================================================================== --- trunk/Doc/Manual/Customization.html 2012-10-11 19:22:13 UTC (rev 13869) +++ trunk/Doc/Manual/Customization.html 2012-10-11 19:24:24 UTC (rev 13870) @@ -479,6 +479,16 @@ <td>The fully qualified C/C++ declaration of the method being wrapped including the return type</td> </tr> +<tr> +<td>$parentname</td> +<td>The parent class name (if any) for a method.</td> +</tr> + +<tr> +<td>$parentsymname</td> +<td>The target language parent class name (if any) for a method.</td> +</tr> + </table> <p> Modified: trunk/Examples/test-suite/java/special_variables_runme.java =================================================================== --- trunk/Examples/test-suite/java/special_variables_runme.java 2012-10-11 19:22:13 UTC (rev 13869) +++ trunk/Examples/test-suite/java/special_variables_runme.java 2012-10-11 19:24:24 UTC (rev 13870) @@ -15,13 +15,13 @@ public static void main(String argv[]) { verify(special_variables.ExceptionVars(1.0, 2.0), - "result = Space::exceptionvars(arg1,arg2); Space::exceptionvars ExceptionVars Java_special_1variables_special_1variablesJNI_ExceptionVars"); + "result = Space::exceptionvars(arg1,arg2); Space::exceptionvars ExceptionVars Java_special_1variables_special_1variablesJNI_ExceptionVars "); verify(special_variables.overloadedmethod(), - "result = Space::overloadedmethod(); Space::overloadedmethod overloadedmethod __SWIG_1 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_11"); + "result = Space::overloadedmethod(); Space::overloadedmethod overloadedmethod __SWIG_1 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_11 "); verify(special_variables.overloadedmethod(10.0), - "result = Space::overloadedmethod(arg1); Space::overloadedmethod overloadedmethod __SWIG_0 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_10"); + "result = Space::overloadedmethod(arg1); Space::overloadedmethod overloadedmethod __SWIG_0 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_10 "); ABC a = new ABC(0, 0.0); verify(special_variables.getDeclaration(), "SpaceNamespace::ABC::ABC(int,double) SpaceNamespace::ABC::ABC(int,double)"); Modified: trunk/Examples/test-suite/special_variables.i =================================================================== --- trunk/Examples/test-suite/special_variables.i 2012-10-11 19:22:13 UTC (rev 13869) +++ trunk/Examples/test-suite/special_variables.i 2012-10-11 19:24:24 UTC (rev 13870) @@ -32,7 +32,7 @@ result = $symname(1.0,2.0); // Should expand to ExceptionVars result = $name(3.0,4.0); // Should expand to Space::exceptionvars // above will not compile if the variables are not expanded properly - result = "$action $name $symname $overname $wrapname"; + result = "$action $name $symname $overname $wrapname $parentclassname $parentclasssymname"; %} %inline %{ namespace Space { @@ -49,7 +49,7 @@ result = $name(); result = $name(2.0); // above will not compile if the variables are not expanded properly - result = "$action $name $symname $overname $wrapname"; + result = "$action $name $symname $overname $wrapname $parentclassname $parentclasssymname"; // $decl %} @@ -104,3 +104,36 @@ virtual ~DirectorTest() {} }; %} + + +/////////////////////////////////// parentclasssymname parentclassname ///////////////////////////////// +%exception instance_def { + $action + $parentclasssymname_aaa(); + $parentclassname_bbb(); + // above will not compile if the variables are not expanded properly +} +%exception static_def { + $action + $parentclasssymname_aaa(); + $parentclassname_bbb(); + // above will not compile if the variables are not expanded properly +} + +%{ +void DEFNewName_aaa() {} +namespace SpaceNamespace { + void DEF_bbb() {} +} +%} + +%rename(DEFNewName) DEF; +%inline %{ +namespace SpaceNamespace { + struct DEF : ABC { + void instance_def() {} + static void static_def() {} + }; +} +%} + Modified: trunk/Source/Modules/emit.cxx =================================================================== --- trunk/Source/Modules/emit.cxx 2012-10-11 19:22:13 UTC (rev 13869) +++ trunk/Source/Modules/emit.cxx 2012-10-11 19:24:24 UTC (rev 13870) @@ -381,6 +381,21 @@ Replaceall(tm, "$fulldecl", fulldecl); Delete(fulldecl); } + + Node *parentnode = parentNode(n); + Node *parentclass = (parentnode && Equal(nodeType(parentnode), "class")) ? parentnode : 0; + if (Strstr(tm, "$parentclasssymname")) { + String *parentclasssymname = 0; + if (parentclass) + parentclasssymname = Getattr(parentclass, "sym:name"); + Replaceall(tm, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); + } + if (Strstr(tm, "$parentclassname")) { + String *parentclassname = 0; + if (parentclass) + parentclassname = Getattr(parentclass, "name"); + Replaceall(tm, "$parentclassname", parentclassname ? parentclassname : ""); + } } Printv(wrappercode, tm, "\n", NIL); Delete(tm); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-10-11 19:28:09
|
Revision: 13871 http://swig.svn.sourceforge.net/swig/?rev=13871&view=rev Author: wsfulton Date: 2012-10-11 19:28:02 +0000 (Thu, 11 Oct 2012) Log Message: ----------- Support special variable expansion in %extend. Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Customization.html trunk/Doc/Manual/SWIGPlus.html trunk/Examples/test-suite/common.mk trunk/Source/Modules/emit.cxx trunk/Source/Swig/cwrap.c trunk/Source/Swig/swig.h Added Paths: ----------- trunk/Examples/test-suite/extend_special_variables.i trunk/Examples/test-suite/java/extend_special_variables_runme.java Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/CHANGES.current 2012-10-11 19:28:02 UTC (rev 13871) @@ -4,17 +4,22 @@ Version 2.0.9 (in progress) =========================== +2012-10-11: wsfulton + Most of the special variables available for use in %exception are now also available for expansion in + %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentname $parentsymname, see docs + on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans. + +2012-10-10: wsfulton + Additional new special variables in %exception are expanded as follows: + $parentname - The parent class name (if any) for a method. + $parentsymname - The target language parent class name (if any) for a method. + 2012-10-08: iant [Go] Generating Go code now requires using the -intgosize option to indicate the size of the 'int' type in Go. This is because the size of the type is changing from Go 1.0 to Go 1.1 for x86_64. 2012-09-14: wsfulton - Additional new special variables in %exception are expanded as follows: - $parentname - The parent class name (if any) for a method. - $parentsymname - The target language parent class name (if any) for a method. - -2012-09-14: wsfulton Add new warning if the empty template instantiation is used as a base class, for example: template <typename T> class Base {}; Modified: trunk/Doc/Manual/Customization.html =================================================================== --- trunk/Doc/Manual/Customization.html 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Doc/Manual/Customization.html 2012-10-11 19:28:02 UTC (rev 13871) @@ -455,6 +455,11 @@ </tr> <tr> +<td>$name</td> +<td>The C/C++ symbol name for the function.</td> +</tr> + +<tr> <td>$symname</td> <td>The symbol name used internally by SWIG</td> </tr> Modified: trunk/Doc/Manual/SWIGPlus.html =================================================================== --- trunk/Doc/Manual/SWIGPlus.html 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Doc/Manual/SWIGPlus.html 2012-10-11 19:28:02 UTC (rev 13871) @@ -2839,6 +2839,12 @@ </pre></div> <p> +The following special variables are expanded if used within a %extend block: +$name, $symname, $overname, $decl, $fulldecl, $parentname and $parentsymname. +The <a href="Customization.html#Customization_exception_special_variables">Special variables</a> section provides more information each of these special variables. +</p> + +<p> The<tt> %extend</tt> directive follows all of the same conventions as its use with C structures. Please refer to the <a href="SWIG.html#SWIG_adding_member_functions">Adding member functions to C structures</a> section for further details. Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Examples/test-suite/common.mk 2012-10-11 19:28:02 UTC (rev 13871) @@ -204,6 +204,7 @@ extend_constructor_destructor \ extend_default \ extend_placement \ + extend_special_variables \ extend_template \ extend_template_ns \ extend_typedef_class \ Added: trunk/Examples/test-suite/extend_special_variables.i =================================================================== --- trunk/Examples/test-suite/extend_special_variables.i (rev 0) +++ trunk/Examples/test-suite/extend_special_variables.i 2012-10-11 19:28:02 UTC (rev 13871) @@ -0,0 +1,21 @@ +%module extend_special_variables + +%rename(ForExtensionNewName) ForExtension; +%rename(extended_renamed) ForExtension::extended; + +%extend ForExtension { + ForExtension() { + return new ForExtension(); + } + const char* extended() { + return "name:$name symname:$symname wrapname:$wrapname overname:$overname decl:$decl fulldecl:$fulldecl parentclasssymname:$parentclasssymname parentclassname:$parentclassname"; + } + const char* extended(int) { + return "name:$name symname:$symname wrapname:$wrapname overname:$overname decl:$decl fulldecl:$fulldecl parentclasssymname:$parentclasssymname parentclassname:$parentclassname"; + } +} + +%inline %{ +struct ForExtension { +}; +%} Added: trunk/Examples/test-suite/java/extend_special_variables_runme.java =================================================================== --- trunk/Examples/test-suite/java/extend_special_variables_runme.java (rev 0) +++ trunk/Examples/test-suite/java/extend_special_variables_runme.java 2012-10-11 19:28:02 UTC (rev 13871) @@ -0,0 +1,25 @@ + +import extend_special_variables.*; + +public class extend_special_variables_runme { + + static { + try { + System.loadLibrary("extend_special_variables"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + ForExtensionNewName f = new ForExtensionNewName(); + verify(f.extended_renamed(), "name:extended symname:extended_renamed wrapname: overname:__SWIG_0 decl:ForExtension::extended() fulldecl:char const * ForExtension::extended() parentclasssymname:ForExtensionNewName parentclassname:ForExtension"); + verify(f.extended_renamed(10), "name:extended symname:extended_renamed wrapname: overname:__SWIG_1 decl:ForExtension::extended(int) fulldecl:char const * ForExtension::extended(int) parentclasssymname:ForExtensionNewName parentclassname:ForExtension"); + } + static void verify(String received, String expected) { + if (!received.equals(expected)) + throw new RuntimeException("Incorrect, received: " + received); + } +} Modified: trunk/Source/Modules/emit.cxx =================================================================== --- trunk/Source/Modules/emit.cxx 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Source/Modules/emit.cxx 2012-10-11 19:28:02 UTC (rev 13871) @@ -363,39 +363,9 @@ tm = Copy(tm); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Strstr(tm, "$")) { - Replaceall(tm, "$name", Getattr(n, "name")); - Replaceall(tm, "$symname", Getattr(n, "sym:name")); + Swig_replace_special_variables(n, parentNode(n), tm); Replaceall(tm, "$function", eaction); // deprecated Replaceall(tm, "$action", eaction); - Replaceall(tm, "$wrapname", Getattr(n, "wrap:name")); - String *overloaded = Getattr(n, "sym:overloaded"); - Replaceall(tm, "$overname", overloaded ? Char(Getattr(n, "sym:overname")) : ""); - - if (Strstr(tm, "$decl")) { - String *decl = Swig_name_decl(n); - Replaceall(tm, "$decl", decl); - Delete(decl); - } - if (Strstr(tm, "$fulldecl")) { - String *fulldecl = Swig_name_fulldecl(n); - Replaceall(tm, "$fulldecl", fulldecl); - Delete(fulldecl); - } - - Node *parentnode = parentNode(n); - Node *parentclass = (parentnode && Equal(nodeType(parentnode), "class")) ? parentnode : 0; - if (Strstr(tm, "$parentclasssymname")) { - String *parentclasssymname = 0; - if (parentclass) - parentclasssymname = Getattr(parentclass, "sym:name"); - Replaceall(tm, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); - } - if (Strstr(tm, "$parentclassname")) { - String *parentclassname = 0; - if (parentclass) - parentclassname = Getattr(parentclass, "name"); - Replaceall(tm, "$parentclassname", parentclassname ? parentclassname : ""); - } } Printv(wrappercode, tm, "\n", NIL); Delete(tm); Modified: trunk/Source/Swig/cwrap.c =================================================================== --- trunk/Source/Swig/cwrap.c 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Source/Swig/cwrap.c 2012-10-11 19:28:02 UTC (rev 13871) @@ -760,6 +760,46 @@ } /* ----------------------------------------------------------------------------- + * Swig_replace_special_variables() + * + * Replaces special variables with a value from the supplied node + * ----------------------------------------------------------------------------- */ +void Swig_replace_special_variables(Node *n, Node *parentnode, String *code) { + Node *parentclass = parentnode; + String *overloaded = Getattr(n, "sym:overloaded"); + Replaceall(code, "$name", Getattr(n, "name")); + Replaceall(code, "$symname", Getattr(n, "sym:name")); + Replaceall(code, "$wrapname", Getattr(n, "wrap:name")); + Replaceall(code, "$overname", overloaded ? Char(Getattr(n, "sym:overname")) : ""); + + if (Strstr(code, "$decl")) { + String *decl = Swig_name_decl(n); + Replaceall(code, "$decl", decl); + Delete(decl); + } + if (Strstr(code, "$fulldecl")) { + String *fulldecl = Swig_name_fulldecl(n); + Replaceall(code, "$fulldecl", fulldecl); + Delete(fulldecl); + } + + if (parentclass && !Equal(nodeType(parentclass), "class")) + parentclass = 0; + if (Strstr(code, "$parentclasssymname")) { + String *parentclasssymname = 0; + if (parentclass) + parentclasssymname = Getattr(parentclass, "sym:name"); + Replaceall(code, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); + } + if (Strstr(code, "$parentclassname")) { + String *parentclassname = 0; + if (parentclass) + parentclassname = Getattr(parentclass, "name"); + Replaceall(code, "$parentclassname", parentclassname ? parentclassname : ""); + } +} + +/* ----------------------------------------------------------------------------- * extension_code() * * Generates an extension function (a function defined in %extend) @@ -767,14 +807,17 @@ * return_type function_name(parms) code * * ----------------------------------------------------------------------------- */ -static String *extension_code(const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { +static String *extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *parms_str = cplusplus ? ParmList_str_defaultargs(parms) : ParmList_str(parms); String *sig = NewStringf("%s(%s)", function_name, parms_str); String *rt_sig = SwigType_str(return_type, sig); String *body = NewStringf("SWIGINTERN %s", rt_sig); Printv(body, code, "\n", NIL); - if (self) - Replaceall(body, "$self", self); + if (Strstr(body, "$")) { + Swig_replace_special_variables(n, parentNode(parentNode(n)), body); + if (self) + Replaceall(body, "$self", self); + } Delete(parms_str); Delete(sig); Delete(rt_sig); @@ -791,7 +834,7 @@ * * ----------------------------------------------------------------------------- */ int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { - String *body = extension_code(function_name, parms, return_type, code, cplusplus, self); + String *body = extension_code(n, function_name, parms, return_type, code, cplusplus, self); Setattr(n, "wrap:code", body); Delete(body); return SWIG_OK; Modified: trunk/Source/Swig/swig.h =================================================================== --- trunk/Source/Swig/swig.h 2012-10-11 19:24:24 UTC (rev 13870) +++ trunk/Source/Swig/swig.h 2012-10-11 19:28:02 UTC (rev 13871) @@ -354,6 +354,7 @@ extern String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref); extern int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self); + extern void Swig_replace_special_variables(Node *n, Node *parentnode, String *code); /* --- Transformations --- */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2012-10-27 17:37:42
|
Revision: 13873 http://swig.svn.sourceforge.net/swig/?rev=13873&view=rev Author: wsfulton Date: 2012-10-27 17:37:34 +0000 (Sat, 27 Oct 2012) Log Message: ----------- Fix director typemap searching so that a typemap specified with a name will be correctly matched. Previously the name was ignored during the typemap search. Implemented by ensuring the 'type' attribute in the Node is set up correctly and using the usual Swig_typemap_lookup on the Node. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/csharp.cxx trunk/Source/Modules/d.cxx trunk/Source/Modules/go.cxx trunk/Source/Modules/java.cxx trunk/Source/Modules/lang.cxx trunk/Source/Modules/ocaml.cxx trunk/Source/Modules/octave.cxx trunk/Source/Modules/php.cxx trunk/Source/Modules/python.cxx trunk/Source/Modules/ruby.cxx Added Paths: ----------- trunk/Examples/test-suite/typemap_directorout.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/CHANGES.current 2012-10-27 17:37:34 UTC (rev 13873) @@ -4,6 +4,11 @@ Version 2.0.9 (in progress) =========================== +2012-10-26: wsfulton + Fix director typemap searching so that a typemap specified with a name will be correctly matched. Previously + the name was ignored during the typemap search. Applies to the following list of typemaps: + directorout, csdirectorout, cstype, imtype, ctype, ddirectorout, dtype, gotype, jtype, jni, javadirectorout. + 2012-10-11: wsfulton Most of the special variables available for use in %exception are now also available for expansion in %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentname $parentsymname, see docs Added: trunk/Examples/test-suite/typemap_directorout.i =================================================================== --- trunk/Examples/test-suite/typemap_directorout.i (rev 0) +++ trunk/Examples/test-suite/typemap_directorout.i 2012-10-27 17:37:34 UTC (rev 13873) @@ -0,0 +1,48 @@ +// Test named output typemaps used in directors are found during the typematch search +%module(directors="1") typemap_directorout + +%warnfilter(SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR) Class1; + +%feature("director"); + +%typemap(out) MyType & %{ WILL_NOT_COMPILE %} +%typemap(out) MyType &USEME = SWIGTYPE &; +%typemap(out) MyType &Class1::foo2, MyType &foo1 %{ /* special start */ $typemap(out, MyType &USEME) /* special end */ %} + +%typemap(directorout) MyType & %{ WILL_NOT_COMPILE %} +// Can't use the %typemap(directorout) MyType & = SWIGTYPE & approach as non-director languages don't define any directorout typemaps +%typemap(directorout) MyType &Class1::foo2, MyType &foo1 %{ /* special start */ $input = 0; /* special end */ %} + + +#ifdef SWIGCSHARP +%typemap(csdirectorout) MyType & %{ WILL_NOT_COMPILE %} +%typemap(csdirectorout) MyType &USEME = SWIGTYPE &; +%typemap(csdirectorout) MyType &Class1::foo2, MyType &foo1 %{ /* special start */ $typemap(csdirectorout, MyType &USEME) /* special end */ %} +#endif + +#ifdef SWIGD +%typemap(ddirectorout) MyType & %{ WILL_NOT_COMPILE %} +%typemap(ddirectorout) MyType &USEME = SWIGTYPE &; +%typemap(ddirectorout) MyType &Class1::foo2, MyType &foo1 %{ /* special start */ $typemap(ddirectorout, MyType &USEME) /* special end */ %} +#endif + +#ifdef SWIGJAVA +%typemap(javadirectorout) MyType & %{ WILL_NOT_COMPILE %} +%typemap(javadirectorout) MyType &USEME = SWIGTYPE &; +%typemap(javadirectorout) MyType &Class1::foo2, MyType &foo1 %{ /* special start */ $typemap(javadirectorout, MyType &USEME) /* special end */ %} +#endif + +%inline %{ +typedef int MyType; +class Class1 +{ + MyType mt; +public: + Class1() : mt() {} + virtual MyType & foo1() { return mt; } + virtual MyType & foo2(int parm1) { return mt; } + virtual MyType & foo2() { return mt; } + virtual ~Class1() {} +}; +%} + Modified: trunk/Source/Modules/csharp.cxx =================================================================== --- trunk/Source/Modules/csharp.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/csharp.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -3449,13 +3449,11 @@ * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { - String *empty_str = NewString(""); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); - SwigType *returntype = Getattr(n, "returntype"); + SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); @@ -3544,14 +3542,12 @@ } /* Create the intermediate class wrapper */ - Parm *tp = NewParm(returntype, empty_str, n); - - tm = Swig_typemap_lookup("imtype", tp, "", 0); + tm = Swig_typemap_lookup("imtype", n, "", 0); if (tm) { - String *imtypeout = Getattr(tp, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap + String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; - const String *im_directoroutattributes = Getattr(tp, "tmap:imtype:directoroutattributes"); + const String *im_directoroutattributes = Getattr(n, "tmap:imtype:directoroutattributes"); if (im_directoroutattributes) { Printf(callback_def, " %s\n", im_directoroutattributes); Printf(director_delegate_definitions, " %s\n", im_directoroutattributes); @@ -3564,10 +3560,7 @@ Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } - Parm *retpm = NewParm(returntype, empty_str, n); - - if ((c_ret_type = Swig_typemap_lookup("ctype", retpm, "", 0))) { - + if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); @@ -3578,8 +3571,6 @@ SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } - - Delete(retpm); } Swig_director_parms_fixup(l); @@ -3731,7 +3722,7 @@ /* header declaration, start wrapper definition */ String *target; - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -3778,9 +3769,7 @@ String *upcall = NewStringf("%s(%s)", symname, imcall_args); if (!is_void) { - Parm *tp = NewParm(returntype, empty_str, n); - - if ((tm = Swig_typemap_lookup("csdirectorout", tp, "", 0))) { + if ((tm = Swig_typemap_lookup("csdirectorout", n, "", 0))) { substituteClassname(returntype, tm); Replaceall(tm, "$cscall", upcall); @@ -3788,7 +3777,6 @@ } Delete(tm); - Delete(tp); } else Printf(callback_code, " %s;\n", upcall); @@ -3804,10 +3792,9 @@ if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); - Parm *tp = NewParm(returntype, result_str, n); /* Copy jresult into c_result... */ - if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { + if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); @@ -3818,7 +3805,6 @@ output_director = false; } - Delete(tp); Delete(jresult_str); Delete(result_str); } Modified: trunk/Source/Modules/d.cxx =================================================================== --- trunk/Source/Modules/d.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/d.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -1927,13 +1927,11 @@ * underlying D object. * --------------------------------------------------------------------------- */ virtual int classDirectorMethod(Node *n, Node *parent, String *super) { - String *empty_str = NewString(""); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); - SwigType *returntype = Getattr(n, "returntype"); + SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); @@ -2022,11 +2020,9 @@ } /* Create the intermediate class wrapper */ - Parm *tp = NewParm(returntype, empty_str, n); - - tm = lookupDTypemap(tp, "imtype"); + tm = lookupDTypemap(n, "imtype"); if (tm) { - String *imtypeout = Getattr(tp, "tmap:imtype:out"); + String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type // in the typemap. @@ -2039,9 +2035,7 @@ "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } - Parm *retpm = NewParm(returntype, empty_str, n); - - if ((c_ret_type = Swig_typemap_lookup("ctype", retpm, "", 0))) { + if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); @@ -2053,8 +2047,6 @@ SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } - - Delete(retpm); } Swig_director_parms_fixup(l); @@ -2213,7 +2205,7 @@ /* header declaration, start wrapper definition */ String *target; - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -2259,16 +2251,10 @@ String *upcall = NewStringf("(cast(%s)dObject).%s(%s)", classname, symname, imcall_args); if (!is_void) { - Parm *tp = NewParm(returntype, empty_str, n); - - // RESEARCH: What happens if there is no ddirectorout typemap? - if ((tm = lookupDTypemap(tp, "ddirectorout"))) { + if ((tm = lookupDTypemap(n, "ddirectorout"))) { Replaceall(tm, "$dcall", upcall); - Printf(callback_code, " return %s;\n", tm); } - - Delete(tp); } else { Printf(callback_code, " %s;\n", upcall); } @@ -2285,11 +2271,9 @@ if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); - Parm *tp = NewParm(returntype, result_str, n); /* Copy jresult into c_result... */ - // FIXME: lookupDTypemap? - if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { + if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); @@ -2300,7 +2284,6 @@ output_director = false; } - Delete(tp); Delete(jresult_str); Delete(result_str); } @@ -2365,8 +2348,7 @@ // We cannot directly use n here because its »type« attribute does not // the full return type any longer after Language::functionHandler has // returned. - Parm *tp = NewParm(returntype, empty_str, n); - String *dp_return_type = lookupDTypemap(tp, "dtype"); + String *dp_return_type = lookupDTypemap(n, "dtype"); if (dp_return_type) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { @@ -2377,7 +2359,7 @@ } } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, - "No dtype typemap defined for %s\n", SwigType_str(type, 0)); + "No dtype typemap defined for %s\n", SwigType_str(returntype, 0)); dp_return_type = NewString(""); } Modified: trunk/Source/Modules/go.cxx =================================================================== --- trunk/Source/Modules/go.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/go.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -2853,7 +2853,6 @@ int classDirectorMethod(Node *n, Node *parent, String *super) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; - bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0); // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { @@ -2866,18 +2865,8 @@ name = Getattr(n, "name"); } - if (Getattr(class_methods, name)) { - // We need to emit a pure virtual function, even if it is - // overloaded. Otherwise we won't be able to create an instance - // of the director class. The function doesn't need to actually - // do anything. - if (!is_pure_virtual || Getattr(n, "sym:overloaded")) { - return SWIG_OK; - } - } - Setattr(class_methods, name, NewString("")); - - if (!Getattr(n, "sym:overloaded")) { + bool overloaded = Getattr(n, "sym:overloaded") && !Getattr(n, "explicitcallnode"); + if (!overloaded) { int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; @@ -2888,47 +2877,54 @@ // class_methods so that we correctly handle cases where a // function in one class hides a function of the same name in a // parent class. - for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) { - int r = oneClassDirectorMethod(on, parent, super); - if (r != SWIG_OK) { - return r; + if (!Getattr(class_methods, name)) { + for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) { + // Swig_overload_rank expects wrap:name and wrap:parms to be + // set. + String *wn = Swig_name_wrapper(Getattr(on, "sym:name")); + Append(wn, Getattr(on, "sym:overname")); + Setattr(on, "wrap:name", wn); + Delete(wn); + Setattr(on, "wrap:parms", Getattr(on, "parms")); } + } - // Swig_overload_rank expects wrap:name and wrap:parms to be - // set. - String *wn = Swig_name_wrapper(Getattr(on, "sym:name")); - Append(wn, Getattr(on, "sym:overname")); - Setattr(on, "wrap:name", wn); - Delete(wn); - Setattr(on, "wrap:parms", Getattr(on, "parms")); + int r = oneClassDirectorMethod(n, parent, super); + if (r != SWIG_OK) { + return r; } - bool is_static = isStatic(n); + if (!Getattr(n, "sym:nextSibling")) + { + // Last overloaded function + Node *on = Getattr(n, "sym:overloaded"); + bool is_static = isStatic(on); - String *cn = exportedName(Getattr(parent, "sym:name")); - String *go_name = buildGoName(name, is_static, false); + String *cn = exportedName(Getattr(parent, "sym:name")); + String *go_name = buildGoName(name, is_static, false); - String *director_struct_name = NewString("_swig_Director"); - Append(director_struct_name, cn); + String *director_struct_name = NewString("_swig_Director"); + Append(director_struct_name, cn); - int r = makeDispatchFunction(n, go_name, director_struct_name, is_static, director_struct_name, false); - if (r != SWIG_OK) { - return r; - } + int r = makeDispatchFunction(on, go_name, director_struct_name, is_static, director_struct_name, false); + if (r != SWIG_OK) { + return r; + } - String *go_upcall = NewString("Director"); - Append(go_upcall, cn); - Append(go_upcall, go_name); - r = makeDispatchFunction(n, go_upcall, director_struct_name, is_static, director_struct_name, true); - if (r != SWIG_OK) { - return r; + String *go_upcall = NewString("Director"); + Append(go_upcall, cn); + Append(go_upcall, go_name); + r = makeDispatchFunction(on, go_upcall, director_struct_name, is_static, director_struct_name, true); + if (r != SWIG_OK) { + return r; + } + Delete(cn); + Delete(go_name); + Delete(director_struct_name); + Delete(go_upcall); } - - Delete(cn); - Delete(go_name); - Delete(director_struct_name); - Delete(go_upcall); } + Setattr(class_methods, name, NewString("")); return SWIG_OK; } @@ -2980,17 +2976,8 @@ Swig_typemap_attach_parms("gotype", parms, NULL); int parm_count = emit_num_arguments(parms); - SwigType *result = Getattr(n, "returntype"); - if (!result) { - // This can happen when following overloads. - result = NewString(Getattr(n, "type")); - SwigType_push(result, Getattr(n, "decl")); - if (SwigType_isqualifier(result)) { - Delete(SwigType_pop(result)); - } - Delete(SwigType_pop_function(result)); - Setattr(n, "returntype", result); - } + SwigType *result = Getattr(n, "type"); + SwigType *returntype = result; // Save the type for overload processing. Setattr(n, "go:type", result); @@ -3177,7 +3164,8 @@ if (overname) { Append(upcall_method_name, overname); } - String *upcall_decl = Swig_method_decl(Getattr(n, "type"), Getattr(n, "decl"), upcall_method_name, parms, 0, 0); + SwigType *rtype = Getattr(n, "classDirectorMethods:type"); + String *upcall_decl = Swig_method_decl(rtype, Getattr(n, "decl"), upcall_method_name, parms, 0, 0); Printv(f_c_directors_h, " ", upcall_decl, " {\n", NULL); Delete(upcall_decl); @@ -3450,7 +3438,7 @@ if (!is_ignored || is_pure_virtual) { // Declare the method for the director class. - SwigType *rtype = (Getattr(n, "conversion_operator") ? NULL : Getattr(n, "type")); + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); String *decl = Swig_method_decl(rtype, Getattr(n, "decl"), Getattr(n, "name"), parms, 0, 0); Printv(f_c_directors_h, " virtual ", decl, NULL); Delete(decl); @@ -3474,7 +3462,7 @@ Printv(w->def, " {\n", NULL); if (SwigType_type(result) != T_VOID) { - Wrapper_add_local(w, "c_result", SwigType_lstr(Getattr(n, "returntype"), "c_result")); + Wrapper_add_local(w, "c_result", SwigType_lstr(returntype, "c_result")); } if (!is_ignored) { @@ -3530,9 +3518,8 @@ Printv(w->code, " crosscall2(", callback_wname, ", &swig_a, (int) sizeof swig_a);\n", NULL); if (SwigType_type(result) != T_VOID) { - String *rname = NewString("c_result"); - Parm *rp = NewParm(Getattr(n, "returntype"), rname, n); - String *tm = Swig_typemap_lookup("directorout", rp, rname, NULL); + String *result_str = NewString("c_result"); + String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); @@ -3541,13 +3528,12 @@ Replaceall(tm, "$input", swig_a_result); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); - String *retstr = SwigType_rcaststr(Getattr(n, "returntype"), "c_result"); + String *retstr = SwigType_rcaststr(returntype, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } - Delete(rp); - Delete(rname); + Delete(result_str); } // The C wrapper code which calls the Go function. @@ -3605,9 +3591,8 @@ Printv(w->code, callback_wname, "(go_val", args, ");\n", NULL); if (SwigType_type(result) != T_VOID) { - String *rname = NewString("c_result"); - Parm *rp = NewParm(Getattr(n, "returntype"), rname, n); - String *tm = Swig_typemap_lookup("directorout", rp, rname, NULL); + String *result_str = NewString("c_result"); + String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); @@ -3615,13 +3600,12 @@ Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); - String *retstr = SwigType_rcaststr(Getattr(n, "returntype"), "c_result"); + String *retstr = SwigType_rcaststr(returntype, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } - Delete(rp); - Delete(rname); + Delete(result_str); } } @@ -3641,7 +3625,7 @@ assert(is_pure_virtual); Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL); if (SwigType_type(result) != T_VOID) { - String *retstr = SwigType_rcaststr(Getattr(n, "returntype"), "c_result"); + String *retstr = SwigType_rcaststr(returntype, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); } @@ -3783,7 +3767,8 @@ mismatch = false; bool any_void = false; for (int i = 0; i < nfunc; ++i) { - Node *ni = Getitem(dispatch, i); + Node *nn = Getitem(dispatch, i); + Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; SwigType *result = Getattr(ni, "go:type"); assert(result); @@ -3862,7 +3847,8 @@ for (int i = 0; i < nfunc; ++i) { int fn = 0; - Node *ni = Getitem(dispatch, i); + Node *nn = Getitem(dispatch, i); + Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; Parm *pi = Getattr(ni, "wrap:parms"); // If we are using a receiver, we want to ignore a leading self @@ -3892,7 +3878,8 @@ // Build list of collisions with the same number of arguments. List *coll = NewList(); for (int k = i + 1; k < nfunc; ++k) { - Node *nk = Getitem(dispatch, k); + Node *nnk = Getitem(dispatch, k); + Node *nk = Getattr(nnk, "directorNode") ? Getattr(nnk, "directorNode") : nnk; Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); Modified: trunk/Source/Modules/java.cxx =================================================================== --- trunk/Source/Modules/java.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/java.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -3519,7 +3519,6 @@ String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); SwigType *returntype = Getattr(n, "returntype"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); @@ -3616,9 +3615,7 @@ } /* Create the intermediate class wrapper */ - Parm *tp = NewParm(returntype, empty_str, n); - - tm = Swig_typemap_lookup("jtype", tp, "", 0); + tm = Swig_typemap_lookup("jtype", n, "", 0); if (tm) { Printf(callback_def, " public static %s %s(%s self", tm, imclass_dmethod, qualified_classname); } else { @@ -3628,7 +3625,8 @@ String *cdesc = NULL; SwigType *covariant = Getattr(n, "covariant"); SwigType *adjustedreturntype = covariant ? covariant : returntype; - Parm *adjustedreturntypeparm = NewParm(adjustedreturntype, empty_str, n); + Parm *adjustedreturntypeparm = NewParm(adjustedreturntype, name, n); +// Setattr(adjustedreturntypeparm, "sym:symtab", Getattr(n, "sym:symtab")); if ((tm = Swig_typemap_lookup("directorin", adjustedreturntypeparm, "", 0)) && (cdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { @@ -3647,12 +3645,9 @@ /* Get the JNI field descriptor for this return type, add the JNI field descriptor to jniret_desc */ + if ((c_ret_type = Swig_typemap_lookup("jni", n, "", 0))) { + Parm *tp = NewParm(c_ret_type, name, n); - Parm *retpm = NewParm(returntype, empty_str, n); - - if ((c_ret_type = Swig_typemap_lookup("jni", retpm, "", 0))) { - Parm *tp = NewParm(c_ret_type, empty_str, n); - if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); @@ -3685,7 +3680,6 @@ } Delete(adjustedreturntypeparm); - Delete(retpm); Delete(qualified_classname); } @@ -3755,7 +3749,7 @@ } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap for type %s for use in %s::%s (skipping director method)\n", - SwigType_str(type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); + SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } @@ -3879,7 +3873,6 @@ output_director = false; } - Delete(tp); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); @@ -3894,7 +3887,7 @@ /* header declaration, start wrapper definition */ String *target; - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -3944,21 +3937,18 @@ addThrows(n, "feature:except", n); if (!is_void) { - Parm *tp = NewParm(returntype, empty_str, n); - - if ((tm = Swig_typemap_lookup("javadirectorout", tp, "", 0))) { - addThrows(n, "tmap:javadirectorout", tp); + if ((tm = Swig_typemap_lookup("javadirectorout", n, "", 0))) { + addThrows(n, "tmap:javadirectorout", n); substituteClassname(returntype, tm); Replaceall(tm, "$javacall", upcall); Printf(callback_code, " return %s;\n", tm); } - if ((tm = Swig_typemap_lookup("out", tp, "", 0))) - addThrows(n, "tmap:out", tp); + if ((tm = Swig_typemap_lookup("out", n, "", 0))) + addThrows(n, "tmap:out", n); Delete(tm); - Delete(tp); } else Printf(callback_code, " %s;\n", upcall); @@ -3988,11 +3978,10 @@ if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); - Parm *tp = NewParm(returntype, result_str, n); /* Copy jresult into c_result... */ - if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { - addThrows(n, "tmap:directorout", tp); + if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { + addThrows(n, "tmap:directorout", n); Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); @@ -4003,7 +3992,6 @@ output_director = false; } - Delete(tp); Delete(jresult_str); Delete(result_str); } Modified: trunk/Source/Modules/lang.cxx =================================================================== --- trunk/Source/Modules/lang.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/lang.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -2041,9 +2041,12 @@ if (!Cmp(type, "destructor")) { classDirectorDestructor(method); } else { - if (classDirectorMethod(method, n, fqdname) == SWIG_OK) { - Setattr(item, "director", "1"); - } + Swig_require("classDirectorMethods", method, "*type", NIL); + assert(Getattr(method, "returntype")); + Setattr(method, "type", Getattr(method, "returntype")); + if (classDirectorMethod(method, n, fqdname) == SWIG_OK) + SetFlag(item, "director"); + Swig_restore(method); } } Modified: trunk/Source/Modules/ocaml.cxx =================================================================== --- trunk/Source/Modules/ocaml.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/ocaml.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -1380,63 +1380,41 @@ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; - String *storage; - String *value; - String *decl; - String *type; - String *name; - String *classname; + String *storage = Getattr(n, "storage"); + String *value = Getattr(n, "value"); + String *decl = Getattr(n, "decl"); + String *return_type = Getattr(n, "type"); + String *name = Getattr(n, "name"); + String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); - String *declaration; - ParmList *l; - Wrapper *w; + String *declaration = NewString(""); + ParmList *l = Getattr(n, "parms"); + Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); - String *return_type; int status = SWIG_OK; int idx; bool pure_virtual = false; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; - storage = Getattr(n, "storage"); - value = Getattr(n, "value"); - classname = Getattr(parent, "sym:name"); - type = Getattr(n, "type"); - name = Getattr(n, "name"); - if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } - w = NewWrapper(); - declaration = NewString(""); Wrapper_add_local(w, "swig_result", "CAMLparam0();\n" "SWIG_CAMLlocal2(swig_result,args)"); /* determine if the method returns a pointer */ - decl = Getattr(n, "decl"); is_pointer = SwigType_ispointer_return(decl); - is_void = (!Cmp(type, "void") && !is_pointer); + is_void = (!Cmp(return_type, "void") && !is_pointer); - /* form complete return type */ - return_type = Copy(type); - { - SwigType *t = Copy(decl); - SwigType *f = 0; - f = SwigType_pop_function(t); - SwigType_push(return_type, t); - Delete(f); - Delete(t); - } - /* virtual method definition */ - l = Getattr(n, "parms"); String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s {", target); Delete(qualified_name); @@ -1616,16 +1594,7 @@ idx = 0; - /* this seems really silly. the node's type excludes - * qualifier/pointer/reference markers, which have to be retrieved - * from the decl field to construct return_type. but the typemap - * lookup routine uses the node's type, so we have to swap in and - * out the correct type. it's not just me, similar silliness also - * occurs in Language::cDeclaration(). - */ - Setattr(n, "type", return_type); tm = Swig_typemap_lookup("directorout", n, "c_result", w); - Setattr(n, "type", type); if (tm != 0) { Replaceall(tm, "$input", "swig_result"); /* TODO check this */ @@ -1704,7 +1673,6 @@ /* clean up */ Delete(wrap_args); - Delete(return_type); Delete(pclassname); DelWrapper(w); return status; Modified: trunk/Source/Modules/octave.cxx =================================================================== --- trunk/Source/Modules/octave.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/octave.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -1247,18 +1247,17 @@ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; - String *decl; - String *type; - String *name; - String *classname; + String *decl = Getattr(n, "decl"); + String *return_type = Getattr(n, "type"); + String *name = Getattr(n, "name"); + String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); - String *declaration; - ParmList *l; - Wrapper *w; + String *declaration = NewString(""); + ParmList *l = Getattr(n, "parms"); + Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); - String *return_type; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; @@ -1272,35 +1271,15 @@ } } - classname = Getattr(parent, "sym:name"); - type = Getattr(n, "type"); - name = Getattr(n, "name"); - - w = NewWrapper(); - declaration = NewString(""); - // determine if the method returns a pointer - decl = Getattr(n, "decl"); is_pointer = SwigType_ispointer_return(decl); - is_void = (!Cmp(type, "void") && !is_pointer); + is_void = (!Cmp(return_type, "void") && !is_pointer); - // form complete return type - return_type = Copy(type); - { - SwigType *t = Copy(decl); - SwigType *f = 0; - f = SwigType_pop_function(t); - SwigType_push(return_type, t); - Delete(f); - Delete(t); - } - // virtual method definition - l = Getattr(n, "parms"); String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -1449,9 +1428,7 @@ "method %s.%s failed to return the required number " "of arguments.\");\n", classname, method_name); Printf(w->code, "}\n"); - Setattr(n, "type", return_type); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); - Setattr(n, "type", type); if (tm != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); @@ -1531,7 +1508,6 @@ } // clean up Delete(wrap_args); - Delete(return_type); Delete(pclassname); DelWrapper(w); return status; Modified: trunk/Source/Modules/php.cxx =================================================================== --- trunk/Source/Modules/php.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/php.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -2415,18 +2415,17 @@ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; - String *decl; - String *type; - String *name; - String *classname; + String *decl = Getattr(n, "decl"); + String *return_type = Getattr(n, "type"); + String *name = Getattr(n, "name"); + String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); - String *declaration; - ParmList *l; - Wrapper *w; + String *declaration = NewStringEmpty(); + ParmList *l = Getattr(n, "parms"); + Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewStringEmpty(); - String *return_type; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; @@ -2440,34 +2439,15 @@ } } - classname = Getattr(parent, "sym:name"); - type = Getattr(n, "type"); - name = Getattr(n, "name"); - - w = NewWrapper(); - declaration = NewStringEmpty(); - /* determine if the method returns a pointer */ - decl = Getattr(n, "decl"); is_pointer = SwigType_ispointer_return(decl); - is_void = (Cmp(type, "void") == 0 && !is_pointer); + is_void = (Cmp(return_type, "void") == 0 && !is_pointer); - /* form complete return type */ - return_type = Copy(type); - { - SwigType *t = Copy(decl); - SwigType *f = SwigType_pop_function(t); - SwigType_push(return_type, t); - Delete(f); - Delete(t); - } - /* virtual method definition */ - l = Getattr(n, "parms"); String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -2651,16 +2631,7 @@ /* marshal return value */ if (!is_void) { - /* this seems really silly. the node's type excludes - * qualifier/pointer/reference markers, which have to be retrieved - * from the decl field to construct return_type. but the typemap - * lookup routine uses the node's type, so we have to swap in and - * out the correct type. it's not just me, similar silliness also - * occurs in Language::cDeclaration(). - */ - Setattr(n, "type", return_type); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); - Setattr(n, "type", type); if (tm != 0) { static const String *amp_result = NewStringf("&%s", Swig_cresult_name()); Replaceall(tm, "$input", amp_result); @@ -2749,7 +2720,6 @@ /* clean up */ Delete(wrap_args); - Delete(return_type); Delete(pclassname); DelWrapper(w); return status; Modified: trunk/Source/Modules/python.cxx =================================================================== --- trunk/Source/Modules/python.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/python.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -4528,18 +4528,17 @@ int PYTHON::classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; - String *decl; - String *type; - String *name; - String *classname; + String *decl = Getattr(n, "decl"); + String *name = Getattr(n, "name"); + String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); - String *declaration; - ParmList *l; - Wrapper *w; + String *declaration = NewString(""); + ParmList *l = Getattr(n, "parms"); + Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); - String *return_type; + String *return_type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; @@ -4553,35 +4552,15 @@ } } - classname = Getattr(parent, "sym:name"); - type = Getattr(n, "type"); - name = Getattr(n, "name"); - - w = NewWrapper(); - declaration = NewString(""); - /* determine if the method returns a pointer */ - decl = Getattr(n, "decl"); is_pointer = SwigType_ispointer_return(decl); - is_void = (!Cmp(type, "void") && !is_pointer); + is_void = (!Cmp(return_type, "void") && !is_pointer); - /* form complete return type */ - return_type = Copy(type); - { - SwigType *t = Copy(decl); - SwigType *f = 0; - f = SwigType_pop_function(t); - SwigType_push(return_type, t); - Delete(f); - Delete(t); - } - /* virtual method definition */ - l = Getattr(n, "parms"); String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -4898,16 +4877,7 @@ /* marshal return value */ if (!is_void) { - /* this seems really silly. the node's type excludes - * qualifier/pointer/reference markers, which have to be retrieved - * from the decl field to construct return_type. but the typemap - * lookup routine uses the node's type, so we have to swap in and - * out the correct type. it's not just me, similar silliness also - * occurs in Language::cDeclaration(). - */ - Setattr(n, "type", return_type); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); - Setattr(n, "type", type); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); @@ -5009,7 +4979,6 @@ /* clean up */ Delete(wrap_args); - Delete(return_type); Delete(pclassname); DelWrapper(w); return status; Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2012-10-26 19:32:19 UTC (rev 13872) +++ trunk/Source/Modules/ruby.cxx 2012-10-27 17:37:34 UTC (rev 13873) @@ -3017,18 +3017,17 @@ virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; - String *decl; - String *type; - String *name; - String *classname; + String *decl = Getattr(n, "decl"); + String *name = Getattr(n, "name"); + String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); - String *declaration; - ParmList *l; - Wrapper *w; + String *declaration = NewString(""); + ParmList *l = Getattr(n, "parms"); + Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); - String *return_type; + String *return_type = Getattr(n, "type"); Parm *p; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); @@ -3049,35 +3048,15 @@ Printf(overnametmp, "::%s", Getattr(n, "sym:overname")); } - classname = Getattr(parent, "sym:name"); - type = Getattr(n, "type"); - name = Getattr(n, "name"); - - w = NewWrapper(); - declaration = NewString(""); - /* determine if the method returns a pointer */ - decl = Getattr(n, "decl"); is_pointer = SwigType_ispointer_return(decl); - is_void = (!Cmp(type, "void") && !is_pointer); + is_void = (!Cmp(return_type, "void") && !is_pointer); - /* form complete return type */ - return_type = Copy(type); - { - SwigType *t = Copy(decl); - SwigType *f = 0; - f = SwigType_pop_function(t); - SwigType_push(return_type, t); - Delete(f); - Delete(t); - } - /* virtual method definition */ - l = Getattr(n, "parms"); String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); - SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); @@ -3295,14 +3274,7 @@ /* Marshal return value */ if (!is_void) { - /* This seems really silly. The node's type excludes qualifier/pointer/reference markers, - * which have to be retrieved from the decl field to construct return_type. But the typemap - * lookup routine uses the node's type, so we have to swap in and out the correct type. - * It's not just me, similar silliness also occurs in Language::cDeclaration(). - */ - Setattr(n, "type", return_type); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); - Setattr(n, "type", type); if (tm != 0) { if (outputs > 1 && !asvoid ) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); @@ -3390,7 +3362,6 @@ /* clean up */ Delete(wrap_args); - Delete(return_type); Delete(pclassname); DelWrapper(w); return status; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |