From: <ol...@us...> - 2007-04-04 09:40:58
|
Revision: 9670 http://swig.svn.sourceforge.net/swig/?rev=9670&view=rev Author: olly Date: 2007-04-04 02:40:55 -0700 (Wed, 04 Apr 2007) Log Message: ----------- [PHP5] If ZTS is enabled, release <module>_globals_id in MSHUTDOWN to avoid PHP interpreter crash on shutdown. This solution was suggested here: http://bugs.php.net/bug.php?id=40985 Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-03 15:56:36 UTC (rev 9669) +++ trunk/CHANGES.current 2007-04-04 09:40:55 UTC (rev 9670) @@ -1,6 +1,11 @@ Version 1.3.32 (in progress) ============================ +04/04/2007: olly + [PHP5] If ZTS is enabled, release <module>_globals_id in MSHUTDOWN + to avoid PHP interpreter crash on shutdown. This solution was + suggested here: http://bugs.php.net/bug.php?id=40985 + 04/03/2007: olly [PHP4] Add missing ZTS annotations to generated C++ wrapper code to fix compilation failures when using ZTS enabled SWIG (Linux Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2007-04-03 15:56:36 UTC (rev 9669) +++ trunk/Source/Modules/php4.cxx 2007-04-04 09:40:55 UTC (rev 9670) @@ -811,10 +811,14 @@ Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); - Printf(s_init, "PHP_MSHUTDOWN_FUNCTION(%s)\n{\n", module); - Printf(s_init, "%s\n", s_shutdown); - Printf(s_init, " return SUCCESS;\n"); - Printf(s_init, "}\n\n"); + Printv(s_init, "PHP_MSHUTDOWN_FUNCTION(", module, ")\n" + "{\n", + s_shutdown, + "#ifdef ZTS\n" + " ts_free_id(", module, "_globals_id);\n" + "#endif\n" + " return SUCCESS;\n" + "}\n\n", NIL); Printf(s_init, "PHP_RSHUTDOWN_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s\n", r_shutdown); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-10 14:14:56
|
Revision: 9671 http://swig.svn.sourceforge.net/swig/?rev=9671&view=rev Author: olly Date: 2007-04-10 07:14:52 -0700 (Tue, 10 Apr 2007) Log Message: ----------- Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on swig-user that this is needed). Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/swiglabels.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-04 09:40:55 UTC (rev 9670) +++ trunk/CHANGES.current 2007-04-10 14:14:52 UTC (rev 9671) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +04/10/2007: olly + Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on + swig-user that this is needed). + 04/04/2007: olly [PHP5] If ZTS is enabled, release <module>_globals_id in MSHUTDOWN to avoid PHP interpreter crash on shutdown. This solution was Modified: trunk/Lib/swiglabels.swg =================================================================== --- trunk/Lib/swiglabels.swg 2007-04-04 09:40:55 UTC (rev 9670) +++ trunk/Lib/swiglabels.swg 2007-04-10 14:14:52 UTC (rev 9671) @@ -5,14 +5,14 @@ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR -# if defined(__SUNPRO_CC) -# if (__SUNPRO_CC <= 0x560) -# define SWIGTEMPLATEDISAMBIGUATOR template -# else -# define SWIGTEMPLATEDISAMBIGUATOR -# endif +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template # else -# define SWIGTEMPLATEDISAMBIGUATOR +# define SWIGTEMPLATEDISAMBIGUATOR # endif #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-16 15:13:46
|
Revision: 9673 http://swig.svn.sourceforge.net/swig/?rev=9673&view=rev Author: olly Date: 2007-04-16 08:13:45 -0700 (Mon, 16 Apr 2007) Log Message: ----------- [PHP5] Fix how zend_throw_exception() is called (bug #1700785). Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/exception.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-15 23:22:29 UTC (rev 9672) +++ trunk/CHANGES.current 2007-04-16 15:13:45 UTC (rev 9673) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +04/16/2007: olly + [PHP5] Fix how zend_throw_exception() is called (bug #1700785). + 04/10/2007: olly Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on swig-user that this is needed). Modified: trunk/Lib/exception.i =================================================================== --- trunk/Lib/exception.i 2007-04-15 23:22:29 UTC (rev 9672) +++ trunk/Lib/exception.i 2007-04-16 15:13:45 UTC (rev 9673) @@ -20,7 +20,8 @@ #if PHP_MAJOR_VERSION < 5 # define SWIG_exception(code, msg) { zend_error(E_ERROR, msg); } #else -# define SWIG_exception(code, msg) { zend_throw_exception(NULL, msg, code TSRMLS_CC); } +# include "zend_exceptions.h" +# define SWIG_exception(code, msg) { zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC); } #endif %} #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-16 16:42:46
|
Revision: 9674 http://swig.svn.sourceforge.net/swig/?rev=9674&view=rev Author: olly Date: 2007-04-16 09:42:00 -0700 (Mon, 16 Apr 2007) Log Message: ----------- Don't treat `restrict' as a reserved identifier in C++ mode. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Source/CParse/cscanner.c Added Paths: ----------- trunk/Examples/test-suite/restrict_cplusplus.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-16 15:13:45 UTC (rev 9673) +++ trunk/CHANGES.current 2007-04-16 16:42:00 UTC (rev 9674) @@ -2,6 +2,9 @@ ============================ 04/16/2007: olly + Don't treat `restrict' as a reserved identifier in C++ mode. + +04/16/2007: olly [PHP5] Fix how zend_throw_exception() is called (bug #1700785). 04/10/2007: olly Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2007-04-16 15:13:45 UTC (rev 9673) +++ trunk/Examples/test-suite/common.mk 2007-04-16 16:42:00 UTC (rev 9674) @@ -220,6 +220,7 @@ reference_global_vars \ register_par \ rename_scope \ + restrict_cplusplus \ return_const_value \ return_value_scope \ rname \ Added: trunk/Examples/test-suite/restrict_cplusplus.i =================================================================== --- trunk/Examples/test-suite/restrict_cplusplus.i (rev 0) +++ trunk/Examples/test-suite/restrict_cplusplus.i 2007-04-16 16:42:00 UTC (rev 9674) @@ -0,0 +1,7 @@ +%module restrict_cplusplus + +%inline %{ +struct foo { + int restrict; +}; +%} Modified: trunk/Source/CParse/cscanner.c =================================================================== --- trunk/Source/CParse/cscanner.c 2007-04-16 15:13:45 UTC (rev 9673) +++ trunk/Source/CParse/cscanner.c 2007-04-16 16:42:00 UTC (rev 9674) @@ -751,8 +751,6 @@ return (yylex()); if (strcmp(yytext, "mutable") == 0) return (yylex()); - if (strcmp(yytext, "restrict") == 0) - return (yylex()); if (strcmp(yytext, "explicit") == 0) return (EXPLICIT); if (strcmp(yytext, "export") == 0) @@ -780,6 +778,8 @@ yylval.type = NewSwigType(T_COMPLEX); return (TYPE_COMPLEX); } + if (strcmp(yytext, "restrict") == 0) + return (yylex()); } /* Misc keywords */ @@ -812,8 +812,6 @@ return (REGISTER); if (strcmp(yytext, "inline") == 0) return (yylex()); - if (strcmp(yytext, "restrict") == 0) - return (yylex()); /* SWIG directives */ } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-04-17 22:44:36
|
Revision: 9677 http://swig.svn.sourceforge.net/swig/?rev=9677&view=rev Author: wsfulton Date: 2007-04-17 15:44:33 -0700 (Tue, 17 Apr 2007) Log Message: ----------- Add in pre, post and pgcppname attributes for the javain typemap Modified Paths: -------------- trunk/Doc/Manual/Java.html trunk/Source/Modules/java.cxx Modified: trunk/Doc/Manual/Java.html =================================================================== --- trunk/Doc/Manual/Java.html 2007-04-17 22:34:49 UTC (rev 9676) +++ trunk/Doc/Manual/Java.html 2007-04-17 22:44:33 UTC (rev 9677) @@ -126,6 +126,7 @@ <li><a href="#struct_pointer_pointer">Struct pointer to pointer</a> <li><a href="#java_memory_management_member_variables">Memory management when returning references to member variables</a> <li><a href="#java_memory_management_objects">Memory management for objects passed to the C++ layer</a> +<li><a href="#java_date_marshalling">Date marshalling using the javain typemap and associated attributes</a> </ul> <li><a href="#java_directors_faq">Living with Java Directors</a> <li><a href="#odds_ends">Odds and ends</a> @@ -1887,7 +1888,7 @@ <pre> %module example %{ -#include "pair.h" +#include <utility> %} template<class T1, class T2> @@ -4722,8 +4723,11 @@ <p> -There is an additional typemap attribute that the Java module supports. -This is the 'throws' attribute. +There are a few additional typemap attributes that the Java module supports. +</p> + +<p> +The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the <a href="#exception_handling">%javaexception</a> feature's throws attribute. </p> @@ -4749,9 +4753,18 @@ </p> <p> -The "jnitype" typemap has the 'nopgcpp' attribute which can be used to suppress the generation of the <a href="java_pgcpp">premature garbage collection prevention parameter</a>. +The "jnitype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the <a href="java_pgcpp">premature garbage collection prevention parameter</a>. </p> +<p> +The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the <a href="java_pgcpp">premature garbage collection prevention parameter</a> name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function. +</p> + +<p> +<a name="java_constructor_helper_function"></a> +Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a <i>this</i> call. In Java the <i>this</i> call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a <a href="#java_date_marshalling">Date marshalling</a> example showing 'pre', 'post' and 'pgcppname' attributes in action. +</p> + <H3><a name="special_variables"></a>20.8.7 Java special variables</H3> @@ -5631,6 +5644,43 @@ <p> Note that the "javain" typemap is used for every occurrence of a <tt>float</tt> being used as an input. Of course, we could have targeted the typemap at a particular parameter by using <tt>float first</tt>, say, instead of just <tt>float</tt>. +</p> + +<p> +The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. +The "javain" typemap above could be replaced with the following: +</p> + +<div class="code"> +<pre> +%typemap(javain, pre=" $module.CheckForNaN($javainput);") float "$javainput" +</pre> +</div> + +<p> +which would modify the <tt>calculate</tt> function to instead be generated as: +</p> + +<div class="code"> +<pre> +public class example { + ... + public static boolean calculate(float first, float second) { + example.CheckForNaN(first); + example.CheckForNaN(second); + { + return exampleJNI.calculate(first, second); + } + } +} +</pre> +</div> + +<p> +See the <a href="#java_date_marshalling">Date marshalling example</a> for an example using further "javain" typemap attributes. +</p> + +<p> If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses <tt>float</tt> as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' <a href="#typemap_attributes">typemap attribute</a> for specifying classes for the throws clause. @@ -6754,7 +6804,183 @@ </div> +<H3><a name="java_date_marshalling"></a>20.9.13 Date marshalling using the javain typemap and associated attributes</H3> + +<p> +The <a href="#nan_exception_typemap">NaN Exception example</a> is a simple example of the "javain" typemap and its 'pre' attribute. +This example demonstrates how a C++ date class, say <tt>CDate</tt>, can be mapped onto the standard Java date class, +<tt>java.util.GregorianCalendar</tt> by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. +The idea is that the <tt>GregorianCalendar</tt> is used wherever the C++ API uses a <tt>CDate</tt>. +Let's assume the code being wrapped is as follows: +</p> + +<div class="code"> +<pre> +class CDate { +public: + CDate(int year, int month, int day); + int getYear(); + int getMonth(); + int getDay(); + ... +}; +struct Action { + static int doSomething(const CDate &dateIn, CDate &dateOut); + Action(const CDate &date, CDate &dateOut); +}; +</pre> +</div> + +<p> +Note that <tt>dateIn</tt> is const and therefore read only and <tt>dateOut</tt> is a non-const output type. +</p> + +<p> +First let's look at the code that is generated by default, where the Java proxy class <tt>CDate</tt> is used in the proxy interface: +</p> + +<div class="code"> +<pre> +public class Action { + ... + public static int doSomething(CDate dateIn, CDate dateOut) { + return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, + CDate.getCPtr(dateOut), dateOut); + } + + public Action(CDate date, CDate dateOut) { + this(exampleJNI.new_Action(CDate.getCPtr(date), date, + CDate.getCPtr(dateOut), dateOut), true); + } +} +</pre> +</div> + +<p> +The <tt>CDate &</tt> and <tt>const CDate &</tt> Java code is generated from the following two default typemaps: +</p> + +<div class="code"> +<pre> +%typemap(jstype) SWIGTYPE & "$javaclassname" +%typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)" +</pre> +</div> + +<p> +where '$javaclassname' is translated into the proxy class name, <tt>CDate</tt> and '$javainput' is translated into the name of the parameter, eg <tt>dateIn</tt>. +From Java, the intention is then to call into a modifed API with something like: +</p> + +<div class="code"> +<pre> +java.util.GregorianCalendar calendarIn = + new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0); +java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar(); + +// Note in calls below, calendarIn remains unchanged and calendarOut +// is set to a new value by the C++ call +Action.doSomething(calendarIn, calendarOut); +Action action = new Action(calendarIn, calendarOut); +</pre> +</div> + +<p> +To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, +a <tt>GregorianCalendar</tt> is converted into a <tt>CDate</tt>. +The JNI intermediary layer will still take a pointer to the underlying <tt>CDate</tt> class. +The typemaps to achieve this are shown below. +</p> + +<div class="code"> +<pre> +%typemap(jstype) const CDate& "java.util.GregorianCalendar" +%typemap(javain, + pre=" CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), " + "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", + pgcppname="temp$javainput") const CDate & + "$javaclassname.getCPtr(temp$javainput)" + +%typemap(jstype) CDate& "java.util.Calendar" +%typemap(javain, + pre=" CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), " + "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", + post=" $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), " + "temp$javainput.getDay(), 0, 0, 0);", + pgcppname="temp$javainput") CDate & + "$javaclassname.getCPtr(temp$javainput)" +</pre> +</div> + +<p> +The resulting generated proxy code in the <tt>Action</tt> class follows: + </p> + +<div class="code"> +<pre> +public class Action { + ... + public static int doSomething(java.util.GregorianCalendar dateIn, + java.util.Calendar dateOut) { + CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), + dateIn.get(java.util.Calendar.MONTH), + dateIn.get(java.util.Calendar.DATE)); + CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), + dateOut.get(java.util.Calendar.MONTH), + dateOut.get(java.util.Calendar.DATE)); + try { + return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, + CDate.getCPtr(tempdateOut), tempdateOut); + } finally { + dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0); + } + } + + static private long SwigConstructAction(java.util.GregorianCalendar date, + java.util.Calendar dateOut) { + CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), + date.get(java.util.Calendar.MONTH), + date.get(java.util.Calendar.DATE)); + CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), + dateOut.get(java.util.Calendar.MONTH), + dateOut.get(java.util.Calendar.DATE)); + try { + return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, + CDate.getCPtr(tempdateOut), tempdateOut); + } finally { + dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0); + } + } + + public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) { + this(Action.SwigConstructAction(date, dateOut), true); + } +} +</pre> +</div> + +<p> +A few things to note: +</p> +<ul> + <li> The "javatype" typemap has changed the parameter type to <tt>java.util.GregorianCalendar</tt> or <tt>java.util.Calendar</tt> instead of the default generated <tt>CDate</tt> proxy. + <li> The code in the 'pre' attribute appears before the JNI call (<tt>exampleJNI.new_Action</tt> / <tt>exampleJNI.Action_doSomething</tt>). + <li> The code in the 'post' attribute appears after the JNI call. + <li> A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. + The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the + return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap. + <li> The temporary variables in the "javain" typemaps are called <tt>temp$javain</tt>, where "$javain" is replaced with the parameter name. + "$javain" is used to mangle the variable name so that more than one <tt>CDate &</tt> type can be used as a parameter in a method, otherwise two or + more local variables with the same name would be generated. + <li> The use of the "javain" typemap causes a constructor helper function (<tt>SwigConstructAction</tt>) to be generated. + This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call. + <li> The 'pgcppname' attribute is used to modify the object being passed as the <a href="#java_pgcpp">premature garbage collection prevention parameter</a> (the 2nd and 4th parameters in the JNI calls). +</ul> + + + + <H2><a name="java_directors_faq"></a>20.10 Living with Java Directors</H2> Modified: trunk/Source/Modules/java.cxx =================================================================== --- trunk/Source/Modules/java.cxx 2007-04-17 22:34:49 UTC (rev 9676) +++ trunk/Source/Modules/java.cxx 2007-04-17 22:44:33 UTC (rev 9677) @@ -1864,6 +1864,8 @@ String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; + String *pre_code = NewString(""); + String *post_code = NewString(""); if (!proxy_flag) return; @@ -1908,7 +1910,7 @@ /* Start generating the proxy function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); - methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (static_flag) Printf(function_code, "static "); @@ -1977,6 +1979,22 @@ addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); + String *pre = Getattr(p, "tmap:javain:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$javainput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:javain:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$javainput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); @@ -1988,8 +2006,17 @@ gencomma = 2; Printf(function_code, "%s %s", param_type, arg); - if (prematureGarbageCollectionPreventionParameter(pt, p)) - Printf(imcall, ", %s", arg); + if (prematureGarbageCollectionPreventionParameter(pt, p)) { + String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); + if (pgcppname) { + String *argname = Copy(pgcppname); + Replaceall(argname, "$javainput", arg); + Printf(imcall, ", %s", argname); + Delete(argname); + } else { + Printf(imcall, ", %s", arg); + } + } Delete(arg); Delete(param_type); @@ -2003,6 +2030,23 @@ // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in proxy class) if ((tm = Swig_typemap_lookup_new("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap + if (is_post_code) { + Insert(tm, 0, "\n try "); + Printv(tm, " finally {\n", post_code, "\n }", NIL); + } else { + Insert(tm, 0, "\n "); + } + if (is_pre_code) { + Insert(tm, 0, pre_code); + Insert(tm, 0, "\n"); + } + Insert(tm, 0, "{"); + Printf(tm, "\n }"); + } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else @@ -2040,6 +2084,8 @@ Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(proxy_class_code, function_code, NIL); + Delete(pre_code); + Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); @@ -2056,6 +2102,11 @@ Parm *p; int i; String *function_code = NewString(""); + String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the javain typemap has code in the pre or post attributes + String *helper_args = NewString(""); + String *pre_code = NewString(""); + String *post_code = NewString(""); + String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); @@ -2070,8 +2121,14 @@ String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); - methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + + tm = Getattr(n, "tmap:jtype"); // typemaps were attached earlier to the node + Printf(im_return_type, "%s", tm); + Printf(function_code, " %s %s(", methodmods, proxy_class_name); + Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); + Printv(imcall, imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ @@ -2120,19 +2177,49 @@ addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); + String *pre = Getattr(p, "tmap:javain:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$javainput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:javain:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$javainput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ - if (gencomma) + if (gencomma) { Printf(function_code, ", "); + Printf(helper_code, ", "); + Printf(helper_args, ", "); + } Printf(function_code, "%s %s", param_type, arg); + Printf(helper_code, "%s %s", param_type, arg); + Printf(helper_args, "%s", arg); ++gencomma; - if (prematureGarbageCollectionPreventionParameter(pt, p)) - Printf(imcall, ", %s", arg); + if (prematureGarbageCollectionPreventionParameter(pt, p)) { + String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); + if (pgcppname) { + String *argname = Copy(pgcppname); + Replaceall(argname, "$javainput", arg); + Printf(imcall, ", %s", argname); + Delete(argname); + } else { + Printf(imcall, ", %s", arg); + } + } Delete(arg); Delete(param_type); @@ -2142,6 +2229,7 @@ Printf(imcall, ")"); Printf(function_code, ")"); + Printf(helper_code, ")"); generateThrowsClause(n, function_code); /* Insert the javaconstruct typemap, doing the replacement for $directorconnect, as needed */ @@ -2166,10 +2254,36 @@ Printv(function_code, " ", construct_tm, "\n", NIL); } - Replaceall(function_code, "$imcall", imcall); + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + generateThrowsClause(n, helper_code); + Printf(helper_code, " {\n"); + if (is_pre_code) { + Printv(helper_code, pre_code, "\n", NIL); + } + if (is_post_code) { + Printf(helper_code, " try {\n"); + Printv(helper_code, " return ", imcall, ";\n", NIL); + Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); + } else { + Printv(helper_code, " return ", imcall, ";", NIL); + } + Printf(helper_code, "\n }\n"); + String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); + Printv(proxy_class_code, helper_code, "\n", NIL); + Replaceall(function_code, "$imcall", helper_name); + Delete(helper_name); + } else { + Replaceall(function_code, "$imcall", imcall); + } Printv(proxy_class_code, function_code, "\n", NIL); + Delete(helper_args); + Delete(im_return_type); + Delete(pre_code); + Delete(post_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); @@ -2270,6 +2384,8 @@ String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; + String *pre_code = NewString(""); + String *post_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { @@ -2306,7 +2422,7 @@ /* Start generating the function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); - methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); @@ -2345,6 +2461,22 @@ addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); + String *pre = Getattr(p, "tmap:javain:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$javainput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:javain:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$javainput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); @@ -2356,8 +2488,17 @@ gencomma = 2; Printf(function_code, "%s %s", param_type, arg); - if (prematureGarbageCollectionPreventionParameter(pt, p)) - Printf(imcall, ", %s", arg); + if (prematureGarbageCollectionPreventionParameter(pt, p)) { + String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); + if (pgcppname) { + String *argname = Copy(pgcppname); + Replaceall(argname, "$javainput", arg); + Printf(imcall, ", %s", argname); + Delete(argname); + } else { + Printf(imcall, ", %s", arg); + } + } p = Getattr(p, "tmap:in:next"); Delete(arg); @@ -2370,6 +2511,23 @@ // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in module class) if ((tm = Swig_typemap_lookup_new("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap + if (is_post_code) { + Insert(tm, 0, "\n try "); + Printv(tm, " finally {\n", post_code, "\n }", NIL); + } else { + Insert(tm, 0, "\n "); + } + if (is_pre_code) { + Insert(tm, 0, pre_code); + Insert(tm, 0, "\n"); + } + Insert(tm, 0, "{"); + Printf(tm, "\n }"); + } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else @@ -2384,6 +2542,8 @@ Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(module_class_code, function_code, NIL); + Delete(pre_code); + Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-04-17 22:45:18
|
Revision: 9678 http://swig.svn.sourceforge.net/swig/?rev=9678&view=rev Author: wsfulton Date: 2007-04-17 15:45:17 -0700 (Tue, 17 Apr 2007) Log Message: ----------- Add in pre, post and cshin attributes for the csin typemap Modified Paths: -------------- trunk/Doc/Manual/CSharp.html trunk/Source/Modules/csharp.cxx Modified: trunk/Doc/Manual/CSharp.html =================================================================== --- trunk/Doc/Manual/CSharp.html 2007-04-17 22:44:33 UTC (rev 9677) +++ trunk/Doc/Manual/CSharp.html 2007-04-17 22:45:17 UTC (rev 9678) @@ -28,6 +28,7 @@ <ul> <li><a href="#csharp_memory_management_member_variables">Memory management when returning references to member variables</a> <li><a href="#csharp_memory_management_objects">Memory management for objects passed to the C++ layer</a> +<li><a href="#csharp_date_marshalling">Date marshalling using the csin typemap and associated attributes</a> </ul> </ul> </div> @@ -195,7 +196,7 @@ <li> <p> -The intermediary classname has <tt>PINVOKE</tt> appended after the module name instead of <tt>JNI</tt>, for example <tt>modulenamePINVOKE</tt>. +Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports an additional optional attribute called 'cshin'. It should contain the parameter type and name whenever a <a href="Java.html#java_constructor_helper_function">constructor helper function</a> is generated due to the 'pre' or 'post' attributes. Please see the <a href="#csharp_date_marshalling">Date marshalling example</a> for further understanding. </p> </li> @@ -328,6 +329,12 @@ <li> <p> +The intermediary classname has <tt>PINVOKE</tt> appended after the module name instead of <tt>JNI</tt>, for example <tt>modulenamePINVOKE</tt>. +</p> +</li> + +<li> +<p> The <tt>%csmethodmodifiers</tt> feature can also be applied to variables as well as methods. In addition to the default <tt>public</tt> modifier that SWIG generates when <tt>%csmethodmodifiers</tt> is not specified, the feature will also replace the <tt>virtual</tt>/<tt>new</tt>/<tt>override</tt> modifiers that SWIG thinks is appropriate. @@ -450,6 +457,7 @@ SWIG_CSharpArithmeticException, SWIG_CSharpDivideByZeroException, SWIG_CSharpIndexOutOfRangeException, + SWIG_CSharpInvalidCastException, SWIG_CSharpInvalidOperationException, SWIG_CSharpIOException, SWIG_CSharpNullReferenceException, @@ -1241,41 +1249,8 @@ <p> -There are a few gotchas with directors. -The first is that the base class virtual method should not be called directly otherwise a stack overflow will occur due to recursive calls. -This might be fixed in a future version of SWIG, but is likely to slow down virtual methods calls. -For example, given <tt>Base</tt> as a director enabled class: -</p> - - -<div class="code"> -<pre> -class Base { -public: - virtual ~Base(); - virtual unsigned int UIntMethod(unsigned int x); -}; -</pre> -</div> - -<p> -Do not directly call the base method from a C# derived class: -</p> - -<div class="code"> -<pre> -public class CSharpDerived : Base -{ - public override uint UIntMethod(uint x) - { - return base.UIntMethod(x); - } -} -</pre> -</div> - -<p> -Secondly, if default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. +There is a subtle gotcha with directors. +If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class: </p> @@ -1569,6 +1544,183 @@ </div> +<H3><a name="csharp_date_marshalling"></a>17.5.3 Date marshalling using the csin typemap and associated attributes</H3> + + +<p> +The <a href="Java.html#nan_exception_typemap">NaN Exception example</a> is a simple example of the "javain" typemap and its 'pre' attribute. +This example demonstrates how a C++ date class, say <tt>CDate</tt>, can be mapped onto the standard .NET date class, +<tt>System.DateTime</tt> by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). +The example is an equivalent to the <a href="Java.html#java_date_marshalling">Java Date marshalling example</a>. +The idea is that the <tt>System.DateTime</tt> is used wherever the C++ API uses a <tt>CDate</tt>. +Let's assume the code being wrapped is as follows: +</p> + +<div class="code"> +<pre> +class CDate { +public: + CDate(int year, int month, int day); + int getYear(); + int getMonth(); + int getDay(); + ... +}; +struct Action { + static int doSomething(const CDate &dateIn, CDate &dateOut); + Action(const CDate &date, CDate &dateOut); +}; +</pre> +</div> + +<p> +Note that <tt>dateIn</tt> is const and therefore read only and <tt>dateOut</tt> is a non-const output type. +</p> + +<p> +First let's look at the code that is generated by default, where the C# proxy class <tt>CDate</tt> is used in the proxy interface: +</p> + +<div class="code"> +<pre> +public class Action : IDisposable { + ... + public Action(CDate dateIn, CDate dateOut) + : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) { + if (examplePINVOKE.SWIGPendingException.Pending) + throw examplePINVOKE.SWIGPendingException.Retrieve(); + } + + public int doSomething(CDate dateIn, CDate dateOut) { + int ret = examplePINVOKE.Action_doSomething(swigCPtr, + CDate.getCPtr(dateIn), + CDate.getCPtr(dateOut)); + if (examplePINVOKE.SWIGPendingException.Pending) + throw examplePINVOKE.SWIGPendingException.Retrieve(); + return ret; + } +} +</pre> +</div> + +<p> +The <tt>CDate &</tt> and <tt>const CDate &</tt> C# code is generated from the following two default typemaps: +</p> + +<div class="code"> +<pre> +%typemap(jstype) SWIGTYPE & "$csclassname" +%typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)" +</pre> +</div> + +<p> +where '$csclassname' is translated into the proxy class name, <tt>CDate</tt> and '$csinput' is translated into the name of the parameter, eg <tt>dateIn</tt>. +From C#, the intention is then to call into a modifed API with something like: +</p> + +<div class="code"> +<pre> +System.DateTime dateIn = new System.DateTime(2011, 4, 13); +System.DateTime dateOut = new System.DateTime(); + +// Note in calls below, dateIn remains unchanged and dateOut +// is set to a new value by the C++ call +Action action = new Action(dateIn, ref dateOut); +dateIn = new System.DateTime(2012, 7, 14); +</pre> +</div> + +<p> +To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, +a <tt>System.DateTime</tt> is converted into a <tt>CDate</tt>. +The intermediary layer will still take a pointer to the underlying <tt>CDate</tt> class. +The typemaps to achieve this are shown below. +</p> + +<div class="code"> +<pre> +%typemap(cstype) const CDate& "System.DateTime" +%typemap(csin, + pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);") + const CDate & + "$csclassname.getCPtr(temp$csinput)" + +%typemap(cstype) CDate& "ref System.DateTime" +%typemap(csin, + pre=" CDate temp$csinput = new CDate();", + post=" $csinput = new System.DateTime(temp$csinput.getYear()," + " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", + cshin="ref $csinput") CDate & + "$csclassname.getCPtr(temp$csinput)" + +</pre> +</div> + +<p> +The resulting generated proxy code in the <tt>Action</tt> class follows: + </p> + +<div class="code"> +<pre> +public class Action : IDisposable { + ... + public int doSomething(System.DateTime dateIn, ref System.DateTime dateOut) { + CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day); + CDate tempdateOut = new CDate(); + try { + int ret = examplePINVOKE.Action_doSomething(swigCPtr, + CDate.getCPtr(tempdateIn), + CDate.getCPtr(tempdateOut)); + if (examplePINVOKE.SWIGPendingException.Pending) + throw examplePINVOKE.SWIGPendingException.Retrieve(); + return ret; + } finally { + dateOut = new System.DateTime(tempdateOut.getYear(), + tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0); + } + } + + static private IntPtr SwigConstructAction(System.DateTime dateIn, ref System.DateTime dateOut) { + CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day); + CDate tempdateOut = new CDate(); + try { + return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut)); + } finally { + dateOut = new System.DateTime(tempdateOut.getYear(), + tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0); + } + } + + public Action(System.DateTime dateIn, ref System.DateTime dateOut) + : this(Action.SwigConstructAction(dateIn, ref dateOut), true) { + if (examplePINVOKE.SWIGPendingException.Pending) + throw examplePINVOKE.SWIGPendingException.Retrieve(); + } +} +</pre> +</div> + +<p> +A few things to note: +</p> +<ul> + <li> The "cstype" typemap has changed the parameter type to <tt>System.DateTime</tt> instead of the default generated <tt>CDate</tt> proxy. + <li> The non-const <tt>CDate &</tt> type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead. + <li> The code in the 'pre' attribute appears before the intermediary call (<tt>examplePINVOKE.new_Action</tt> / <tt>examplePINVOKE.Action_doSomething</tt>). + <li> The code in the 'post' attribute appears after the intermediary call. + <li> A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. + The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the + return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap). + <li> The temporary variables in the "csin" typemaps are called <tt>temp$csin</tt>, where "$csin" is replaced with the parameter name. + "$csin" is used to mangle the variable name so that more than one <tt>CDate &</tt> type can be used as a parameter in a method, otherwise two or + more local variables with the same name would be generated. + <li> The use of the "csin" typemap causes a constructor helper function (<tt>SwigConstructAction</tt>) to be generated. + This allows C# code to be called before the intermediary call made in the constructor initialization list. + <li> The 'cshin' attribute is required for the <tt>SwigConstructAction</tt> constructor helper function so that the 2nd parameter is declared as <tt>ref dateOut</tt> instead of just <tt>dateOut</tt>. +</ul> + + </body> </html> Modified: trunk/Source/Modules/csharp.cxx =================================================================== --- trunk/Source/Modules/csharp.cxx 2007-04-17 22:44:33 UTC (rev 9677) +++ trunk/Source/Modules/csharp.cxx 2007-04-17 22:45:17 UTC (rev 9678) @@ -1854,6 +1854,8 @@ String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; + String *pre_code = NewString(""); + String *post_code = NewString(""); if (!proxy_flag) return; @@ -1983,6 +1985,22 @@ if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); + String *pre = Getattr(p, "tmap:csin:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$csinput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:csin:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$csinput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); @@ -2005,6 +2023,24 @@ // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in proxy class) if ((tm = Swig_typemap_lookup_new("csout", n, "", 0))) { + excodeSubstitute(n, tm, "csout", n); + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap + if (is_post_code) { + Insert(tm, 0, "\n try "); + Printv(tm, " finally {\n", post_code, "\n }", NIL); + } else { + Insert(tm, 0, "\n "); + } + if (is_pre_code) { + Insert(tm, 0, pre_code); + Insert(tm, 0, "\n"); + } + Insert(tm, 0, "{"); + Printf(tm, "\n }"); + } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else @@ -2033,7 +2069,6 @@ Delete(excode); } Replaceall(tm, "$imcall", imcall); - excodeSubstitute(n, tm, "csout", n); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } @@ -2097,6 +2132,8 @@ Printv(proxy_class_code, function_code, NIL); } + Delete(pre_code); + Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); @@ -2113,6 +2150,11 @@ Parm *p; int i; String *function_code = NewString(""); + String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the csin typemap has code in the pre or post attributes + String *helper_args = NewString(""); + String *pre_code = NewString(""); + String *post_code = NewString(""); + String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); @@ -2127,11 +2169,22 @@ String *imcall = NewString(""); const String *csattributes = Getattr(n, "feature:cs:attributes"); - if (csattributes) + if (csattributes) { Printf(function_code, " %s\n", csattributes); + Printf(helper_code, " %s\n", csattributes); + } const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + + tm = Getattr(n, "tmap:imtype"); // typemaps were attached earlier to the node + 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; + Printf(im_return_type, "%s", tm); + Printf(function_code, " %s %s(", methodmods, proxy_class_name); + Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); + Printv(imcall, imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ @@ -2174,22 +2227,48 @@ Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); + String *cshin = 0; // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); + String *pre = Getattr(p, "tmap:csin:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$csinput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:csin:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$csinput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } + cshin = Getattr(p, "tmap:csin:cshin"); + if (cshin) + Replaceall(cshin, "$csinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ - if (gencomma) + if (gencomma) { Printf(function_code, ", "); + Printf(helper_code, ", "); + Printf(helper_args, ", "); + } Printf(function_code, "%s %s", param_type, arg); + Printf(helper_code, "%s %s", param_type, arg); + Printf(helper_args, "%s", cshin ? cshin : arg); ++gencomma; + Delete(cshin); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); @@ -2198,6 +2277,7 @@ Printf(imcall, ")"); Printf(function_code, ")"); + Printf(helper_code, ")"); /* Insert the csconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); @@ -2221,10 +2301,40 @@ Printv(function_code, " ", construct_tm, NIL); } - Replaceall(function_code, "$imcall", imcall); excodeSubstitute(n, function_code, "csconstruct", attributes); + + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + Printf(helper_code, " {\n"); + if (is_pre_code) { + Printv(helper_code, pre_code, "\n", NIL); + } + if (is_post_code) { + Printf(helper_code, " try {\n"); + Printv(helper_code, " return ", imcall, ";\n", NIL); + Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); + } else { + Printv(helper_code, " return ", imcall, ";", NIL); + } + Printf(helper_code, "\n }\n"); + String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); + String *im_outattribute = Getattr(n, "tmap:imtype:outattributes"); + if (im_outattribute) + Printf(proxy_class_code, " %s\n", im_outattribute); + Printv(proxy_class_code, helper_code, "\n", NIL); + Replaceall(function_code, "$imcall", helper_name); + Delete(helper_name); + } else { + Replaceall(function_code, "$imcall", imcall); + } + Printv(proxy_class_code, function_code, "\n", NIL); + Delete(helper_args); + Delete(im_return_type); + Delete(pre_code); + Delete(post_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); @@ -2340,6 +2450,8 @@ String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; + String *pre_code = NewString(""); + String *post_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { @@ -2425,6 +2537,22 @@ if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); + String *pre = Getattr(p, "tmap:csin:pre"); + if (pre) { + substituteClassname(pt, pre); + Replaceall(pre, "$csinput", arg); + if (Len(pre_code) > 0) + Printf(pre_code, "\n"); + Printv(pre_code, pre, NIL); + } + String *post = Getattr(p, "tmap:csin:post"); + if (post) { + substituteClassname(pt, post); + Replaceall(post, "$csinput", arg); + if (Len(post_code) > 0) + Printf(post_code, "\n"); + Printv(post_code, post, NIL); + } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); @@ -2446,13 +2574,30 @@ // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in module class) if ((tm = Swig_typemap_lookup_new("csout", n, "", 0))) { + excodeSubstitute(n, tm, "csout", n); + bool is_pre_code = Len(pre_code) > 0; + bool is_post_code = Len(post_code) > 0; + if (is_pre_code || is_post_code) { + Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap + if (is_post_code) { + Insert(tm, 0, "\n try "); + Printv(tm, " finally {\n", post_code, "\n }", NIL); + } else { + Insert(tm, 0, "\n "); + } + if (is_pre_code) { + Insert(tm, 0, pre_code); + Insert(tm, 0, "\n"); + } + Insert(tm, 0, "{"); + Printf(tm, "\n }"); + } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); - excodeSubstitute(n, tm, "csout", n); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } @@ -2516,6 +2661,8 @@ Printv(module_class_code, function_code, NIL); } + Delete(pre_code); + Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-20 01:16:37
|
Revision: 9684 http://swig.svn.sourceforge.net/swig/?rev=9684&view=rev Author: olly Date: 2007-04-19 18:16:31 -0700 (Thu, 19 Apr 2007) Log Message: ----------- [Python] Fix lack of generation of docstrings when -O is used. Also, fix generation of docstrings containing a double quote character. Patch from Richard Boulton in bug#1700146. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/python/check.list trunk/Source/Modules/python.cxx Added Paths: ----------- trunk/Examples/python/docstrings/ trunk/Examples/python/docstrings/Makefile trunk/Examples/python/docstrings/example.cxx trunk/Examples/python/docstrings/example.h trunk/Examples/python/docstrings/example.i trunk/Examples/python/docstrings/runme.py Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-18 16:24:46 UTC (rev 9683) +++ trunk/CHANGES.current 2007-04-20 01:16:31 UTC (rev 9684) @@ -1,6 +1,11 @@ Version 1.3.32 (in progress) ============================ +04/20/2007: olly + [Python] Fix lack of generation of docstrings when -O is used. + Also, fix generation of docstrings containing a double quote + character. Patch from Richard Boulton in bug#1700146. + 04/17/2007: wsfulton [Java, C#] Support for adding in Java/C# code before and after the intermediary call, specifically related to the marshalling of the proxy type to the intermediary type. Modified: trunk/Examples/python/check.list =================================================================== --- trunk/Examples/python/check.list 2007-04-18 16:24:46 UTC (rev 9683) +++ trunk/Examples/python/check.list 2007-04-20 01:16:31 UTC (rev 9684) @@ -3,6 +3,7 @@ class constants contract +docstrings enum exception exceptshadow Added: trunk/Examples/python/docstrings/Makefile =================================================================== --- trunk/Examples/python/docstrings/Makefile (rev 0) +++ trunk/Examples/python/docstrings/Makefile 2007-04-20 01:16:31 UTC (rev 9684) @@ -0,0 +1,23 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +LIBS = -lm +SWIGOPT = -O + +all:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' python_cpp + +static:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' \ + TARGET='mypython' INTERFACE='$(INTERFACE)' python_cpp_static + +clean:: + $(MAKE) -f $(TOP)/Makefile python_clean + rm -f $(TARGET).py + +check: all Added: trunk/Examples/python/docstrings/example.cxx =================================================================== --- trunk/Examples/python/docstrings/example.cxx (rev 0) +++ trunk/Examples/python/docstrings/example.cxx 2007-04-20 01:16:31 UTC (rev 9684) @@ -0,0 +1,4 @@ +#include "example.h" + +void Foo::bar() {} + Added: trunk/Examples/python/docstrings/example.h =================================================================== --- trunk/Examples/python/docstrings/example.h (rev 0) +++ trunk/Examples/python/docstrings/example.h 2007-04-20 01:16:31 UTC (rev 9684) @@ -0,0 +1,4 @@ +class Foo { + public: + void bar(); +}; Added: trunk/Examples/python/docstrings/example.i =================================================================== --- trunk/Examples/python/docstrings/example.i (rev 0) +++ trunk/Examples/python/docstrings/example.i 2007-04-20 01:16:31 UTC (rev 9684) @@ -0,0 +1,14 @@ +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* %feature("docstring") has to come before the declaration of the method to + * SWIG. */ +%feature("docstring") Foo::bar "No comment" + +/* Let's just grab the original header file here */ +%include "example.h" + Added: trunk/Examples/python/docstrings/runme.py =================================================================== --- trunk/Examples/python/docstrings/runme.py (rev 0) +++ trunk/Examples/python/docstrings/runme.py 2007-04-20 01:16:31 UTC (rev 9684) @@ -0,0 +1,6 @@ +# file: runme.py + +import example + +print "example.Foo.bar.__doc__ =", repr(example.Foo.bar.__doc__), "(Should be 'No comment')" + Modified: trunk/Source/Modules/python.cxx =================================================================== --- trunk/Source/Modules/python.cxx 2007-04-18 16:24:46 UTC (rev 9683) +++ trunk/Source/Modules/python.cxx 2007-04-20 01:16:31 UTC (rev 9684) @@ -1419,19 +1419,26 @@ Printf(methods, "\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS, ", name, function); } - if (n && Getattr(n, "feature:callback")) { + if (!n) { + Append(methods, "NULL"); + } else if (Getattr(n, "feature:callback")) { if (have_docstring(n)) { String *ds = docstring(n, AUTODOC_FUNC, "", false); Replaceall(ds, "\n", "\\n"); + Replaceall(ds, "\"", "\\\""); Printf(methods, "(char *)\"%s\\nswig_ptr: %s\"", ds, Getattr(n, "feature:callback:name")); } else { Printf(methods, "(char *)\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); } + } else if (have_docstring(n)) { + String *ds = docstring(n, AUTODOC_FUNC, "", false); + Replaceall(ds, "\n", "\\n"); + Replaceall(ds, "\"", "\\\""); + Printf(methods, "(char *)\"%s\"", ds); } else { Append(methods, "NULL"); } - Append(methods, "},\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-21 16:00:06
|
Revision: 9688 http://swig.svn.sourceforge.net/swig/?rev=9688&view=rev Author: olly Date: 2007-04-21 09:00:02 -0700 (Sat, 21 Apr 2007) Log Message: ----------- Fix parsing of float constants with an exponent (e.g. 1e-02f) (bug #1699646). Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/primitive_types.i trunk/Source/Swig/scanner.c Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-21 09:26:31 UTC (rev 9687) +++ trunk/CHANGES.current 2007-04-21 16:00:02 UTC (rev 9688) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +04/21/2007: olly + Fix parsing of float constants with an exponent (e.g. 1e-02f) + (bug #1699646). + 04/20/2007: olly [Python] Fix lack of generation of docstrings when -O is used. Also, fix generation of docstrings containing a double quote Modified: trunk/Examples/test-suite/primitive_types.i =================================================================== --- trunk/Examples/test-suite/primitive_types.i 2007-04-21 09:26:31 UTC (rev 9687) +++ trunk/Examples/test-suite/primitive_types.i 2007-04-21 16:00:02 UTC (rev 9688) @@ -598,6 +598,12 @@ return x + y; } + // Regression test for bug1699646 - we weren't handling + // + or - after e for float constants. + float regression_test_for_bug1699646(float f = 1e-02f) { + return f; + } + float val_float(float x) { return x; } Modified: trunk/Source/Swig/scanner.c =================================================================== --- trunk/Source/Swig/scanner.c 2007-04-21 09:26:31 UTC (rev 9687) +++ trunk/Source/Swig/scanner.c 2007-04-21 16:00:02 UTC (rev 9688) @@ -749,7 +749,7 @@ if (c == '.') { state = 81; } else if ((c == 'e') || (c == 'E')) { - state = 86; + state = 82; } else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; @@ -770,10 +770,13 @@ if (isdigit(c)) state = 81; else if ((c == 'e') || (c == 'E')) - state = 82; - else if ((c == 'f') || (c == 'F') || (c == 'l') || (c == 'L')) { + state = 820; + else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; + } else if ((c == 'l') || (c == 'L')) { + Delitem(s->text, DOH_END); + return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return (SWIG_TOKEN_DOUBLE); @@ -791,6 +794,19 @@ return (SWIG_TOKEN_INT); } break; + case 820: + /* Like case 82, but we've seen a decimal point. */ + if ((c = nextchar(s)) == 0) { + retract(s, 1); + return SWIG_TOKEN_DOUBLE; + } + if ((isdigit(c)) || (c == '-') || (c == '+')) + state = 86; + else { + retract(s, 2); + return (SWIG_TOKEN_DOUBLE); + } + break; case 83: /* Might be a hexadecimal or octal number */ if ((c = nextchar(s)) == 0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-04-30 17:53:06
|
Revision: 9723 http://swig.svn.sourceforge.net/swig/?rev=9723&view=rev Author: gga73 Date: 2007-04-30 10:53:04 -0700 (Mon, 30 Apr 2007) Log Message: ----------- An improvement to error reporting and more tests added to std::vector. Modified Paths: -------------- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Lib/ruby/rubyerrors.swg trunk/Lib/ruby/rubystdcommon.swg Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-04-30 09:49:58 UTC (rev 9722) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-04-30 17:53:04 UTC (rev 9723) @@ -52,6 +52,7 @@ @iv.unshift(7, 3) @iv.insert(1,5) @iv.insert(0, 3) +@iv.unshift(2,3,4) x = average(@iv) y = average([1, 2, 3, 4]) half([10, 10.5, 11, 11.5]) Modified: trunk/Lib/ruby/rubyerrors.swg =================================================================== --- trunk/Lib/ruby/rubyerrors.swg 2007-04-30 09:49:58 UTC (rev 9722) +++ trunk/Lib/ruby/rubyerrors.swg 2007-04-30 17:53:04 UTC (rev 9723) @@ -105,9 +105,7 @@ str = rb_str_new(NULL, 0); } - str = rb_str_cat2( str, "in method '" ); - str = rb_str_cat2( str, name ); - str = rb_str_cat2( str, "', argument " ); + str = rb_str_cat2( str, "Expected argument " ); sprintf( buf, "%d of type ", argn-1 ); str = rb_str_cat2( str, buf ); str = rb_str_cat2( str, type ); @@ -125,5 +123,12 @@ str = rb_str_append( str, asStr ); } + if ( name ) + { + str = rb_str_cat2( str, "\n\tin SWIG method '" ); + str = rb_str_cat2( str, name ); + str = rb_str_cat2( str, "'\n" ); + } + return StringValuePtr( str ); } Modified: trunk/Lib/ruby/rubystdcommon.swg =================================================================== --- trunk/Lib/ruby/rubystdcommon.swg 2007-04-30 09:49:58 UTC (rev 9722) +++ trunk/Lib/ruby/rubystdcommon.swg 2007-04-30 17:53:04 UTC (rev 9723) @@ -111,11 +111,11 @@ Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { + if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name<Type>()); } - if (throw_error) throw std::invalid_argument("bad type"); } return v; } @@ -136,12 +136,12 @@ } } else { // Uninitialized return value, no Type() constructor required. - static Type *v_def = (Type*) malloc(sizeof(Type)); + if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name<Type>()); } - if (throw_error) throw std::invalid_argument("bad type"); + static Type *v_def = (Type*) malloc(sizeof(Type)); memset(v_def,0,sizeof(Type)); return *v_def; } @@ -156,11 +156,11 @@ if (SWIG_IsOK(res)) { return v; } else { + if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name<Type>()); } - if (throw_error) throw std::invalid_argument("bad type"); return 0; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-04-30 20:40:33
|
Revision: 9726 http://swig.svn.sourceforge.net/swig/?rev=9726&view=rev Author: wsfulton Date: 2007-04-30 13:40:17 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Fix for building from read-only source directories - Bug #1707582 Modified Paths: -------------- trunk/CHANGES.current trunk/Makefile.in trunk/Tools/mkdist.py Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-30 19:26:18 UTC (rev 9725) +++ trunk/CHANGES.current 2007-04-30 20:40:17 UTC (rev 9726) @@ -14,6 +14,9 @@ director method is used as a C++ callback and not called by the user from ruby code. +04/30/2007: wsfulton + Fix #1707582 - Restore building from read-only source directories. + 04/30/2007: gga [Ruby] Ruby will now report the parameter index properly on type @@ -145,7 +148,6 @@ investigation. (bug #1700535 and patch #1702907) - 04/21/2007: olly Fix parsing of float constants with an exponent (e.g. 1e-02f) (bug #1699646). Modified: trunk/Makefile.in =================================================================== --- trunk/Makefile.in 2007-04-30 19:26:18 UTC (rev 9725) +++ trunk/Makefile.in 2007-04-30 20:40:17 UTC (rev 9726) @@ -26,8 +26,12 @@ libfiles: $(srcdir)/Lib/swigwarn.swg -.PHONY: source libfiles +# Files required just for the tarball +maintainer: libfiles + @cd $(SOURCE) && $(MAKE) CParse/parser.h +.PHONY: source libfiles maintainer + ##################################################################### # All the languages SWIG speaks (when it wants to) ##################################################################### @@ -298,6 +302,9 @@ @echo cleaning Docs @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) -s clean +maintainer-clean: clean-libfiles + @cd $(SOURCE) && $(MAKE) maintainer-clean + ##################################################################### # DISTCLEAN ##################################################################### Modified: trunk/Tools/mkdist.py =================================================================== --- trunk/Tools/mkdist.py 2007-04-30 19:26:18 UTC (rev 9725) +++ trunk/Tools/mkdist.py 2007-04-30 20:40:17 UTC (rev 9726) @@ -48,7 +48,7 @@ print "Building system" os.system("cd "+dirname+"; ./autogen.sh") os.system("cd "+dirname+"/Tools/WAD; autoconf") -os.system("cd "+dirname+"/Source/CParse; bison -y -d parser.y; mv y.tab.c parser.c; mv y.tab.h parser.h") +os.system("make maintainer") # Remove autoconf files os.system("find "+dirname+" -name autom4te.cache -exec rm -rf {} \\;"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 01:08:31
|
Revision: 9730 http://swig.svn.sourceforge.net/swig/?rev=9730&view=rev Author: gga73 Date: 2007-04-30 18:08:17 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Fixes to std_map and multimap. There's still a problem of const correctness in the std swig STL library. Need to bring it up in the swig-devel list. Added new functions to swig_assert. Changed some tests to reflect these changes. Modified Paths: -------------- trunk/Examples/test-suite/li_std_pair.i trunk/Examples/test-suite/li_std_wstring.i trunk/Examples/test-suite/ruby/abstract_access_runme.rb trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb trunk/Examples/test-suite/ruby/abstract_signature_runme.rb trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb trunk/Examples/test-suite/ruby/anonymous_bitfield_runme.rb trunk/Examples/test-suite/ruby/apply_signed_char_runme.rb trunk/Examples/test-suite/ruby/apply_strings_runme.rb trunk/Examples/test-suite/ruby/argout_runme.rb trunk/Examples/test-suite/ruby/li_std_pair_runme.rb trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Examples/test-suite/ruby/newobject1_runme.rb trunk/Examples/test-suite/ruby/newobject2_runme.rb trunk/Examples/test-suite/ruby/swig_assert.rb trunk/Lib/ruby/rubyclasses.swg trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_map.i trunk/Lib/ruby/std_multimap.i trunk/Lib/ruby/std_pair.i trunk/Lib/std/std_pair.i Modified: trunk/Examples/test-suite/li_std_pair.i =================================================================== --- trunk/Examples/test-suite/li_std_pair.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/li_std_pair.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -3,7 +3,8 @@ %include "std_pair.i" namespace std { - %template(IntPair) pair<int, int>; + %template(IntPair) pair<int, int>; + %template(ValuePair) pair< swig::LANGUAGE_OBJ, swig::LANGUAGE_OBJ >; } %inline %{ Modified: trunk/Examples/test-suite/li_std_wstring.i =================================================================== --- trunk/Examples/test-suite/li_std_wstring.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/li_std_wstring.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -1,11 +1,16 @@ %module li_std_wstring +%include <std_basic_string.i> %include <std_wstring.i> %inline %{ -#include <string> -typedef std::wstring A; +struct A : std::wstring +{ + A(const std::wstring& s) : std::wstring(s) + { + } +}; struct B { @@ -16,18 +21,10 @@ char *cname; std::wstring name; A a; - A typedefmethod(A a) { - return a; - } -}; -A globala; +}; -wchar_t test_wcvalue_w() { - return L'W'; -} - wchar_t test_wcvalue(wchar_t x) { return x; } Modified: trunk/Examples/test-suite/ruby/abstract_access_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_access_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/abstract_access_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -15,19 +15,19 @@ begin a = A.new rescue TypeError - swig_assert(true, 'A.new') + swig_assert(true, binding, 'A.new') end begin b = B.new rescue TypeError - swig_assert(true, 'B.new') + swig_assert(true, binding, 'B.new') end begin c = C.new rescue TypeError - swig_assert(true, 'C.new') + swig_assert(true, binding, 'C.new') end swig_assert( 'D.new' ) Modified: trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -28,7 +28,7 @@ # TypeError: allocator undefined for Abstract_inherit_ok::Foo exceptionRaised = true ensure - swig_assert( exceptionRaised, "for !exceptionRaised" ) + swig_assert( "exceptionRaised", binding ) end # @@ -43,6 +43,6 @@ rescue NameError exceptionRaised = true ensure - swig_assert( !exceptionRaised, "for exceptionRaised" ) + swig_assert( "!exceptionRaised", binding ) end Modified: trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -29,7 +29,7 @@ # TypeError: allocator undefined for Abstract_inherit::Foo exceptionRaised = true ensure - swig_assert( exceptionRaised, "exceptionRaised") + swig_assert( "exceptionRaised", binding ) end exceptionRaised = false @@ -42,7 +42,7 @@ # TypeError: allocator undefined for Abstract_inherit::Bar exceptionRaised = true ensure - swig_assert( exceptionRaised, "exceptionRaised") + swig_assert( "exceptionRaised", binding ) end exceptionRaised = false @@ -55,7 +55,7 @@ # TypeError: allocator undefined for Abstract_inherit::Spam exceptionRaised = true ensure - swig_assert( exceptionRaised, "exceptionRaised") + swig_assert( "exceptionRaised", binding ) end Modified: trunk/Examples/test-suite/ruby/abstract_signature_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_signature_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/abstract_signature_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -33,7 +33,7 @@ # TypeError: allocator undefined for Abstract_signature::Abstract_foo exceptionRaised = true ensure - swig_assert( exceptionRaised, "for exceptionRaised") + swig_assert( "exceptionRaised", binding) end # @@ -57,6 +57,6 @@ # TypeError: allocator undefined for Abstract_signature::Abstract_bar exceptionRaised = true ensure - swig_assert( exceptionRaised, "for exceptionRaised") + swig_assert( "exceptionRaised", binding) end Modified: trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -13,8 +13,11 @@ include Abstract_typedef +swig_assert_each_line(<<'EOF', binding) + e = Engine.new a = A.new +a.write(e) -swig_assert( a.write(e), 'for a.write(e)' ) +EOF Modified: trunk/Examples/test-suite/ruby/anonymous_bitfield_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/anonymous_bitfield_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/anonymous_bitfield_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -21,7 +21,7 @@ 'seq' => 3 }.each do |m, v| foo.send("#{m}=", v) val = foo.send(m) - swig_assert(val == v, " for foo.#{m} == #{v}, was #{val}") + swig_assert("val == v", binding) end {'x' => (1 << 4), @@ -31,5 +31,5 @@ 'seq' => (1 << (4*8-6)) }.each do |m, v| foo.send("#{m}=", v) val = foo.send(m) - swig_assert(val != v, " for foo.#{m} != #{v}, was #{val}") + swig_assert("val != v", binding) end Modified: trunk/Examples/test-suite/ruby/apply_signed_char_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/apply_signed_char_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/apply_signed_char_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -16,7 +16,7 @@ ['CharValFunction', 'CCharValFunction', 'CCharRefFunction'].each do |m| [ 3, -3 ].each do |v| val = send( m, v ) - swig_assert( v == val, "for #{m} #{val} == #{v} ") + swig_assert( "v == val", binding, "for #{m}") end end @@ -24,7 +24,7 @@ 'globalconstchar' => -110, }.each do |k,v| val = Apply_signed_char.send( k ) - swig_assert( v == val, "for #{k} #{val} == #{v} ") + swig_assert( "v == val", binding, "for #{k}") end @@ -33,7 +33,7 @@ ['CharValFunction', 'CCharValFunction', 'CCharRefFunction'].each do |m| [ 3, -3 ].each do |v| val = a.send( m, v ) - swig_assert( v == val, "for DirectorTest.#{m} #{val} == #{v} ") + swig_assert( "v == val", binding, "for DirectorTest.#{m}") end end @@ -41,5 +41,5 @@ 'memberconstchar' => -112, }.each do |k,v| val = a.send( k ) - swig_assert( v == val, "for #{k} #{val} == #{v} ") + swig_assert( "v == val", binding, "for #{k}") end Modified: trunk/Examples/test-suite/ruby/apply_strings_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/apply_strings_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/apply_strings_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -22,14 +22,14 @@ ['UCharFunction', 'SCharFunction', 'CUCharFunction', 'CSCharFunction'].each do |m| val = Apply_strings.send(m, ptr) - swig_assert( val == ptr, "Apply_strings.#{m} #{val} == #{ptr}" ) + swig_assert( "val == ptr", binding ) end ['CharFunction', 'CCharFunction'].each do |m| begin val = Apply_strings.send(m, ptr) - swig_assert( false, "Apply_strings.#{m} should raise TypeError" ) + swig_assert( false, nil, "Apply_strings.#{m} should raise TypeError" ) rescue TypeError end end @@ -39,14 +39,14 @@ ['UCharFunction', 'SCharFunction', 'CUCharFunction', 'CSCharFunction'].each do |m| val = foo.send(m, ptr) - swig_assert( val == ptr, "DirectorTest.#{m} #{val} == #{ptr}" ) + swig_assert( "val == ptr", binding, "DirectorTest.#{m}" ) end ['CharFunction', 'CCharFunction'].each do |m| begin val = foo.send(m, ptr) - swig_assert( false, "DirectorTest.#{m} should raise TypeError" ) + swig_assert( false, nil, "DirectorTest.#{m} should raise TypeError" ) rescue TypeError end end Modified: trunk/Examples/test-suite/ruby/argout_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/argout_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/argout_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -12,27 +12,29 @@ include Argout +swig_assert_each_line(<<'EOF', binding) + t = new_intp intp_assign(t, 5) v = incp(t) -swig_assert( v == 5, "incp - v == 5 was #{v}") val = intp_value(t) -swig_assert( val == 6, "incp - intp_value(t) == 6 was #{val}") +val == 6 t = new_intp intp_assign(t, 5) v = incr(t) -swig_assert( v == 5, "incr - v == 5 was #{v}") +v == 5 val = intp_value(t) -swig_assert( val == 6, "incr - intp_value(t) == 6 was #{val}") +val == 6 t = new_intp intp_assign(t, 5) v = inctr(t) -swig_assert( v == 5, "inctr - v == 5 was #{v}") +v == 5 val = intp_value(t) -swig_assert( val == 6, "inctr - intp_value(t) == 6 was #{val}") +val == 6 +EOF # # @todo: how to use voidhandle and handle? Modified: trunk/Examples/test-suite/ruby/li_std_pair_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_pair_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/li_std_pair_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -12,45 +12,50 @@ require 'li_std_pair' include Li_std_pair +swig_assert_each_line(<<'EOF', binding) # # Because of template specializations for pair<int, int>, these should return # an Array of size 2, where both elements are Fixnums. # intPair = makeIntPair(7, 6) -raise RuntimeError unless intPair.instance_of?(Array) -raise RuntimeError unless intPair.size == 2 -raise RuntimeError unless intPair[0] == 7 && intPair[1] == 6 +intPair.instance_of?(Array) +intPair.size == 2 +intPair[0] == 7 && intPair[1] == 6 intPairConstRef = makeIntPairConstRef(7, 6) -raise RuntimeError unless intPairConstRef.instance_of?(Array) -raise RuntimeError unless intPairConstRef[0] == 7 && intPairConstRef[1] == 6 +intPairConstRef.instance_of?(Array) +intPairConstRef[0] == 7 && intPairConstRef[1] == 6 # # Each of these should return a reference to a wrapped # std::pair<int, int> object (i.e. an IntPair instance). # intPairPtr = makeIntPairPtr(7, 6) -raise RuntimeError unless intPairPtr.instance_of?(IntPair) -raise RuntimeError unless intPairPtr[0] == 7 && intPairPtr[1] == 6 +intPairPtr.instance_of?(IntPair) +intPairPtr[0] == 7 && intPairPtr[1] == 6 intPairRef = makeIntPairRef(7, 6) -raise RuntimeError unless intPairRef.instance_of?(IntPair) -raise RuntimeError unless intPairRef[0] == 7 && intPairRef[1] == 6 +intPairRef.instance_of?(IntPair) +intPairRef[0] == 7 && intPairRef[1] == 6 # # Now test various input typemaps. Each of the wrapped C++ functions # (product1, product2 and product3) is expecting an argument of a # different type (see li_std_pair.i). Typemaps should be in place to # convert this Array into the expected argument type. # -raise RuntimeError unless product1(intPair) == 42 -raise RuntimeError unless product2(intPair) == 42 -raise RuntimeError unless product3(intPair) == 42 +product1(intPair) == 42 +product2(intPair) == 42 +product3(intPair) == 42 # # Similarly, each of the input typemaps should know what to do # with an IntPair instance. # -raise RuntimeError unless product1(intPairPtr) == 42 -raise RuntimeError unless product2(intPairPtr) == 42 -raise RuntimeError unless product3(intPairPtr) == 42 +product1(intPairPtr) == 42 +product2(intPairPtr) == 42 +product3(intPairPtr) == 42 +val = ValuePair.new +val.first = 'sd' +val.second = [5,4,3] +EOF Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -13,76 +13,78 @@ include Li_std_vector -@iv = IntVector.new(4) +iv = IntVector.new(4) -swig_assert( "@iv.respond_to? :each" ) +swig_assert( "iv.respond_to? :each", binding ) begin - @iv.each - swig_assert( false, "@iv.each worked with no block!") + iv.each + swig_assert( false, nil, "iv.each worked with no block!") rescue ArgumentError end -@iv.each_with_index { |e,i| swig_assert("#{e} == 0", "for @iv[#{i}] == 0") } +iv.each_with_index { |e,i| + swig_assert("#{e} == 0", binding, "for iv[#{i}] == 0") +} -0.upto(3) { |i| @iv[i] = i } +0.upto(3) { |i| iv[i] = i } -{ "@iv[-1]" => 3, - "@iv.slice(0,2).to_s" => "01", - "@iv.slice(1,2).to_s" => "12", - "@iv[0,-2]" => nil, - "@iv[0,3].to_s" => "012", - "@iv[0,10].to_s" => "012", - "@iv[1..2].to_s" => '12', - "@iv[1..3].to_s" => '123', - "@iv[1..4].to_s" => '123', - "@iv[1..-2].to_s" => '12', - "@iv[2..-3]" => nil, +{ "iv[-1]" => 3, + "iv.slice(0,2).to_s" => "01", + "iv.slice(1,2).to_s" => "12", + "iv[0,-2]" => nil, + "iv[0,3].to_s" => "012", + "iv[0,10].to_s" => "012", + "iv[1..2].to_s" => '12', + "iv[1..3].to_s" => '123', + "iv[1..4].to_s" => '123', + "iv[1..-2].to_s" => '12', + "iv[2..-3]" => nil, }.each do |k,v| - swig_assert( "#{k} == #{v.inspect}" ) + swig_assert( "#{k} == #{v.inspect}", binding ) end -swig_assert_each_line(<<'EOF') -@iv << 5 -@iv.push 5 -@iv.pop == 5 -@iv.unshift(7) -...@iv...ift == 7 -@iv.unshift(7, 3) -...@iv...sert(1,5) -...@iv...sert(0, 3) -@iv.unshift(2,3,4) -x = average(@iv) +swig_assert_each_line(<<'EOF', binding) +iv << 5 +iv.push 5 +iv.pop == 5 +iv.unshift(7) +iv.shift == 7 +iv.unshift(7, 3) +iv.insert(1,5) +iv.insert(0, 3) +iv.unshift(2,3,4) +x = average(iv) y = average([1, 2, 3, 4]) half([10, 10.5, 11, 11.5]) EOF -@dv = DoubleVector.new(10) +dv = DoubleVector.new(10) -swig_assert( "@dv.respond_to? :each_with_index" ) +swig_assert( "dv.respond_to? :each_with_index", binding ) -@dv.each_with_index { |e,i| swig_assert("@dv[#{i}] == 0.0") } +dv.each_with_index { |e,i| swig_assert("dv[#{i}] == 0.0", binding) } -0.upto(9) { |i| @dv[i] = i/2.0 } +0.upto(9) { |i| dv[i] = i/2.0 } -{ "@dv[-1]" => 4.5, - "@dv.slice(0,2).to_s" => "0.00.5", - "@dv[0,-2]" => nil, - "@dv[0,3].to_s" => "0.00.51.0", - "@dv[3,3].to_s" => "1.52.02.5", +{ "dv[-1]" => 4.5, + "dv.slice(0,2).to_s" => "0.00.5", + "dv[0,-2]" => nil, + "dv[0,3].to_s" => "0.00.51.0", + "dv[3,3].to_s" => "1.52.02.5", }.each do |k,v| - swig_assert( "#{k} == #{v.inspect}" ) + swig_assert( "#{k} == #{v.inspect}", binding ) end -swig_assert_each_line(<<'EOF') -...@dv...lete_at(2) -...@dv...lete_if() { |x| x == 2.0 } -...@dv...clude? 3.0 -...@dv...nd {|x| x==3.0 } -halve_in_place(@dv) == nil -@dv = [0.0,0.25,0.75,1.25,1.5,1.75,2.0,2.25] -@sv = StructVector.new -@sv << Li_std_vector::Struct.new +swig_assert_each_line(<<'EOF', binding) +dv.delete_at(2) +dv.delete_if() { |x| x == 2.0 } +dv.include? 3.0 +dv.find {|x| x==3.0 } +halve_in_place(dv) == nil +dv = [0.0,0.25,0.75,1.25,1.5,1.75,2.0,2.25] +sv = StructVector.new +sv << Li_std_vector::Struct.new EOF Modified: trunk/Examples/test-suite/ruby/newobject1_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/newobject1_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/newobject1_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -27,7 +27,7 @@ GC.start 100.times { foo1 = Foo.makeFoo; foo2 = foo1.makeMore } GC.stats -swig_assert( 'Foo.fooCount == 200', "but is #{Foo.fooCount}" ) +swig_assert( 'Foo.fooCount == 200', binding, "but is #{Foo.fooCount}" ) GC.start -swig_assert( 'Foo.fooCount <= 2', "but is #{Foo.fooCount}" ) +swig_assert( 'Foo.fooCount <= 2', binding, "but is #{Foo.fooCount}" ) Modified: trunk/Examples/test-suite/ruby/newobject2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/newobject2_runme.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/newobject2_runme.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -21,7 +21,7 @@ GC.stats 100.times { foo1 = makeFoo } GC.stats -swig_assert( 'fooCount == 100', "but is #{fooCount}" ) +swig_assert( 'fooCount == 100', nil, "but is #{fooCount}" ) GC.start -swig_assert( 'fooCount <= 1', "but is #{fooCount}" ) +swig_assert( 'fooCount <= 1', nil, "but is #{fooCount}" ) Modified: trunk/Examples/test-suite/ruby/swig_assert.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_assert.rb 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:08:17 UTC (rev 9730) @@ -15,19 +15,20 @@ end -def swig_assert( condition, *args ) +def swig_assert_equal( a, b, scope = nil, msg = nil ) begin - ok = eval(condition.to_s) + check = "#{a} == #{b}" + ok = eval(check, scope) rescue => e - raise SwigAssertError.new("Wrong assert: #{condition.to_s} - #{e}") + raise SwigAssertError.new("Wrong assert: #{check} - #{e}") end unless ok - raise SwigRubyError.new("FAILED CHECK: #{condition} was #{ok.inspect} #{args.join(' ')}") + raise SwigRubyError.new("FAILED CHECK: #{check} was #{eval(a)} #{msg}") end if $VERBOSE - $stdout.puts "\tPASSED #{condition} #{args.join(' ')}" + $stdout.puts "\tPASSED #{check} #{msg}" end return ok @@ -41,8 +42,37 @@ end -def swig_assert_each_line( lines ) +def swig_assert( condition, scope = nil, msg = nil ) + begin + if scope.kind_of? Binding + eval(condition.to_s, scope) + else + eval(condition.to_s) + msg = scope + end + rescue => e + raise SwigAssertError.new("Wrong assert: #{condition.to_s} - #{e}") + end + if $VERBOSE + $stdout.puts "\tPASSED #{condition} #{msg}" + end +rescue => e + trace = e.backtrace[1..-1] + $stderr.puts "#{trace[0,1]}: #{e}" + if trace.size > 1 + $stderr.puts "\tfrom #{trace[1..-1].join("\n\t ")}" + end + exit(1) +end + + +def swig_assert_each_line( lines, scope = nil, msg = nil ) lines.split("\n").each do |line| - swig_assert(line) + next if line.empty? or line =~ /^\s*#.*/ + if line =~ /(.*)\s*==\s*(.*)/ + swig_assert_equal($1, $2, scope, msg) + else + swig_assert(line, scope, msg) + end end end Modified: trunk/Lib/ruby/rubyclasses.swg =================================================================== --- trunk/Lib/ruby/rubyclasses.swg 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/ruby/rubyclasses.swg 2007-05-01 01:08:17 UTC (rev 9730) @@ -42,10 +42,9 @@ }; %apply VALUE {GC_VALUE}; - %apply VALUE const& {GC_VALUE const&}; /* For input */ - %typemap(in,noblock=1) GC_VALUE* (GC_VALUE r) { + %typemap(in,noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { r = $input; $1 = &r; } Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 01:08:17 UTC (rev 9730) @@ -519,15 +519,14 @@ /**** The Ruby container methods ****/ -%define %swig_container_methods(Container...) +%define %swig_container_printing_methods(Container...) - %extend { VALUE inspect() { - Container::iterator i = $self->begin(); - Container::iterator e = $self->end(); + Container::const_iterator i = $self->begin(); + Container::const_iterator e = $self->end(); VALUE str = rb_str_new2( swig::type_name< Container >() ); str = rb_str_cat2( str, " [" ); bool comma = false; @@ -535,7 +534,7 @@ for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } @@ -545,13 +544,13 @@ VALUE to_a() { - Container::iterator i = $self->begin(); - Container::iterator e = $self->end(); + Container::const_iterator i = $self->begin(); + Container::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from( *i ); rb_ary_push( ary, tmp ); } return ary; @@ -565,14 +564,17 @@ VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } - } +} +%enddef +%define %swig_container_methods(Container...) + %enddef %define %swig_sequence_methods_common(Sequence...) Modified: trunk/Lib/ruby/std_map.i =================================================================== --- trunk/Lib/ruby/std_map.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/ruby/std_map.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -132,8 +132,8 @@ } %define %swig_map_common(Map...) - %swig_sequence_iterator(Map); - %swig_container_methods(Map) + // %swig_sequence_methods_common(Map); + // %swig_sequence_iterator(Map); %extend { VALUE __getitem__(const key_type& key) const { @@ -178,6 +178,23 @@ } return ary; } + + Map* each_key() + { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given"); + + VALUE r; + Map::iterator i = self->begin(); + Map::iterator e = self->end(); + for ( ; i != e; ++i ) + { + r = swig::from( i->first ); + rb_yield(r); + } + + return self; + } VALUE values() { Map::size_type size = self->size(); @@ -197,6 +214,23 @@ return ary; } + Map* each_value() + { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given"); + + VALUE r; + Map::iterator i = self->begin(); + Map::iterator e = self->end(); + for ( ; i != e; ++i ) + { + r = swig::from( i->second ); + rb_yield(r); + } + + return self; + } + VALUE entries() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; @@ -210,7 +244,8 @@ Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { - rb_ary_push( ary, swig::from(*i) ); + rb_ary_push( ary, swig::from<std::pair<Map::key_type, + Map::mapped_type> >(*i) ); } return ary; } @@ -236,9 +271,65 @@ %define %swig_map_methods(Map...) %swig_map_common(Map) %extend { + void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } + + VALUE inspect() + { + Map::const_iterator i = $self->begin(); + Map::const_iterator e = $self->end(); + VALUE str = rb_str_new2( swig::type_name< Map >() ); + str = rb_str_cat2( str, " {" ); + bool comma = false; + VALUE tmp; + for ( ; i != e; ++i, comma = true ) + { + if (comma) str = rb_str_cat2( str, "," ); + // @todo: improve -- this should just be swig::from(*i) + tmp = swig::from< std::pair<Map::key_type, + Map::mapped_type> >( *i ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); + } + str = rb_str_cat2( str, "}" ); + return str; + } + + VALUE to_a() + { + Map::const_iterator i = $self->begin(); + Map::const_iterator e = $self->end(); + VALUE ary = rb_ary_new2( std::distance( i, e ) ); + VALUE tmp; + for ( ; i != e; ++i ) + { + // @todo: improve -- this should just be swig::from(*i) + tmp = swig::from< std::pair<Map::key_type, + Map::mapped_type> >( *i ); + rb_ary_push( ary, tmp ); + } + return ary; + } + + VALUE to_s() + { + Map::iterator i = $self->begin(); + Map::iterator e = $self->end(); + VALUE str = rb_str_new2( "" ); + VALUE tmp; + for ( ; i != e; ++i ) + { + // @todo: improve -- this should just be swig::from(*i) + tmp = swig::from< std::pair<Map::key_type, + Map::mapped_type> >( *i ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); + } + return str; + } + } %enddef Modified: trunk/Lib/ruby/std_multimap.i =================================================================== --- trunk/Lib/ruby/std_multimap.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/ruby/std_multimap.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -85,12 +85,109 @@ } } -%define %swig_multimap_methods(Type...) - %swig_map_common(Type); +%define %swig_multimap_methods(MultiMap...) + %swig_map_common(MultiMap); + %extend { void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { - self->insert(Type::value_type(key,x)); + self->insert(MultiMap::value_type(key,x)); } + + VALUE inspect() + { + MultiMap::iterator i = $self->begin(); + MultiMap::iterator e = $self->end(); + VALUE str = rb_str_new2( swig::type_name< MultiMap >() ); + str = rb_str_cat2( str, " {" ); + VALUE tmp; + while ( i != e ) + { + const MultiMap::key_type& key = i->first; + const MultiMap::key_type& oldkey = key; + tmp = swig::from( key ); + str = rb_str_buf_append( str, rb_inspect(tmp) ); + + VALUE vals = rb_ary_new(); + for ( ; i != e && key == oldkey; ++i ) + { + const MultiMap::mapped_type& val = i->second; + tmp = swig::from( val ); + rb_ary_push( vals, tmp ); + } + + if ( RARRAY_LEN(vals) == 1 ) + { + str = rb_str_buf_append( str, rb_inspect(tmp) ); + } + else + { + str = rb_str_buf_append( str, rb_inspect(vals) ); + } + } + str = rb_str_cat2( str, "}" ); + return str; + } + + VALUE to_a() + { + MultiMap::const_iterator i = $self->begin(); + MultiMap::const_iterator e = $self->end(); + VALUE ary = rb_ary_new2( std::distance( i, e ) ); + VALUE tmp; + while ( i != e ) + { + const MultiMap::key_type& key = i->first; + const MultiMap::key_type& oldkey = key; + tmp = swig::from( key ); + rb_ary_push( ary, tmp ); + + VALUE vals = rb_ary_new(); + for ( ; i != e && key == oldkey; ++i ) + { + const MultiMap::mapped_type& val = i->second; + tmp = swig::from( val ); + rb_ary_push( vals, tmp ); + } + + if ( RARRAY_LEN(vals) == 1 ) + { + rb_ary_push( ary, tmp ); + } + else + { + rb_ary_push( ary, vals ); + } + } + return ary; + } + + VALUE to_s() + { + MultiMap::iterator i = $self->begin(); + MultiMap::iterator e = $self->end(); + VALUE str = rb_str_new2( "" ); + VALUE tmp; + while ( i != e ) + { + const MultiMap::key_type& key = i->first; + const MultiMap::key_type& oldkey = key; + tmp = swig::from( key ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); + + VALUE vals = rb_ary_new(); + for ( ; i != e && key == oldkey; ++i ) + { + const MultiMap::mapped_type& val = i->second; + tmp = swig::from( val ); + rb_ary_push( vals, tmp ); + } + + tmp = rb_obj_as_string( vals ); + str = rb_str_buf_append( str, tmp ); + } + return str; + } } %enddef Modified: trunk/Lib/ruby/std_pair.i =================================================================== --- trunk/Lib/ruby/std_pair.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/ruby/std_pair.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -91,7 +91,8 @@ } } else { value_type *p; - res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info<value_type>(),0); + res = SWIG_ConvertPtr(obj,(void**)&p, + swig::type_info<value_type>(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; @@ -146,8 +147,9 @@ %define %swig_pair_methods(pair...) + %extend { - VALUE inspect() + VALUE inspect() const { VALUE tmp; VALUE str = rb_str_new2( swig::type_name< pair >() ); @@ -163,7 +165,7 @@ return str; } - VALUE to_s() + VALUE to_s() const { VALUE tmp; VALUE str = rb_str_new2( "(" ); Modified: trunk/Lib/std/std_pair.i =================================================================== --- trunk/Lib/std/std_pair.i 2007-04-30 21:20:52 UTC (rev 9729) +++ trunk/Lib/std/std_pair.i 2007-05-01 01:08:17 UTC (rev 9730) @@ -12,7 +12,7 @@ %traits_swigtype(T); %traits_swigtype(U); - + %fragment(SWIG_Traits_frag(std::pair<T,U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 01:21:29
|
Revision: 9731 http://swig.svn.sourceforge.net/swig/?rev=9731&view=rev Author: gga73 Date: 2007-04-30 18:21:26 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Moved the GC_VALUE class over to rubystdcommon so that it will only get added when STL is used. Documented swig_assert interface. Modified Paths: -------------- trunk/Examples/test-suite/ruby/swig_assert.rb trunk/Lib/ruby/ruby.swg trunk/Lib/ruby/rubyclasses.swg trunk/Lib/ruby/rubystdcommon.swg Modified: trunk/Examples/test-suite/ruby/swig_assert.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:08:17 UTC (rev 9730) +++ trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:21:26 UTC (rev 9731) @@ -8,19 +8,30 @@ # +# +# Exception raised when some swig binding test fails +# class SwigRubyError < RuntimeError end -class SwigAssertError < StandardError -end - +# +# Asserts whether a and b are equal. +# +# scope - optional Binding where to run the code +# msg - optional additional message to print +# def swig_assert_equal( a, b, scope = nil, msg = nil ) begin check = "#{a} == #{b}" - ok = eval(check, scope) + if scope.kind_of? Binding + ok = eval(check.to_s, scope) + else + ok = eval(check.to_s) + msg = scope if !msg + end rescue => e - raise SwigAssertError.new("Wrong assert: #{check} - #{e}") + raise end unless ok @@ -42,19 +53,25 @@ end -def swig_assert( condition, scope = nil, msg = nil ) +# +# Asserts whether an expression runs properly +# +# scope - optional Binding where to run the code +# msg - optional additional message to print +# +def swig_assert( expr, scope = nil, msg = nil ) begin if scope.kind_of? Binding - eval(condition.to_s, scope) + eval(expr.to_s, scope) else - eval(condition.to_s) - msg = scope + eval(expr.to_s) + msg = scope if !msg end rescue => e - raise SwigAssertError.new("Wrong assert: #{condition.to_s} - #{e}") + raise SwigRubyError.new("Wrong assert: #{expr.to_s} - #{e}") end if $VERBOSE - $stdout.puts "\tPASSED #{condition} #{msg}" + $stdout.puts "\tPASSED #{expr} #{msg}" end rescue => e trace = e.backtrace[1..-1] @@ -66,6 +83,15 @@ end +# +# Given a set of lines as text, runs each of them, asserting them. +# Lines that are of the form: +# a == b are run with swig_assert_equal +# others are run with swig_assert. +# +# scope - optional Binding where to run the code +# msg - optional additional message to print +# def swig_assert_each_line( lines, scope = nil, msg = nil ) lines.split("\n").each do |line| next if line.empty? or line =~ /^\s*#.*/ Modified: trunk/Lib/ruby/ruby.swg =================================================================== --- trunk/Lib/ruby/ruby.swg 2007-05-01 01:08:17 UTC (rev 9730) +++ trunk/Lib/ruby/ruby.swg 2007-05-01 01:21:26 UTC (rev 9731) @@ -54,11 +54,6 @@ %include <rubyopers.swg> /* ------------------------------------------------------------ - * The Ruby classes, for C++ - * ------------------------------------------------------------ */ -%include <rubyclasses.swg> - -/* ------------------------------------------------------------ * Warnings for Ruby keywords * ------------------------------------------------------------ */ %include <rubykw.swg> Modified: trunk/Lib/ruby/rubyclasses.swg =================================================================== --- trunk/Lib/ruby/rubyclasses.swg 2007-05-01 01:08:17 UTC (rev 9730) +++ trunk/Lib/ruby/rubyclasses.swg 2007-05-01 01:21:26 UTC (rev 9731) @@ -41,10 +41,12 @@ VALUE to_s() const; }; + %exception GC_VALUE {}; + %apply VALUE {GC_VALUE}; /* For input */ - %typemap(in,noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { + %typemap(in,noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { r = $input; $1 = &r; } Modified: trunk/Lib/ruby/rubystdcommon.swg =================================================================== --- trunk/Lib/ruby/rubystdcommon.swg 2007-05-01 01:08:17 UTC (rev 9730) +++ trunk/Lib/ruby/rubystdcommon.swg 2007-05-01 01:21:26 UTC (rev 9731) @@ -1,3 +1,9 @@ + +/* ------------------------------------------------------------ + * The Ruby classes, for C++ + * ------------------------------------------------------------ */ +%include <rubyclasses.swg> + %fragment("StdTraits","header",fragment="StdTraitsCommon") { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 01:54:05
|
Revision: 9732 http://swig.svn.sourceforge.net/swig/?rev=9732&view=rev Author: gga73 Date: 2007-04-30 18:54:02 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Yet even better swig assert. Added more tests to std::vector for map. Added dup() function to containers. Modified Paths: -------------- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Examples/test-suite/ruby/swig_assert.rb trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_vector.i Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 01:21:26 UTC (rev 9731) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 01:54:02 UTC (rev 9732) @@ -64,7 +64,7 @@ swig_assert( "dv.respond_to? :each_with_index", binding ) -dv.each_with_index { |e,i| swig_assert("dv[#{i}] == 0.0", binding) } +dv.each_with_index { |e,i| swig_assert_equal("dv[#{i}]", 0.0, binding) } 0.upto(9) { |i| dv[i] = i/2.0 } @@ -74,16 +74,19 @@ "dv[0,3].to_s" => "0.00.51.0", "dv[3,3].to_s" => "1.52.02.5", }.each do |k,v| - swig_assert( "#{k} == #{v.inspect}", binding ) + swig_assert_equal( k, v.inspect, binding ) end swig_assert_each_line(<<'EOF', binding) dv.delete_at(2) -dv.delete_if() { |x| x == 2.0 } +dv.delete_if { |x| x == 2.0 } dv.include? 3.0 -dv.find {|x| x==3.0 } -halve_in_place(dv) == nil -dv = [0.0,0.25,0.75,1.25,1.5,1.75,2.0,2.25] +dv.find {|x| x == 3.0 } +dv.kind_of? DoubleVector +halved = [] +halved = dv.map { |x| x / 2 } +halve_in_place(dv) +halved == dv.to_a sv = StructVector.new sv << Li_std_vector::Struct.new EOF Modified: trunk/Examples/test-suite/ruby/swig_assert.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:21:26 UTC (rev 9731) +++ trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:54:02 UTC (rev 9732) @@ -28,18 +28,23 @@ ok = eval(check.to_s, scope) else ok = eval(check.to_s) - msg = scope if !msg + if !msg + msg = scope + scope = nil + end end rescue => e raise end unless ok - raise SwigRubyError.new("FAILED CHECK: #{check} was #{eval(a)} #{msg}") + valA = eval(a, scope) + valB = eval(b, scope) + raise SwigRubyError.new("FAILED EQUALITY: #{check} was #{valA} not #{valB}") end if $VERBOSE - $stdout.puts "\tPASSED #{check} #{msg}" + $stdout.puts "\tPASSED EQUALITY #{check} #{msg}" end return ok @@ -54,7 +59,7 @@ # -# Asserts whether an expression runs properly +# Asserts whether an expression runs properly and is true # # scope - optional Binding where to run the code # msg - optional additional message to print @@ -62,6 +67,38 @@ def swig_assert( expr, scope = nil, msg = nil ) begin if scope.kind_of? Binding + ok = eval(expr.to_s, scope) + else + ok = eval(expr.to_s) + msg = scope if !msg + end + rescue + raise + end + + raise SwigRubyError.new("FAILED: #{expr.to_s} - #{e}") unless ok + + if $VERBOSE + $stdout.puts "\tPASSED #{expr} #{msg}" + end +rescue => e + trace = e.backtrace[1..-1] + $stderr.puts "#{trace[0,1]}: #{e}" + if trace.size > 1 + $stderr.puts "\tfrom #{trace[1..-1].join("\n\t ")}" + end + exit(1) +end + +# +# Asserts whether an expression runs properly +# +# scope - optional Binding where to run the code +# msg - optional additional message to print +# +def swig_eval( expr, scope = nil, msg = nil ) + begin + if scope.kind_of? Binding eval(expr.to_s, scope) else eval(expr.to_s) @@ -87,7 +124,7 @@ # Given a set of lines as text, runs each of them, asserting them. # Lines that are of the form: # a == b are run with swig_assert_equal -# others are run with swig_assert. +# others are run with swig_eval. # # scope - optional Binding where to run the code # msg - optional additional message to print @@ -95,10 +132,10 @@ def swig_assert_each_line( lines, scope = nil, msg = nil ) lines.split("\n").each do |line| next if line.empty? or line =~ /^\s*#.*/ - if line =~ /(.*)\s*==\s*(.*)/ + if line =~ /^\s*([^\s]*)\s*==\s*(.*)\s*$/ swig_assert_equal($1, $2, scope, msg) else - swig_assert(line, scope, msg) + swig_eval(line, scope, msg) end end end Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 01:21:26 UTC (rev 9731) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 01:54:02 UTC (rev 9732) @@ -534,7 +534,7 @@ for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); - tmp = swig::from( *i ); + tmp = swig::from<Container::value_type>( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } @@ -550,7 +550,7 @@ VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from( *i ); + tmp = swig::from<Container::value_type>( *i ); rb_ary_push( ary, tmp ); } return ary; @@ -564,7 +564,7 @@ VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from( *i ); + tmp = swig::from<Container::value_type>( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } @@ -575,6 +575,16 @@ %define %swig_container_methods(Container...) + %extend { + + %newobject dup; + Container* dup() + { + return new Container(*$self); + } + + } + %enddef %define %swig_sequence_methods_common(Sequence...) Modified: trunk/Lib/ruby/std_vector.i =================================================================== --- trunk/Lib/ruby/std_vector.i 2007-05-01 01:21:26 UTC (rev 9731) +++ trunk/Lib/ruby/std_vector.i 2007-05-01 01:54:02 UTC (rev 9732) @@ -26,11 +26,13 @@ %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); + %swig_container_printing_methods(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); + %swig_container_printing_methods(Type); %enddef This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-03-12 16:48:41
|
Revision: 10302 http://swig.svn.sourceforge.net/swig/?rev=10302&view=rev Author: wsfulton Date: 2008-03-12 09:48:37 -0700 (Wed, 12 Mar 2008) Log Message: ----------- remove debugging info from shared_ptr typemaps Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/python/boost_shared_ptr.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-03-09 20:21:14 UTC (rev 10301) +++ trunk/CHANGES.current 2008-03-12 16:48:37 UTC (rev 10302) @@ -1,6 +1,9 @@ Version 1.3.35 (in progress) ============================ +03/12/2008: wsfulton + [Python] Remove debugging info when using shared_ptr support + 03/06/2008: mgossage [Lua] Updated documentation for Lua exceptions. Added Examples/lua/exception and Examples/lua/embed2. Modified: trunk/Lib/python/boost_shared_ptr.i =================================================================== --- trunk/Lib/python/boost_shared_ptr.i 2008-03-09 20:21:14 UTC (rev 10301) +++ trunk/Lib/python/boost_shared_ptr.i 2008-03-12 16:48:37 UTC (rev 10302) @@ -7,7 +7,7 @@ // destructor mods %feature("unref") TYPE -"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter<SWIG_null_deleter>(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" +//"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter<SWIG_null_deleter>(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-04-20 20:41:06
|
Revision: 10381 http://swig.svn.sourceforge.net/swig/?rev=10381&view=rev Author: wsfulton Date: 2008-04-20 13:41:01 -0700 (Sun, 20 Apr 2008) Log Message: ----------- Add allprotected mode for wrapping protected members when using directors Modified Paths: -------------- trunk/CHANGES trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Source/CParse/parser.y trunk/Source/Modules/csharp.cxx trunk/Source/Modules/emit.cxx trunk/Source/Modules/java.cxx trunk/Source/Modules/lang.cxx trunk/Source/Modules/perl5.cxx trunk/Source/Modules/swigmod.h trunk/Source/Modules/utils.cxx trunk/Source/Swig/cwrap.c trunk/Source/Swig/naming.c trunk/Source/Swig/swig.h Added Paths: ----------- trunk/Examples/test-suite/allprotected.i trunk/Examples/test-suite/csharp/allprotected_runme.cs trunk/Examples/test-suite/java/allprotected_runme.java Modified: trunk/CHANGES =================================================================== --- trunk/CHANGES 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/CHANGES 2008-04-20 20:41:01 UTC (rev 10381) @@ -2,6 +2,93 @@ See CHANGES.current for current version. +Version 1.3.35 (7 April 2008) +============================= + +04/07/2008: wsfulton + [Lua] Add missing pointer reference typemaps + +04/06/2008: wsfulton + Fix stack overflow when using typemap warning suppression, eg + %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) + +04/05/2008: wsfulton + [Python] Fix shared_ptr typemaps so that %pythonnondynamic can be used. Also corrects + display of the proxy class type. Reported by Robert Lupton. + +04/04/2008: olly + [Python] Add %newobject reference to python memory management subsection of manual + (patch from mdbeachy in SF#1894610). + +03/27/2008: wsfulton + [Python] Fix shared_ptr typemaps where the pointer type is a templated type with + with more than one parameter. Reported by Robert Lupton. + +03/27/2008: mgossage + [Lua] Added a typemap DISOWN for SWIGTYPE* and SWIGTYPE[], and support for %delobject feature. + Added Examples/lua/owner which demonstrates the use of the memory management. + +03/26/2008: wsfulton + [Java] Apply patch #1844301 from Monty Taylor to suppress enum constructor + unused warnings. + +03/26/2008: wsfulton + [Python] Apply patch #1924524 from Casey Raymondson which ensures the + "No constructor defined" message is displayed when attempting to call a + constructor on a class that doesn't have a constructor wrapper, eg if + the C++ class is abstract. + +03/26/2008: wsfulton + [Python] Apply patch #1925702 from Casey Raymondson which removes warning 512 + for std::vector wrappers. + +03/26/2008: olly + [Python] Apply GCC 4.3 warnings patch from Philipp Thomas + (SF#1925122). + +03/21/2008: wsfulton + [Python] Thread safety patch for STL iterators from Abhinandan Jain. + +03/17/2008: mgossage + [Lua] Added %luacode feature to add source code into wrappers. + Updated documentation to document this. + Added Examples/lua/arrays to show its use (and typemaps) + +03/17/2008: olly + Fix nonportable sed usage which failed on Mac OS X (and probably + other platforms). Fixes SF#1903612. + +03/17/2008: olly + Fix memory leak in SWIG's parser (based on patch from Russell + Bryant in SF#1914023).` + +03/12/2008: wsfulton + Fix bug #1878285 - unnecessary cast for C struct creation wrappers. + +03/12/2008: wsfulton + [Python] Remove debugging info when using shared_ptr support + +03/06/2008: mgossage + [Lua] Updated documentation for Lua exceptions. + Added Examples/lua/exception and Examples/lua/embed2. + Small updates to the typemaps. + +03/04/2008: wsfulton + [Java, C#] Add char *& typemaps. + +03/04/2008: wsfulton + Fix occasional seg fault when attempting to report overloaded methods as being ignored. + +02/29/2008: wsfulton + [Perl] Fix #1904537 Swig causes a Perl warning "x used only once" in Perl 5.10 + reported by Ari Jolma + +02/29/2008: wsfulton + [Python] Add shared_ptr varin/varout typemaps for wrapping global variables. + +02/25/2008: wsfulton + Fix $wrapname to work in %exception (fixes some wrap:name assertions) + Version 1.3.34 (27 February 2008) ================================= Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/CHANGES.current 2008-04-20 20:41:01 UTC (rev 10381) @@ -1,87 +1,12 @@ -Version 1.3.35 (7 April 2008) +Version 1.3.36 (in progress) ============================= -04/07/2008: wsfulton - [Lua] Add missing pointer reference typemaps +04/20/2008: wsfulton + Add the ability to wrap all protected members when using directors. + Previously only the virtual methods were available to the target language. + Now all protected members, (static and non-static variables, non-virtual methods + and static methods) are wrapped when using the allprotected mode. The allprotected + mode is turned on in the module declaration: -04/06/2008: wsfulton - Fix stack overflow when using typemap warning suppression, eg - %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) + %module(directors="1", allprotected="1") modulename -04/05/2008: wsfulton - [Python] Fix shared_ptr typemaps so that %pythonnondynamic can be used. Also corrects - display of the proxy class type. Reported by Robert Lupton. - -04/04/2008: olly - [Python] Add %newobject reference to python memory management subsection of manual - (patch from mdbeachy in SF#1894610). - -03/27/2008: wsfulton - [Python] Fix shared_ptr typemaps where the pointer type is a templated type with - with more than one parameter. Reported by Robert Lupton. - -03/27/2008: mgossage - [Lua] Added a typemap DISOWN for SWIGTYPE* and SWIGTYPE[], and support for %delobject feature. - Added Examples/lua/owner which demonstrates the use of the memory management. - -03/26/2008: wsfulton - [Java] Apply patch #1844301 from Monty Taylor to suppress enum constructor - unused warnings. - -03/26/2008: wsfulton - [Python] Apply patch #1924524 from Casey Raymondson which ensures the - "No constructor defined" message is displayed when attempting to call a - constructor on a class that doesn't have a constructor wrapper, eg if - the C++ class is abstract. - -03/26/2008: wsfulton - [Python] Apply patch #1925702 from Casey Raymondson which removes warning 512 - for std::vector wrappers. - -03/26/2008: olly - [Python] Apply GCC 4.3 warnings patch from Philipp Thomas - (SF#1925122). - -03/21/2008: wsfulton - [Python] Thread safety patch for STL iterators from Abhinandan Jain. - -03/17/2008: mgossage - [Lua] Added %luacode feature to add source code into wrappers. - Updated documentation to document this. - Added Examples/lua/arrays to show its use (and typemaps) - -03/17/2008: olly - Fix nonportable sed usage which failed on Mac OS X (and probably - other platforms). Fixes SF#1903612. - -03/17/2008: olly - Fix memory leak in SWIG's parser (based on patch from Russell - Bryant in SF#1914023).` - -03/12/2008: wsfulton - Fix bug #1878285 - unnecessary cast for C struct creation wrappers. - -03/12/2008: wsfulton - [Python] Remove debugging info when using shared_ptr support - -03/06/2008: mgossage - [Lua] Updated documentation for Lua exceptions. - Added Examples/lua/exception and Examples/lua/embed2. - Small updates to the typemaps. - -03/04/2008: wsfulton - [Java, C#] Add char *& typemaps. - -03/04/2008: wsfulton - Fix occasional seg fault when attempting to report overloaded methods as being ignored. - -02/29/2008: wsfulton - [Perl] Fix #1904537 Swig causes a Perl warning "x used only once" in Perl 5.10 - reported by Ari Jolma - -02/29/2008: wsfulton - [Python] Add shared_ptr varin/varout typemaps for wrapping global variables. - -02/25/2008: wsfulton - Fix $wrapname to work in %exception (fixes some wrap:name assertions) - Added: trunk/Examples/test-suite/allprotected.i =================================================================== --- trunk/Examples/test-suite/allprotected.i (rev 0) +++ trunk/Examples/test-suite/allprotected.i 2008-04-20 20:41:01 UTC (rev 10381) @@ -0,0 +1,68 @@ +// Tests for the allprotected option + +%module(directors="1", allprotected="1") allprotected + +%{ +#include <string> +%} + +%include "std_string.i" + +%feature("director") PublicBase; +%feature("director") ProtectedBase; + +// protected types not supported (ProtectedEnum, IntegerType). Make sure they can be ignored. +%ignore ProtectedBase::protectedenum; +%ignore ProtectedBase::typedefs; + +%inline %{ +class Klass { + std::string name; +public: + Klass(const std::string& n) : name(n) {} + std::string getName() { return name; } +}; + +class PublicBase { + std::string str; +public: + enum AnEnum { EnumVal1, EnumVal2 }; +public: + PublicBase(const char* s): str(s) {} + virtual ~PublicBase() { } + virtual std::string virtualMethod() const { return "PublicBase"; } + Klass instanceMethod(Klass k) const { return k; } + static Klass staticMethod(Klass k) { return k; } + int instanceMemberVariable; + static int staticMemberVariable; + static const int staticConstMemberVariable = 20; + AnEnum anEnum; +}; +int PublicBase::staticMemberVariable = 10; + +class ProtectedBase { + std::string str; +public: + enum AnEnum { EnumVal1, EnumVal2 }; + std::string getName() { return str; } +protected: + ProtectedBase(const char* s): str(s) {} + virtual ~ProtectedBase() { } + virtual std::string virtualMethod() const { return "ProtectedBase"; } + Klass instanceMethod(Klass k) const { return k; } + static Klass staticMethod(Klass k) { return k; } + int instanceMemberVariable; + static int staticMemberVariable; + static const int staticConstMemberVariable = 20; + AnEnum anEnum; + +// unsupported: types defined with protected access and thus methods/variables which use them + enum ProtectedEnum { ProtEnumVal1, ProtEnumVal2 }; + typedef int IntegerType; + ProtectedEnum protectedenum; + IntegerType typedefs(IntegerType it) { return it; } +}; +int ProtectedBase::staticMemberVariable = 10; + +%} + Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Examples/test-suite/common.mk 2008-04-20 20:41:01 UTC (rev 10381) @@ -74,6 +74,7 @@ add_link \ aggregate \ allowexcept \ + allprotected \ anonymous_bitfield \ apply_signed_char \ apply_strings \ Added: trunk/Examples/test-suite/csharp/allprotected_runme.cs =================================================================== --- trunk/Examples/test-suite/csharp/allprotected_runme.cs (rev 0) +++ trunk/Examples/test-suite/csharp/allprotected_runme.cs 2008-04-20 20:41:01 UTC (rev 10381) @@ -0,0 +1,55 @@ +using System; +using allprotectedNamespace; + +public class runme +{ + static void Main() + { + runme r = new runme(); + r.run(); + } + + void run() + { + MyProtectedBase mpb = new MyProtectedBase("MyProtectedBase"); + mpb.accessProtected(); + } +} + +class MyProtectedBase : ProtectedBase +{ + public MyProtectedBase(string name) : base(name) { + } + public void accessProtected() { + string s = virtualMethod(); + if (s != "ProtectedBase") + throw new Exception("Failed"); + + Klass k = instanceMethod(new Klass("xyz")); + if (k.getName() != "xyz") + throw new Exception("Failed"); + + k = staticMethod(new Klass("abc")); + if (k.getName() != "abc") + throw new Exception("Failed"); + + instanceMemberVariable = 30; + int i = instanceMemberVariable; + if (i != 30) + throw new Exception("Failed"); + + staticMemberVariable = 40; + i = staticMemberVariable; + if (i != 40) + throw new Exception("Failed"); + + i = staticConstMemberVariable; + if (i != 20) + throw new Exception("Failed"); + + anEnum = ProtectedBase.AnEnum.EnumVal1; + ProtectedBase.AnEnum ae = anEnum; + if (ae != ProtectedBase.AnEnum.EnumVal1) + throw new Exception("Failed"); + } +} Added: trunk/Examples/test-suite/java/allprotected_runme.java =================================================================== --- trunk/Examples/test-suite/java/allprotected_runme.java (rev 0) +++ trunk/Examples/test-suite/java/allprotected_runme.java 2008-04-20 20:41:01 UTC (rev 10381) @@ -0,0 +1,58 @@ +import allprotected.*; + +public class allprotected_runme { + static { + try { + System.loadLibrary("allprotected"); + } 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[]) + { + MyProtectedBase mpb = new MyProtectedBase("MyProtectedBase"); + mpb.accessProtected(); + } +} + +class MyProtectedBase extends ProtectedBase +{ + MyProtectedBase(String name) { + super(name); + } + void accessProtected() { + String s = virtualMethod(); + if (!s.equals("ProtectedBase")) + throw new RuntimeException("Failed"); + + Klass k = instanceMethod(new Klass("xyz")); + if (!k.getName().equals("xyz")) + throw new RuntimeException("Failed"); + + k = staticMethod(new Klass("abc")); + if (!k.getName().equals("abc")) + throw new RuntimeException("Failed"); + + setInstanceMemberVariable(30); + int i = getInstanceMemberVariable(); + if (i != 30) + throw new RuntimeException("Failed"); + + setStaticMemberVariable(40); + i = getStaticMemberVariable(); + if (i != 40) + throw new RuntimeException("Failed"); + + i = staticConstMemberVariable; + if (i != 20) + throw new RuntimeException("Failed"); + + setAnEnum(ProtectedBase.AnEnum.EnumVal1); + ProtectedBase.AnEnum ae = getAnEnum(); + if (ae != ProtectedBase.AnEnum.EnumVal1) + throw new RuntimeException("Failed"); + } +} + Property changes on: trunk/Examples/test-suite/java/allprotected_runme.java ___________________________________________________________________ Name: svn:executable + * Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/CParse/parser.y 2008-04-20 20:41:01 UTC (rev 10381) @@ -282,6 +282,7 @@ Symtab *old_scope = 0; int isfriend = inclass && is_friend(n); int iscdecl = Cmp(nodeType(n),"cdecl") == 0; + int only_csymbol = 0; if (extendmode) { Setattr(n,"isextension","1"); } @@ -336,25 +337,17 @@ } if (!isfriend && inclass) { if ((cplus_mode != CPLUS_PUBLIC)) { - int only_csymbol = 1; + only_csymbol = 1; if (cplus_mode == CPLUS_PROTECTED) { Setattr(n,"access", "protected"); only_csymbol = !Swig_need_protected(n); } else { - /* private are needed only when they are pure virtuals */ Setattr(n,"access", "private"); - if ((Cmp(Getattr(n,"storage"),"virtual") == 0) - && (Cmp(Getattr(n,"value"),"0") == 0)) { - only_csymbol = !Swig_need_protected(n); + /* private are needed only when they are pure virtuals - why? */ + if ((Cmp(Getattr(n,"storage"),"virtual") == 0) && (Cmp(Getattr(n,"value"),"0") == 0)) { + only_csymbol = 0; } } - if (only_csymbol) { - /* Only add to C symbol table and continue */ - Swig_symbol_add(0, n); - if (add_only_one) break; - n = nextSibling(n); - continue; - } } else { Setattr(n,"access", "public"); } @@ -434,7 +427,8 @@ n = nextSibling(n); continue; } - if (GetFlag(n,"feature:ignore")) { + if (only_csymbol || GetFlag(n,"feature:ignore")) { + /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); } else if (strncmp(Char(symname),"$ignore",7) == 0) { char *c = Char(symname)+7; @@ -2047,6 +2041,12 @@ if (Getattr($2,"directors")) { Wrapper_director_mode_set(1); } + if (Getattr($2,"dirprot")) { + Wrapper_director_protected_mode_set(1); + } + if (Getattr($2,"allprotected")) { + Wrapper_all_protected_mode_set(1); + } if (Getattr($2,"templatereduce")) { template_reduce = 1; } Modified: trunk/Source/Modules/csharp.cxx =================================================================== --- trunk/Source/Modules/csharp.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/csharp.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -274,6 +274,7 @@ if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } + allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ @@ -1238,14 +1239,17 @@ // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); + const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + if ((enum_feature == TypesafeEnum) && Getattr(parentNode(n), "sym:name") && !Getattr(parentNode(n), "unnamedinstance")) { // Wrap (non-anonymouse) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); - Printf(enum_code, " public static readonly %s %s = new %s(\"%s\", %s);\n", return_type, symname, return_type, symname, value); + Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { - Printf(enum_code, " public static readonly %s %s = new %s(\"%s\");\n", return_type, symname, return_type, symname); + Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants @@ -1253,7 +1257,7 @@ // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later const char *const_readonly = const_feature_flag ? "const" : "static readonly"; String *value = enumValue(n); - Printf(enum_code, " public %s %s %s = %s;\n", const_readonly, return_type, symname, value); + Printf(enum_code, " %s %s %s %s = %s;\n", methodmods, const_readonly, return_type, symname, value); Delete(value); } } @@ -1336,8 +1340,12 @@ if (outattributes) Printf(constants_code, " %s\n", outattributes); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; - Printf(constants_code, " public %s %s %s = ", (const_feature_flag ? "const" : "static readonly"), return_type, itemname); + const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + + Printf(constants_code, " %s %s %s %s = ", methodmods, (const_feature_flag ? "const" : "static readonly"), return_type, itemname); + // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); @@ -3552,7 +3560,7 @@ Printf(w->code, "}"); - // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method + // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); Modified: trunk/Source/Modules/emit.cxx =================================================================== --- trunk/Source/Modules/emit.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/emit.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -415,9 +415,15 @@ action = Getattr(n, "wrap:action"); assert(action != 0); - if (!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall"))) { - /* In order to call protected virtual director methods from the target language, we need - * to add an extra dynamic_cast to call the public C++ wrapper in the director class. */ + + /* In order to call protected virtual director methods from the target language, we need + * to add an extra dynamic_cast to call the public C++ wrapper in the director class. + * Also for non-static protected members when the allprotected option is on. */ +// TODO: why is the storage element removed in staticmemberfunctionHandler ?? + if (!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall")) || + (is_non_virtual_protected_access(n) && !(checkAttribute(n, "staticmemberfunctionHandler:storage", "static") || + checkAttribute(n, "storage", "static")) + && !Equal(nodeType(n), "constructor"))) { Node *parent = Getattr(n, "parentNode"); String *symname = Getattr(parent, "sym:name"); String *dirname = NewStringf("SwigDirector_%s", symname); Modified: trunk/Source/Modules/java.cxx =================================================================== --- trunk/Source/Modules/java.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/java.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -281,6 +281,7 @@ if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } + allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ @@ -893,12 +894,6 @@ // Premature garbage collection prevention parameter if (!is_destructor) { String *pgc_parameter = prematureGarbageCollectionPreventionParameter(pt, p); - /* - if (!pgc_parameter) { - Printf(stdout, "prematuregcp %s %s [%s]\n", symname, Getattr(n, "sym:overname"), pt); - Swig_print_node(p); - } - */ if (pgc_parameter) { Printf(imclass_class_code, ", %s %s_", pgc_parameter, arg); Printf(f->def, ", jobject %s_", arg); @@ -1294,21 +1289,24 @@ Delete(typemap_lookup_type); typemap_lookup_type = NULL; + const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + if ((enum_feature == TypesafeEnum) && Getattr(parentNode(n), "sym:name") && !Getattr(parentNode(n), "unnamedinstance")) { // Wrap (non-anonymouse) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); - Printf(enum_code, " public final static %s %s = new %s(\"%s\", %s);\n", return_type, symname, return_type, symname, value); + Printf(enum_code, " %s final static %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { - Printf(enum_code, " public final static %s %s = new %s(\"%s\");\n", return_type, symname, return_type, symname); + Printf(enum_code, " %s final static %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); - Printf(enum_code, " public final static %s %s = %s;\n", return_type, symname, value); + Printf(enum_code, " %s final static %s %s = %s;\n", methodmods, return_type, symname, value); Delete(value); } } @@ -1385,8 +1383,11 @@ } const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; - Printf(constants_code, " public final static %s %s = ", return_type, itemname); + const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); + methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); + Printf(constants_code, " %s final static %s %s = ", methodmods, return_type, itemname); + // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); @@ -3743,7 +3744,7 @@ Printf(w->code, "}"); - // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method + // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); Modified: trunk/Source/Modules/lang.cxx =================================================================== --- trunk/Source/Modules/lang.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/lang.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -13,8 +13,10 @@ #include "cparse.h" #include <ctype.h> -static int director_mode = 0; /* set to 0 on default */ -static int director_protected_mode = 1; /* set to 1 on default */ +/* default mode settings */ +static int director_mode = 0; +static int director_protected_mode = 1; +static int all_protected_mode = 0; static int naturalvar_mode = 0; /* Set director_protected_mode */ @@ -26,6 +28,10 @@ director_protected_mode = flag; } +void Wrapper_all_protected_mode_set(int flag) { + all_protected_mode = flag; +} + void Wrapper_naturalvar_mode_set(int flag) { naturalvar_mode = flag; } @@ -34,6 +40,12 @@ int Swig_director_mode() { return director_mode; } + int Swig_director_protected_mode() { + return director_protected_mode; + } + int Swig_all_protected_mode() { + return all_protected_mode; + } } /* Some status variables used during parsing */ @@ -813,11 +825,13 @@ /* except for friends, they are not affected by access control */ int isfriend = storage && (Cmp(storage, "friend") == 0); if (!isfriend) { - /* we check what the director needs. If the method is pure virtual, - it is always needed. */ - if (!(directorsEnabled() && is_member_director(CurrentClass, n) && need_nonpublic_member(n))) { - return SWIG_NOWRAP; + /* Check what the director needs. If the method is pure virtual, it is always needed. + * Also wrap non-virtual protected members if asked for (allprotected mode). */ + if (!(directorsEnabled() && ((is_member_director(CurrentClass, n) && need_nonpublic_member(n)) || is_non_virtual_protected_access(n)))) { + return SWIG_NOWRAP; } +#if 0 +// I don't see why this is needed - WSF /* prevent wrapping the method twice due to overload */ String *wrapname = NewStringf("nonpublic_%s%s", symname, Getattr(n, "sym:overname")); if (Getattr(CurrentClass, wrapname)) { @@ -826,6 +840,7 @@ } SetFlag(CurrentClass, wrapname); Delete(wrapname); +#endif } } @@ -1217,9 +1232,9 @@ } } // Set up the type for the cast to this class for use when wrapping const director (virtual) methods. - // Note: protected director methods only. + // Note: protected director methods or when allprotected mode turned on. String *director_type = 0; - if (!is_public(n) && (is_member_director(CurrentClass, n) || GetFlag(n, "explicitcall"))) { + if (!is_public(n) && (is_member_director(CurrentClass, n) || GetFlag(n, "explicitcall") || is_non_virtual_protected_access(n))) { director_type = Copy(DirectorClassName); String *qualifier = Getattr(n, "qualifier"); if (qualifier) @@ -1238,6 +1253,7 @@ Swig_MethodToFunction(n, ClassType, Getattr(n, "template") ? SmartPointer : Extend | SmartPointer | DirectorExtraCall, director_type, is_member_director(CurrentClass, n)); Setattr(n, "sym:name", fname); + functionWrapper(n); Delete(director_type); @@ -1263,12 +1279,11 @@ if (!Extend) { Node *sb = Getattr(n, "cplus:staticbase"); - String *sname = sb ? Getattr(sb, "name") : 0; - if (sname) { + String *sname = Getattr(sb, "name"); + if (is_non_virtual_protected_access(n)) + cname = NewStringf("%s::%s", DirectorClassName, name); + else cname = NewStringf("%s::%s", sname, name); - } else { - cname = NewStringf("%s::%s", ClassName, name); - } } else { String *mname = Swig_name_mangle(ClassName); cname = Swig_name_member(mname, name); @@ -1346,8 +1361,7 @@ SetFlag(n, "feature:immutable"); } } - if ((Cmp(storage, "static") == 0) - && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) { + if ((Cmp(storage, "static") == 0) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) { staticmembervariableHandler(n); } else { membervariableHandler(n); @@ -1421,6 +1435,8 @@ tm = Swig_typemap_lookup_new("memberin", n, target, 0); } int flags = Extend | SmartPointer | use_naturalvar_mode(n); + if (is_non_virtual_protected_access(n)) + flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembersetToFunction(n, ClassType, flags); Setattr(n, "memberset", "1"); @@ -1467,6 +1483,8 @@ /* Emit get function */ { int flags = Extend | SmartPointer | use_naturalvar_mode(n); + if (is_non_virtual_protected_access(n)) + flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembergetToFunction(n, ClassType, flags); Setattr(n, "sym:name", mrename_get); Setattr(n, "memberget", "1"); @@ -1525,7 +1543,8 @@ int Language::staticmembervariableHandler(Node *n) { Swig_require("staticmembervariableHandler", n, "*name", "*sym:name", "*type", "?value", NIL); String *value = Getattr(n, "value"); - String *classname = !SmartPointer ? ClassName : Getattr(CurrentClass, "allocate:smartpointerbase"); + String *classname = !SmartPointer ? (is_non_virtual_protected_access(n) ? DirectorClassName : ClassName) : Getattr(CurrentClass, "allocate:smartpointerbase"); + if (!value || !Getattr(n, "hasconsttype")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); @@ -1681,7 +1700,7 @@ if (Extend) new_name = Copy(value); else - new_name = NewStringf("%s::%s", ClassName, name); + new_name = NewStringf("%s::%s", is_non_virtual_protected_access(n) ? DirectorClassName : ClassName, name); Setattr(n, "name", new_name); constantWrapper(n); @@ -2083,6 +2102,20 @@ List *vtable = NewList(); int virtual_destructor = 0; unrollVirtualMethods(n, n, vtable, 0, virtual_destructor); + + // Emit all the using base::member statements for non virtual members (allprotected mode) + Node *ni; + String *using_protected_members_code = NewString(""); + for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { + Node *nodeType = Getattr(ni, "nodeType"); + bool cdecl = (Cmp(nodeType, "cdecl") == 0); + if (cdecl && !GetFlag(ni, "feature:ignore")) { + if (is_non_virtual_protected_access(ni)) { + Printf(using_protected_members_code, " using %s::%s;\n", SwigType_namestr(ClassName), Getattr(ni, "name")); + } + } + } + if (virtual_destructor || Len(vtable) > 0) { if (!virtual_destructor) { String *classtype = Getattr(n, "classtype"); @@ -2096,9 +2129,14 @@ classDirectorInit(n); classDirectorConstructors(n); classDirectorMethods(n); + + File *f_directors_h = Swig_filebyname("director_h"); + Printv(f_directors_h, using_protected_members_code, NIL); + classDirectorEnd(n); } Delete(vtable); + Delete(using_protected_members_code); return SWIG_OK; } @@ -3107,11 +3145,19 @@ } /* ----------------------------------------------------------------------------- + * Language::allow_allprotected() + * ----------------------------------------------------------------------------- */ + +void Language::allow_allprotected(int val) { + all_protected_mode = val; +} + +/* ----------------------------------------------------------------------------- * Language::dirprot_mode() * ----------------------------------------------------------------------------- */ int Language::dirprot_mode() const { - return directorsEnabled()? director_protected_mode : 0; + return directorsEnabled() ? director_protected_mode : 0; } /* ----------------------------------------------------------------------------- @@ -3183,8 +3229,7 @@ if (directorsEnabled()) { if (is_protected(n)) { if (dirprot_mode()) { - /* when using dirprot mode, the protected members are always - needed. */ + /* when using dirprot mode, the protected members are always needed. */ return 1; } else { /* if the method is pure virtual, we need it. */ Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/perl5.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -75,7 +75,7 @@ static String *pm; /* Package initialization code */ static String *magic; /* Magic variable wrappers */ -static int is_static = 0; +static int staticoption = 0; /* The following variables are used to manage Perl5 classes */ @@ -150,7 +150,7 @@ export_all = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-static") == 0) { - is_static = 1; + staticoption = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { blessed = 1; @@ -298,7 +298,7 @@ Printf(f_pm, "package %s;\n", fullmodule); Printf(f_pm, "require Exporter;\n"); - if (!is_static) { + if (!staticoption) { Printf(f_pm, "require DynaLoader;\n"); Printf(f_pm, "@ISA = qw(Exporter DynaLoader);\n"); } else { @@ -378,7 +378,7 @@ Printf(f_pm, "package %s;\n", cmodule); - if (!is_static) { + if (!staticoption) { Printf(f_pm, "bootstrap %s;\n", fullmodule); } else { String *tmp = NewString(fullmodule); Modified: trunk/Source/Modules/swigmod.h =================================================================== --- trunk/Source/Modules/swigmod.h 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/swigmod.h 2008-04-20 20:41:01 UTC (rev 10381) @@ -232,6 +232,9 @@ /* Allow director protected members related code generation */ void allow_dirprot(int val = 1); + /* Allow all protected members code generation (for directors) */ + void allow_allprotected(int val = 0); + /* Returns the dirprot mode */ int dirprot_mode() const; @@ -349,11 +352,10 @@ int is_protected(Node *n); int is_member_director(Node *parentnode, Node *member); int is_member_director(Node *member); +int is_non_virtual_protected_access(Node *n); /* Check if the non-virtual protected members are required (for directors) */ int use_naturalvar_mode(Node *n); void Wrapper_virtual_elimination_mode_set(int); -void Wrapper_director_mode_set(int); -void Wrapper_director_protected_mode_set(int); void Wrapper_fast_dispatch_mode_set(int); void Wrapper_cast_dispatch_mode_set(int); void Wrapper_naturalvar_mode_set(int); Modified: trunk/Source/Modules/utils.cxx =================================================================== --- trunk/Source/Modules/utils.cxx 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Modules/utils.cxx 2008-04-20 20:41:01 UTC (rev 10381) @@ -26,17 +26,19 @@ return access && !Cmp(access, "protected"); } +static int is_member_director_helper(Node *parentnode, Node *member) { + int parent_nodirector = GetFlag(parentnode, "feature:nodirector"); + if (parent_nodirector) + return 0; + int parent_director = Swig_director_mode() && GetFlag(parentnode, "feature:director"); + int cdecl_director = parent_director || GetFlag(member, "feature:director"); + int cdecl_nodirector = GetFlag(member, "feature:nodirector"); + return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend"); +} + int is_member_director(Node *parentnode, Node *member) { - int director_mode = Swig_director_mode(); - if (parentnode && checkAttribute(member, "storage", "virtual")) { - int parent_nodirector = GetFlag(parentnode, "feature:nodirector"); - if (parent_nodirector) - return 0; - int parent_director = director_mode && GetFlag(parentnode, "feature:director"); - int cdecl_director = parent_director || GetFlag(member, "feature:director"); - int cdecl_nodirector = GetFlag(member, "feature:nodirector"); - return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend"); + return is_member_director_helper(parentnode, member); } else { return 0; } @@ -46,6 +48,17 @@ return is_member_director(Getattr(member, "parentNode"), member); } +// Identifies the additional protected members that are generated when the allprotected option is used. +// This does not include protected virtual methods as they are turned on with the dirprot option. +int is_non_virtual_protected_access(Node *n) { + int result = 0; + if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode() && is_protected(n) && !checkAttribute(n, "storage", "virtual")) { + if (is_member_director_helper(Getattr(n, "parentNode"), n)) + result = 1; + } + return result; +} + /* Clean overloaded list. Removes templates, ignored, and errors */ void clean_overloaded(Node *n) { Modified: trunk/Source/Swig/cwrap.c =================================================================== --- trunk/Source/Swig/cwrap.c 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Swig/cwrap.c 2008-04-20 20:41:01 UTC (rev 10381) @@ -975,7 +975,7 @@ Node *Swig_methodclass(Node *n) { Node *nodetype = nodeType(n); - if (!Cmp(nodetype, "class")) + if (Cmp(nodetype, "class") == 0) return n; return GetFlag(n, "feature:extend") ? parentNode(parentNode(n)) : parentNode(n); } @@ -1227,6 +1227,9 @@ if (flags & CWRAP_SMART_POINTER) { self = NewString("(*this)->"); } + if (flags & CWRAP_ALL_PROTECTED_ACCESS) { + self = NewStringf("darg->"); + } name = Getattr(n, "name"); type = Getattr(n, "type"); @@ -1313,6 +1316,9 @@ self = NewString("(*this)->"); } } + if (flags & CWRAP_ALL_PROTECTED_ACCESS) { + self = NewStringf("darg->"); + } name = Getattr(n, "name"); type = Getattr(n, "type"); Modified: trunk/Source/Swig/naming.c =================================================================== --- trunk/Source/Swig/naming.c 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Swig/naming.c 2008-04-20 20:41:01 UTC (rev 10381) @@ -966,22 +966,28 @@ * int Swig_need_protected(Node* n) * * Detects when we need to fully register the protected member. + * This is basically any protected members when the allprotected mode is set. + * Otherwise we take just the protected virtual methods and non-static methods + * (potentially virtual methods) as well as constructors/destructors. * * ----------------------------------------------------------------------------- */ int Swig_need_protected(Node *n) { - /* First, 'n' looks like a function */ - /* if (!Swig_director_mode()) return 0; */ String *nodetype = nodeType(n); - if ((Equal(nodetype, "cdecl")) && SwigType_isfunction(Getattr(n, "decl"))) { - String *storage = Getattr(n, "storage"); - /* and the function is declared like virtual, or it has no - storage. This eliminates typedef, static and so on. */ - return !storage || Equal(storage, "virtual"); - } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) { - return 1; + if (checkAttribute(n, "access", "protected")) { + if ((Equal(nodetype, "cdecl"))) { + if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode()) { + return 1; + } + if (SwigType_isfunction(Getattr(n, "decl"))) { + String *storage = Getattr(n, "storage"); + /* The function is declared virtual, or it has no storage. This eliminates typedef, static etc. */ + return !storage || Equal(storage, "virtual"); + } + } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) { + return 1; + } } - return 0; } Modified: trunk/Source/Swig/swig.h =================================================================== --- trunk/Source/Swig/swig.h 2008-04-20 15:48:56 UTC (rev 10380) +++ trunk/Source/Swig/swig.h 2008-04-20 20:41:01 UTC (rev 10381) @@ -172,7 +172,7 @@ extern SwigType *SwigType_template_deftype(const SwigType *type, Symtab *tscope); /* --- Type-system managment --- */ - extern void SwigType_typesystem_init(); + extern void SwigType_typesystem_init(void); extern int SwigType_typedef(SwigType *type, String_or_char *name); extern int SwigType_typedef_class(String_or_char *name); extern int SwigType_typedef_using(String_or_char *qname); @@ -182,7 +182,7 @@ extern void SwigType_using_scope(Typetab *t); extern void SwigType_new_scope(const String_or_char *name); extern void SwigType_inherit_scope(Typetab *scope); - extern Typetab *SwigType_pop_scope(); + extern Typetab *SwigType_pop_scope(void); extern Typetab *SwigType_set_scope(Typetab *h); extern void SwigType_print_scope(Typetab *t); extern SwigType *SwigType_typedef_resolve(SwigType *t); @@ -200,15 +200,15 @@ /* --- Symbol table module --- */ - extern void Swig_symbol_init(); + extern void Swig_symbol_init(void); extern void Swig_symbol_setscopename(const String_or_char *name); - extern String *Swig_symbol_getscopename(); + extern String *Swig_symbol_getscopename(void); extern String *Swig_symbol_qualifiedscopename(Symtab *symtab); - extern Symtab *Swig_symbol_newscope(); + extern Symtab *Swig_symbol_newscope(void); extern Symtab *Swig_symbol_setscope(Symtab *); extern Symtab *Swig_symbol_getscope(const String_or_char *symname); - extern Symtab *Swig_symbol_current(); - extern Symtab *Swig_symbol_popscope(); + extern Symtab *Swig_symbol_current(void); + extern Symtab *Swig_symbol_popscope(void); extern Node *Swig_symbol_add(String_or_char *symname, Node *node); extern void Swig_symbol_cadd(String_or_char *symname, Node *node); extern Node *Swig_symbol_clookup(String_or_char *symname, Symtab *tab); @@ -258,7 +258,7 @@ extern String *Swig_name_destroy(const String_or_char *classname); extern String *Swig_name_disown(const String_or_char *classname); - extern void Swig_naming_init(); + extern void Swig_naming_init(void); extern void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn); extern Hash *Swig_name_namewarn_get(Node *n, String *prefix, String *name, SwigType *decl); extern void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *namewrn, ParmList *declaratorparms); @@ -298,7 +298,7 @@ extern String *Swig_string_upper(String *s); extern String *Swig_string_title(String *s); - extern void Swig_init(); + extern void Swig_init(void); extern void Swig_warn(const char *filename, int line, const char *msg); extern int Swig_value_wrapper_mode(int mode); @@ -345,11 +345,12 @@ extern int Swig_VargetToFunction(Node *n, int flags); extern int Swig_VarsetToFunction(Node *n, int flags); -#define CWRAP_EXTEND 0x01 -#define CWRAP_SMART_POINTER 0x02 -#define CWRAP_NATURAL_VAR 0x04 -#define CWRAP_DIRECTOR_ONE_CALL 0x08 -#define CWRAP_DIRECTOR_TWO_CALLS 0x10 +#define CWRAP_EXTEND 0x01 +#define CWRAP_SMART_POINTER 0x02 +#define CWRAP_NATURAL_VAR 0x04 +#define CWRAP_DIRECTOR_ONE_CALL 0x08 +#define CWRAP_DIRECTOR_TWO_CALLS 0x10 +#define CWRAP_ALL_PROTECTED_ACCESS 0x20 /* --- Director Helpers --- */ extern Node *Swig_methodclass(Node *n); @@ -358,13 +359,13 @@ /* --- Legacy Typemap API (somewhat simplified, ha!) --- */ - extern void Swig_typemap_init(); + extern void Swig_typemap_init(void); extern void Swig_typemap_register(const String_or_char *op, ParmList *pattern, String_or_char *code, ParmList *locals, ParmList *kwargs); extern int Swig_typemap_copy(const String_or_char *op, ParmList *srcpattern, ParmList *pattern); extern void Swig_typemap_clear(const String_or_char *op, ParmList *pattern); extern int Swig_typemap_apply(ParmList *srcpat, ParmList *destpat); extern void Swig_typemap_clear_apply(ParmList *pattern); - extern void Swig_typemap_debug(); + extern void Swig_typemap_debug(void); extern Hash *Swig_typemap_search(const String_or_char *op, SwigType *type, const String_or_char *pname, SwigType **matchtype); extern Hash *Swig_typemap_search_multi(const String_or_char *op, ParmList *parms, int *nmatch); @@ -373,8 +374,8 @@ extern String *Swig_typemap_lookup_new(const String_or_char *op, Node *n, const String_or_char *lname, Wrapper *f); extern void Swig_typemap_attach_kwargs(Hash *tm, const String_or_char *op, Parm *p); - extern void Swig_typemap_new_scope(); - extern Hash *Swig_typemap_pop_scope(); + extern void Swig_typemap_new_scope(void); + extern Hash *Swig_typemap_pop_scope(void); extern void Swig_typemap_attach_parms(const String_or_char *op, ParmList *parms, Wrapper *f); @@ -382,14 +383,19 @@ extern void Swig_fragment_register(Node *fragment); extern void Swig_fragment_emit(String *name); + extern void Swig_fragment_clear(String *section); /* hacks defined in C++ ! */ - extern int Swig_director_mode(); + extern int Swig_director_mode(void); + extern int Swig_director_protected_mode(void); + extern int Swig_all_protected_mode(void); extern void Wrapper_director_mode_set(int); + extern void Wrapper_director_protected_mode_set(int); + extern void Wrapper_all_protected_mode_set(int); /* -- template init -- */ - extern void SwigType_template_init(); + extern void SwigType_template_init(void); #ifdef __cplusplus This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 05:43:31
|
Revision: 9733 http://swig.svn.sourceforge.net/swig/?rev=9733&view=rev Author: gga73 Date: 2007-04-30 22:43:30 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Added proper each(), printing and other methods to map and multimap. Modified Paths: -------------- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Examples/test-suite/ruby/swig_assert.rb trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_map.i trunk/Lib/ruby/std_multimap.i Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 01:54:02 UTC (rev 9732) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 05:43:30 UTC (rev 9733) @@ -23,6 +23,10 @@ rescue ArgumentError end +swig_assert_each_line(<<'EOF', binding) +iv.respond_to?(:each) == true +iv.respond_to?(:each_with_index) == true +EOF iv.each_with_index { |e,i| swig_assert("#{e} == 0", binding, "for iv[#{i}] == 0") Modified: trunk/Examples/test-suite/ruby/swig_assert.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 01:54:02 UTC (rev 9732) +++ trunk/Examples/test-suite/ruby/swig_assert.rb 2007-05-01 05:43:30 UTC (rev 9733) @@ -76,7 +76,7 @@ raise end - raise SwigRubyError.new("FAILED: #{expr.to_s} - #{e}") unless ok + raise SwigRubyError.new("FAILED: #{expr.to_s} - #{msg}") unless ok if $VERBOSE $stdout.puts "\tPASSED #{expr} #{msg}" Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 01:54:02 UTC (rev 9732) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 05:43:30 UTC (rev 9733) @@ -656,8 +656,24 @@ swig::yield< Sequence::value_type >() ); return r; } - + Sequence* each() + { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given"); + + VALUE r; + Sequence::iterator i = self->begin(); + Sequence::iterator e = self->end(); + for ( ; i != e; ++i ) + { + r = swig::from<Sequence::value_type>(*i); + rb_yield(r); + } + + return self; + } + %rename("reject!") reject_bang; %alias reject_bang "delete_if"; Sequence* reject_bang() { @@ -692,41 +708,6 @@ return r; } - Sequence* each_with_index() - { - if ( !rb_block_given_p() ) - rb_raise( rb_eArgError, "no block given"); - - VALUE r, idx; - Sequence::iterator i = self->begin(); - Sequence::iterator e = self->end(); - unsigned c = 0; - for ( ; i != e; ++i, ++c ) - { - r = swig::from<Sequence::value_type>(*i); - idx = UINT2NUM( c ); - rb_yield_values(2, r, idx); - } - - return self; - } - - Sequence* each() - { - if ( !rb_block_given_p() ) - rb_raise( rb_eArgError, "no block given"); - - VALUE r; - Sequence::iterator i = self->begin(); - Sequence::iterator e = self->end(); - for ( ; i != e; ++i ) - { - r = swig::from<Sequence::value_type>(*i); - rb_yield(r); - } - - return self; - } } %enddef Modified: trunk/Lib/ruby/std_map.i =================================================================== --- trunk/Lib/ruby/std_map.i 2007-05-01 01:54:02 UTC (rev 9732) +++ trunk/Lib/ruby/std_map.i 2007-05-01 05:43:30 UTC (rev 9733) @@ -132,18 +132,12 @@ } %define %swig_map_common(Map...) - // %swig_sequence_methods_common(Map); - // %swig_sequence_iterator(Map); + %swig_container_methods(%arg(Map)); + // %swig_sequence_iterator(%arg(Map)); %extend { - VALUE __getitem__(const key_type& key) const { - Map::const_iterator i = self->find(key); - if ( i != self->end() ) - return swig::from( i->second ); - else - return Qnil; - } + %rename("delete") __delitem__; VALUE __delitem__(const key_type& key) { Map::iterator i = self->find(key); if (i != self->end()) { @@ -179,6 +173,27 @@ return ary; } + Map* each() + { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given"); + + VALUE k, v; + Map::iterator i = self->begin(); + Map::iterator e = self->end(); + for ( ; i != e; ++i ) + { + const Map::key_type& key = i->first; + const Map::mapped_type& val = i->second; + + k = swig::from<Map::key_type>(key); + v = swig::from<Map::mapped_type>(val); + rb_yield_values(2, k, v); + } + + return self; + } + Map* each_key() { if ( !rb_block_given_p() ) @@ -271,6 +286,13 @@ %define %swig_map_methods(Map...) %swig_map_common(Map) %extend { + VALUE __getitem__(const key_type& key) const { + Map::const_iterator i = self->find(key); + if ( i != self->end() ) + return swig::from<Map::mapped_type>( i->second ); + else + return Qnil; + } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; @@ -287,11 +309,13 @@ for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); - // @todo: improve -- this should just be swig::from(*i) - tmp = swig::from< std::pair<Map::key_type, - Map::mapped_type> >( *i ); + tmp = swig::from< Map::key_type >( i->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); + str = rb_str_cat2( str, "=>" ); + tmp = swig::from< Map::mapped_type >( i->second ); + tmp = rb_obj_as_string( tmp ); + str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; @@ -334,4 +358,16 @@ %enddef +#if defined(SWIG_RUBY_AUTORENAME) + + %mixin std::map "Enumerable"; + %rename("empty?") std::map::empty; + +#else + + %mixin std::map "Enumerable"; + %rename("empty?") std::map::empty; + +#endif + %include <std/std_map.i> Modified: trunk/Lib/ruby/std_multimap.i =================================================================== --- trunk/Lib/ruby/std_multimap.i 2007-05-01 01:54:02 UTC (rev 9732) +++ trunk/Lib/ruby/std_multimap.i 2007-05-01 05:43:30 UTC (rev 9733) @@ -86,9 +86,28 @@ } %define %swig_multimap_methods(MultiMap...) - %swig_map_common(MultiMap); + %swig_container_methods(%arg(MultiMap)); + %swig_map_common(%arg(MultiMap)); %extend { + VALUE __getitem__(const key_type& key) const { + MultiMap::const_iterator i = self->find(key); + if ( i != self->end() ) + { + MultiMap::const_iterator e = $self->upper_bound(key); + VALUE ary = rb_ary_new(); + for ( ; i != e; ++i ) + { + rb_ary_push( ary, swig::from<MultiMap::mapped_type>( i->second ) ); + } + if ( RARRAY_LEN(ary) == 1 ) + return RARRAY_PTR(ary)[0]; + return ary; + } + else + return Qnil; + } + void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(MultiMap::value_type(key,x)); } @@ -106,6 +125,7 @@ const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); str = rb_str_buf_append( str, rb_inspect(tmp) ); + str = rb_str_cat2( str, "=>" ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) @@ -191,5 +211,18 @@ } %enddef + +#if defined(SWIG_RUBY_AUTORENAME) + + %mixin std::multimap "Enumerable"; + %rename("empty?") std::multimap::empty; + +#else + + %mixin std::multimap "Enumerable"; + %rename("empty?") std::multimap::empty; + +#endif + %include <std/std_multimap.i> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 06:43:58
|
Revision: 9739 http://swig.svn.sourceforge.net/swig/?rev=9739&view=rev Author: gga73 Date: 2007-04-30 23:43:56 -0700 (Mon, 30 Apr 2007) Log Message: ----------- Improved multimap, vector and set by rearranging some methods. Modified Paths: -------------- trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_multimap.i trunk/Lib/ruby/std_set.i trunk/Lib/ruby/std_vector.i Added Paths: ----------- trunk/Examples/test-suite/li_std_set.i Added: trunk/Examples/test-suite/li_std_set.i =================================================================== --- trunk/Examples/test-suite/li_std_set.i (rev 0) +++ trunk/Examples/test-suite/li_std_set.i 2007-05-01 06:43:56 UTC (rev 9739) @@ -0,0 +1,34 @@ +/** + * @file li_std_set.i + * @author gga + * @date Tue May 1 02:52:47 2007 + * + * @brief a test of set containers. + * Languages should define swig::LANGUAGE_OBJ to be + * an entity of their native pointer type which can be + * included in a STL container. + * + * For example: + * swig::LANGUAGE_OBJ is GC_VALUE in Ruby + * swig::LANGUAGE_OBJ is PyObject_ptr in python + * + * + */ + +%module li_std_set + +%include <std_string.i> +%include <std_set.i> +%include <std_multiset.i> +%include <std_vector.i> + +%template(set_string) std::set<std::string>; +%template(set_int) std::multiset<int>; + + +%template(v_int) std::vector<int>; + + + + +%template(LanguageSet) std::set<swig::LANGUAGE_OBJ>; Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 06:43:10 UTC (rev 9738) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 06:43:56 UTC (rev 9739) @@ -519,22 +519,37 @@ /**** The Ruby container methods ****/ -%define %swig_container_printing_methods(Container...) +%define %swig_container_methods(Container...) + %extend { + %newobject dup; + Container* dup() + { + return new Container(*$self); + } + + } + +%enddef + +%define %swig_sequence_printing_methods(Sequence...) + + %extend { + VALUE inspect() { - Container::const_iterator i = $self->begin(); - Container::const_iterator e = $self->end(); - VALUE str = rb_str_new2( swig::type_name< Container >() ); + Sequence::const_iterator i = $self->begin(); + Sequence::const_iterator e = $self->end(); + VALUE str = rb_str_new2( swig::type_name< Sequence >() ); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from<Sequence::value_type>( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } @@ -544,13 +559,13 @@ VALUE to_a() { - Container::const_iterator i = $self->begin(); - Container::const_iterator e = $self->end(); + Sequence::const_iterator i = $self->begin(); + Sequence::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from<Sequence::value_type>( *i ); rb_ary_push( ary, tmp ); } return ary; @@ -558,13 +573,13 @@ VALUE to_s() { - Container::iterator i = $self->begin(); - Container::iterator e = $self->end(); + Sequence::iterator i = $self->begin(); + Sequence::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { - tmp = swig::from<Container::value_type>( *i ); + tmp = swig::from<Sequence::value_type>( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } @@ -573,43 +588,18 @@ } %enddef -%define %swig_container_methods(Container...) - %extend { - - %newobject dup; - Container* dup() - { - return new Container(*$self); - } - - } - -%enddef - %define %swig_sequence_methods_common(Sequence...) + %swig_container_methods(%arg(Sequence)) %swig_sequence_iterator(%arg(Sequence)) - %swig_container_methods(%arg(Sequence)) - + %swig_sequence_printing_methods(%arg(Sequence)) + %fragment("RubySequence_Base"); %extend { - VALUE pop() { - if ($self->empty()) return Qnil; - Sequence::value_type x = self->back(); - $self->pop_back(); - return swig::from< Sequence::value_type >( x ); - } - - %alias push "<<"; - const value_type push( const value_type& e ) { - $self->push_back( e ); - return e; - } - // Implementing delete requires semantics that go beyond the // default requirements of STD containers. // @@ -645,18 +635,6 @@ return r; } - %newobject reject; - Sequence* reject() { - if ( !rb_block_given_p() ) - rb_raise( rb_eArgError, "no block given" ); - - Sequence* r = new Sequence; - std::remove_copy_if( $self->begin(), $self->end(), - std::back_inserter(*r), - swig::yield< Sequence::value_type >() ); - return r; - } - Sequence* each() { if ( !rb_block_given_p() ) @@ -674,6 +652,7 @@ return self; } + %rename("reject!") reject_bang; %alias reject_bang "delete_if"; Sequence* reject_bang() { @@ -711,8 +690,42 @@ } %enddef + +%define %swig_sequence_back_inserters( Sequence... ) + %extend { + + VALUE pop() { + if ($self->empty()) return Qnil; + Sequence::value_type x = self->back(); + $self->pop_back(); + return swig::from< Sequence::value_type >( x ); + } + + %alias push "<<"; + const value_type push( const value_type& e ) { + $self->push_back( e ); + return e; + } + + %newobject reject; + Sequence* reject() { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given" ); + + Sequence* r = new Sequence; + std::remove_copy_if( $self->begin(), $self->end(), + std::back_inserter(*r), + swig::yield< Sequence::value_type >() ); + return r; + } + + } +%enddef + %define %swig_sequence_methods(Sequence...) - %swig_sequence_methods_common(%arg(Sequence)) + %swig_sequence_methods_common(%arg(Sequence)); + %swig_sequence_back_inserters(%arg(Sequence)); + %extend { VALUE at(difference_type i) const { Modified: trunk/Lib/ruby/std_multimap.i =================================================================== --- trunk/Lib/ruby/std_multimap.i 2007-05-01 06:43:10 UTC (rev 9738) +++ trunk/Lib/ruby/std_multimap.i 2007-05-01 06:43:56 UTC (rev 9739) @@ -86,7 +86,6 @@ } %define %swig_multimap_methods(MultiMap...) - %swig_container_methods(%arg(MultiMap)); %swig_map_common(%arg(MultiMap)); %extend { Modified: trunk/Lib/ruby/std_set.i =================================================================== --- trunk/Lib/ruby/std_set.i 2007-05-01 06:43:10 UTC (rev 9738) +++ trunk/Lib/ruby/std_set.i 2007-05-01 06:43:56 UTC (rev 9739) @@ -36,11 +36,11 @@ %} %define %swig_set_methods(set...) - %swig_sequence_iterator(set); - %swig_container_methods(set); + %swig_sequence_methods_common(set); %extend { - const value_type& push(value_type x) { + %alias push "<<"; + value_type push(value_type x) { self->insert(x); return x; } @@ -57,4 +57,17 @@ }; %enddef +#if defined(SWIG_RUBY_AUTORENAME) + +// %mixin std::set "Enumerable"; + %rename("empty?") std::set::empty; + +#else + +// %mixin std::set "Enumerable"; + %rename("empty?") std::set::empty; + +#endif + + %include <std/std_set.i> Modified: trunk/Lib/ruby/std_vector.i =================================================================== --- trunk/Lib/ruby/std_vector.i 2007-05-01 06:43:10 UTC (rev 9738) +++ trunk/Lib/ruby/std_vector.i 2007-05-01 06:43:56 UTC (rev 9739) @@ -26,13 +26,11 @@ %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); - %swig_container_printing_methods(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); - %swig_container_printing_methods(Type); %enddef This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 09:55:47
|
Revision: 9740 http://swig.svn.sourceforge.net/swig/?rev=9740&view=rev Author: gga73 Date: 2007-05-01 02:55:44 -0700 (Tue, 01 May 2007) Log Message: ----------- Fixed VALUE less compare function to be a good GC_VALUE less compare function. This is used for hashing. Moved the functor over to rubyclasses to avoid bloat when GC_VALUE is not used. Updated std::map test to check for equivalence. Updated CHANGES.current a tad to move the STL stuff as last and merge two feature updates as one. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/ruby/li_std_map_runme.rb trunk/Lib/ruby/rubyclasses.swg trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_map.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-05-01 06:43:56 UTC (rev 9739) +++ trunk/CHANGES.current 2007-05-01 09:55:44 UTC (rev 9740) @@ -1,5 +1,30 @@ Version 1.3.32 (in progress) ============================ + +05/05/2007: gga + [Ruby] + STL files have been upgraded to follow the new swig/python + Lib/std conventions. + This means std::vector, std::set, std::map, set::multimap, + std::multiset, std::deque and std::string are now properly + supported, including their iterators, support for containing + ruby objects (swig::GC_VALUE) and several other ruby + enhancements. + std::ios, std::iostream, std::iostreambuf and std::sstream + are now also supported. + std::wstring, std::wios, std::wiostream, std::wiostreambuf + and std::wsstream are supported verbatim with no unicode + conversion. + + std_vector.i now mimics the behavior of Ruby Arrays much more + closely, supporting slicing, shifting, unshifting, + multiple indexing and proper return values on assignment. + + COMPATABILITY NOTE: this changes the older api a little bit in + that improper indexing would previously (incorrectly) raise + exceptions. Now, nil is returned instead, following ruby's + standard Array behavior. + 05/01/2007: gga [Ruby] Improved the documentation to document the new features @@ -9,10 +34,35 @@ [Ruby] Added %initstack and %ignorestack directives for director functions. These allow you to control whether a director - function should re-init the ruby stack. + function should re-init the Ruby stack. This is sometimes needed for an embedded Ruby where the director method is used as a C++ callback and not called by the user from ruby code. + Explanation: + Ruby's GC needs to be aware of the running OS stack in order to + mark any VALUE (Ruby objects) it finds there to avoid collection + of them. This allows the ruby API to be very simple and allows + you to write code like "VALUE a = sth" anywhere without needing + to do things like refcounting like python. + By default, the start of the stack is set when ruby_init() is + called. If ruby is inited within main(), as it usually is the + case with the main ruby executable, ruby will be able to calculate + its stack properly. However, when this is not possible, as when + ruby is embedded as a plugin to an application where main is not + available, ruby_init() will be called in the wrong place, and + ruby will be incorrectly tracking the stack from the function + that called ruby_init() forwards only, which can lead to + all sorts of weird crashes or to ruby thinking it has run out of + stack space incorrectly. + To avoid this, director (callback) functions can now be tagged + to try to reset the ruby stack, which will solve the issues. + NOTE: ruby1.8.6 still contains a bug in it in that its function + to reset the stack will not always do so. This bug is triggered + very rarely, when ruby is called from two very distinct places + in memory, like a branch of main() and another dso. This bug + has now been reported to ruby-core and is pending further + investigation. + (bug #1700535 and patch #1702907) 04/30/2007: wsfulton Fix #1707582 - Restore building from read-only source directories. @@ -26,26 +76,13 @@ 04/30/2007: gga [Ruby] - STL files have been upgraded to follow the new swig/python - Lib/std conventions. - std_vector.i now mimics the behavior of Ruby Arrays much more - closely, supporting slicing, shifting, unshifting, - multiple indexing and proper return values on assignment. - - COMPATABILITY NOTE: this changes the older api a little bit in - that improper indexing would previously (incorrectly) raise - exceptions. Now, nil is returned instead, following ruby's - standard Array behavior. - -04/30/2007: gga - [Ruby] Ruby no longer creates the free_Class function if the class - containes its own user defined free function (%freefunc). + contains its own user defined free function (%freefunc). (bug #1702882) 04/30/2007: gga [Ruby] - Made directors raise a ruby expection for incorrect argout + Made directors raise a ruby exception for incorrect argout returned values if RUBY_EMBEDDED is set, instead of throwing an actual SwigDirector exception. This will prevent crashes when ruby is embedded and unaware @@ -91,7 +128,7 @@ %feature("numoutputs","0") added. This feature allows you to ignore the output of a function so - that it is not added to a list of outpus values + that it is not added to a list of output values ( ie. argouts ). This should also become a feature of %typemap(directorout) as "numoutputs"=0, just like "numinputs"=0 exists. @@ -101,15 +138,15 @@ %include <typemaps.i> %feature("numoutputs","0") { Class::member_function1 }; - %typemap(out) MStatus { // some code, like ignore mstatus - // and raise exception }; + %typemap(out) MStatus { // some code, like check mstatus + // and raise exception if wrong }; %inline %{ typedef int MStatus; class Class { // one argument returned, but director out code added - // MStatus is discarded. + // MStatus is discarded as a return (out) parameter. virtual MStatus member_function1( int& OUTPUT ); // two arguments returned, director out code added @@ -118,35 +155,6 @@ }; %} -04/29/2007: gga - [Ruby] - Directors will now try to reset the ruby stack on the first call - to them if the developer sets the define RUBY_EMBEDDED. - Explanation: - Ruby's GC needs to be aware of the running OS stack in order to - mark any VALUE (Ruby objects) it finds there to avoid collection - of them. This allows the ruby API to be very simple and allows - you to write code like "VALUE a = sth" anywhere without needing - to do things like refcounting like python. - By default, the start of the stack is set when ruby_init() is - called. If ruby is inited within main(), as it usually is - with the main ruby executable, ruby will be able to calculate - its stack properly. However, when this is not possible, as when - ruby is embedded as a plugin to an application where main is not - available, ruby_init() will be called in the wrong place, and - ruby will be incorrectly tracking the stack from the function - that called ruby_init() only, which can lead to - all sorts of weird crashes or to ruby thinking it has run out of - stack space incorrectly. - To avoid this, director (callback) functions can now be tagged - to try to reset the ruby stack, which will solve the issues. - NOTE: ruby1.8.6 still contains a bug in it in that its function - to reset the stack will not always do so. This bug is triggered - very rarely, when ruby is called from two very distinct places - in memory, like a branch of main() and another dso. This bug - has now been reported to ruby-core and is pending further - investigation. - (bug #1700535 and patch #1702907) 04/21/2007: olly Fix parsing of float constants with an exponent (e.g. 1e-02f) Modified: trunk/Examples/test-suite/ruby/li_std_map_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_map_runme.rb 2007-05-01 06:43:56 UTC (rev 9739) +++ trunk/Examples/test-suite/ruby/li_std_map_runme.rb 2007-05-01 09:55:44 UTC (rev 9740) @@ -40,7 +40,7 @@ pm = Li_std_map::LanguageMap.new m.each_key { |k| pm[k] = m[k] } -m.each_key { |k| swig_assert("#{pm[k].inspect} == #{m[k].inspect}") } +m.each_key { |k| swig_assert_equal("pm[#{k.inspect}]", "m[#{k.inspect}]", binding) } m = Li_std_map::MmapA.new m[0] = a1 @@ -49,7 +49,7 @@ m.respond_to?(:each) == true m.respond_to?(:each_key) == true m.respond_to?(:each_value) == true - +m.values_at(0)[0] == m[0] EOF mii = Li_std_map::Mapii.new Modified: trunk/Lib/ruby/rubyclasses.swg =================================================================== --- trunk/Lib/ruby/rubyclasses.swg 2007-05-01 06:43:56 UTC (rev 9739) +++ trunk/Lib/ruby/rubyclasses.swg 2007-05-01 09:55:44 UTC (rev 9740) @@ -125,6 +125,48 @@ typedef GC_VALUE LANGUAGE_OBJ; } + + +namespace std { + template <> + struct less< swig::GC_VALUE >: public binary_function< swig::GC_VALUE, + swig::GC_VALUE, bool > + { + static ID cmp_id; + static ID hash_id; + + bool + operator()( const swig::GC_VALUE& v, const swig::GC_VALUE& w ) const + { + // SWIG_RUBY_THREAD_BEGIN_BLOCK; + + VALUE ret = Qnil; + + // First, try to compare using the <=> operator if present + if ( rb_respond_to( v, cmp_id ) == Qtrue ) + { + ret = rb_funcall(VALUE(v), cmp_id, 1, VALUE(w)); + } + + bool res; + // If that fails, try to use the two object's hash function to compare. + if ( ret == Qnil ) { + VALUE a = rb_funcall( VALUE(v), hash_id, 0 ); + VALUE b = rb_funcall( VALUE(w), hash_id, 0 ); + res = a < b; // as shifted integers + } + else + { + res = NUM2INT( ret ) < 0; + } + // SWIG_RUBY_THREAD_END_BLOCK; + return res; + } + }; + + ID less< swig::GC_VALUE >::cmp_id = rb_intern("<=>"); + ID less< swig::GC_VALUE >::hash_id = rb_intern("hash"); +} %} Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 06:43:56 UTC (rev 9739) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 09:55:44 UTC (rev 9740) @@ -71,27 +71,7 @@ { %#include <functional> -namespace std { - template <> - struct less< VALUE >: public binary_function< VALUE, VALUE, bool > - { - static ID id; - bool - operator()( VALUE v, VALUE w ) const - { - // SWIG_RUBY_THREAD_BEGIN_BLOCK; - bool res = NUM2INT( rb_funcall(v, id, 1, w) ) < 0; - // SWIG_RUBY_THREAD_END_BLOCK; - return res; - } - }; - - ID less< VALUE >::id = rb_intern("<=>"); - -} - - namespace swig { template < class T > struct yield : public std::unary_function< T, bool > @@ -652,19 +632,36 @@ return self; } + %newobject select + Sequence* select() { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given" ); + Sequence* r = new Sequence; + Sequence::iterator i = self->begin(); + Sequence::iterator e = self->end(); + for ( ; i != e; ++i ) + { + VALUE v = swig::from<Sequence::value_type>(*i); + if ( RTEST( rb_yield(v) ) ) + $self->push_back(*i); + } + + return r; + } + + %rename("reject!") reject_bang; %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); - VALUE r; Sequence::iterator i = self->begin(); Sequence::iterator e = self->end(); for ( ; i != e; ) { - r = swig::from<Sequence::value_type>(*i); + VALUE r = swig::from<Sequence::value_type>(*i); if ( RTEST( rb_yield(r) ) ) $self->erase(i++); else Modified: trunk/Lib/ruby/std_map.i =================================================================== --- trunk/Lib/ruby/std_map.i 2007-05-01 06:43:56 UTC (rev 9739) +++ trunk/Lib/ruby/std_map.i 2007-05-01 09:55:44 UTC (rev 9740) @@ -194,6 +194,47 @@ return self; } + %newobject select; + Map* select() { + if ( !rb_block_given_p() ) + rb_raise( rb_eArgError, "no block given" ); + + Map* r = new Map; + Map::iterator i = $self->begin(); + Map::iterator e = $self->end(); + for ( ; i != e; ++i ) + { + VALUE k = swig::from<Map::key_type>(i->first); + VALUE v = swig::from<Map::mapped_type>(i->second); + if ( RTEST( rb_yield_values(2, k, v) ) ) + $self->insert(r->end(), *i); + } + + return r; + } + + %typemap(in) (int argc, VALUE* argv) { + $1 = argc; + $2 = argv; + } + + VALUE values_at(int argc, VALUE* argv, ...) { + + VALUE r = rb_ary_new(); + ID id = rb_intern("[]"); + swig_type_info* type = swig::type_info< Map >(); + VALUE me = SWIG_NewPointerObj( $self, type, 0 ); + for ( int i = 0; i < argc; ++i ) + { + VALUE key = argv[i]; + VALUE tmp = rb_funcall( me, id, 1, key ); + rb_ary_push( r, tmp ); + } + + return r; + } + + Map* each_key() { if ( !rb_block_given_p() ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 10:37:11
|
Revision: 9743 http://swig.svn.sourceforge.net/swig/?rev=9743&view=rev Author: gga73 Date: 2007-05-01 03:37:09 -0700 (Tue, 01 May 2007) Log Message: ----------- Added support for complex numbers. Modified Paths: -------------- trunk/Examples/test-suite/ruby/Makefile.in trunk/Lib/ruby/rubycontainer.swg Added Paths: ----------- trunk/Lib/ruby/rubycomplex.swg trunk/Lib/ruby/std_complex.i Modified: trunk/Examples/test-suite/ruby/Makefile.in =================================================================== --- trunk/Examples/test-suite/ruby/Makefile.in 2007-05-01 10:08:24 UTC (rev 9742) +++ trunk/Examples/test-suite/ruby/Makefile.in 2007-05-01 10:37:09 UTC (rev 9743) @@ -23,7 +23,7 @@ li_std_set \ naming \ primitive_types \ -# std_containers \ + std_containers \ track_objects \ track_objects_directors Added: trunk/Lib/ruby/rubycomplex.swg =================================================================== --- trunk/Lib/ruby/rubycomplex.swg (rev 0) +++ trunk/Lib/ruby/rubycomplex.swg 2007-05-01 10:37:09 UTC (rev 9743) @@ -0,0 +1,115 @@ +/* + Defines the As/From conversors for double/float complex, you need to + provide complex Type, the Name you want to use in the conversors, + the complex Constructor method, and the Real and Imag complex + accesor methods. + + See the std_complex.i and ccomplex.i for concret examples. +*/ + +/* + Ruby does not have native complex numbers. They are an extension in the + STD library. +*/ +%{ + static VALUE rb_cComplex = Qnil; + static ID real_id = Qnil; + static ID imag_id = Qnil; +%} + +%init { + rb_require("complex"); + rb_cComplex = rb_const_get( rb_cObject, rb_intern("Complex") ); + if ( rb_cComplex == Qnil ) + rb_warn("Complex numbers not available"); + real_id = rb_intern("real"); + imag_id = rb_intern("imag"); +} + +/* the common from conversor */ +%define %swig_fromcplx_conv(Type, Real, Imag) +%fragment(SWIG_From_frag(Type),"header") +{ +SWIGINTERNINLINE VALUE +SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) +{ + VALUE args[] = { + rb_float_new(Real(c)), + rb_float_new(Imag(c)) + }; + return rb_class_new_instance(2, args, rb_cComplex); +} +} +%enddef + +/* the double case */ +%define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) +%fragment(SWIG_AsVal_frag(Type),"header", + fragment=SWIG_AsVal_frag(double)) +{ +SWIGINTERN int +SWIG_AsVal(Type) (VALUE o, Type* val) +{ + if ( rb_obj_is_kind_of( o, rb_cComplex) ) { + if (val) { + VALUE real = rb_funcall(o, real_id, 0 ); + VALUE imag = rb_funcall(o, imag_id, 0 ); + *val = Constructor(RFLOAT(real)->value, RFLOAT(imag)->value); + return SWIG_OK; + } + } else { + double d; + int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); + if (SWIG_IsOK(res)) { + if (val) *val = Constructor(d, 0.0); + return res; + } + } + return SWIG_TypeError; +} +} +%swig_fromcplx_conv(Type, Real, Imag); +%enddef + +/* the float case */ +%define %swig_cplxflt_conv(Type, Constructor, Real, Imag) +%fragment(SWIG_AsVal_frag(Type),"header", + fragment=SWIG_AsVal_frag(float)) { +SWIGINTERN int +SWIG_AsVal(Type)(VALUE o, Type *val) +{ + if ( rb_obj_is_kind_of( o, rb_cComplex) ) { + VALUE real = rb_funcall(o, real_id, 0 ); + VALUE imag = rb_funcall(o, imag_id, 0 ); + double re = RFLOAT(real)->value; + double im = RFLOAT(imag)->value; + if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { + if (val) *val = Constructor(%numeric_cast(re, float), + %numeric_cast(im, float)); + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else { + float re; + int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); + if (SWIG_IsOK(res)) { + if (val) *val = Constructor(re, 0.0); + return res; + } + } + return SWIG_TypeError; +} +} + +%swig_fromcplx_conv(Type, Real, Imag); +%enddef + +#define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ +%swig_cplxflt_conv(Type, Constructor, Real, Imag) + + +#define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ +%swig_cplxdbl_conv(Type, Constructor, Real, Imag) + + Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 10:08:24 UTC (rev 9742) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 10:37:09 UTC (rev 9743) @@ -644,7 +644,7 @@ { VALUE v = swig::from< Sequence::value_type >(*i); if ( RTEST( rb_yield(v) ) ) - $self->push_back(*i); + $self->insert( r->end(), *i); } return r; Added: trunk/Lib/ruby/std_complex.i =================================================================== --- trunk/Lib/ruby/std_complex.i (rev 0) +++ trunk/Lib/ruby/std_complex.i 2007-05-01 10:37:09 UTC (rev 9743) @@ -0,0 +1,22 @@ +/* + * STD C++ complex typemaps + */ + +%include <rubycomplex.swg> + +%{ +#include <complex> +%} + +/* defining the complex as/from converters */ + +%swig_cplxdbl_convn(std::complex<double>, std::complex<double>, std::real, std::imag) +%swig_cplxflt_convn(std::complex<float>, std::complex<float>, std::real, std::imag) + +/* defining the typemaps */ + +%typemaps_primitive(%checkcode(CPLXDBL), std::complex<double>); +%typemaps_primitive(%checkcode(CPLXFLT), std::complex<float>); + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-01 22:40:57
|
Revision: 9746 http://swig.svn.sourceforge.net/swig/?rev=9746&view=rev Author: gga73 Date: 2007-05-01 15:40:55 -0700 (Tue, 01 May 2007) Log Message: ----------- Fixed a bug with argout values being incorrectly returned when the first argout/returned element was an array. Made std::pair and container returned elements be frozen (like tuples in python). Added the std_containers.i test from python and created a ruby runme file for it. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/ruby/rubycontainer.swg trunk/Lib/ruby/std_pair.i trunk/Source/Modules/ruby.cxx Added Paths: ----------- trunk/Examples/test-suite/ruby/std_containers_runme.rb trunk/Examples/test-suite/std_containers.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-05-01 21:38:33 UTC (rev 9745) +++ trunk/CHANGES.current 2007-05-01 22:40:55 UTC (rev 9746) @@ -1,6 +1,14 @@ Version 1.3.32 (in progress) ============================ +05/07/2007: gga + [Ruby] + Docstrings are now supported. + %feature("autodoc") and %feature("docstring") are now + properly supported in Ruby. These features will generate + a _wrap.cxx file with rdoc comments in them. + TODO: add doxygen -> rdoc conversion support. + 05/05/2007: gga [Ruby] STL files have been upgraded to follow the new swig/python @@ -10,8 +18,8 @@ supported, including their iterators, support for containing ruby objects (swig::GC_VALUE) and several other ruby enhancements. - std::ios, std::iostream, std::iostreambuf and std::sstream - are now also supported. + std::complex, std::ios, std::iostream, std::iostreambuf and + std::sstream are now also supported. std::wstring, std::wios, std::wiostream, std::wiostreambuf and std::wsstream are supported verbatim with no unicode conversion. @@ -25,6 +33,12 @@ exceptions. Now, nil is returned instead, following ruby's standard Array behavior. +05/02/2007: gga + [Ruby] + Fixed a subtle bug in multiple argouts that could get triggered if + the user returned two or more arguments and the first one was an + array. + 05/01/2007: gga [Ruby] Improved the documentation to document the new features Added: trunk/Examples/test-suite/ruby/std_containers_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/std_containers_runme.rb (rev 0) +++ trunk/Examples/test-suite/ruby/std_containers_runme.rb 2007-05-01 22:40:55 UTC (rev 9746) @@ -0,0 +1,119 @@ +#!/usr/bin/env ruby +# +# Standard containers test suite. Tests: +# std::complex, std::vector, std::set and std::map, +# and IN/OUT functions for them. +# +# Author:: gga +# Copyright:: 2007 +# License:: Ruby +# + +require 'swig_assert' +require 'std_containers' +include Std_containers + +swig_assert_each_line(<<'EOF', binding) + +cube = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] + +icube = cident(cube) +icube.each_index { |i| swig_assert_equal("cube[#{i}]","icube[#{i}]", binding, 'cident') } + + +p = [1,2] +p == pident(p) + +v = [1,2,3,4,5,6] +iv = vident(v) +iv.each_index { |i| swig_assert_equal("iv[#{i}]","v[#{i}]", binding, 'vident') } + + + +iv = videntu(v) +iv.each_index { |i| swig_assert_equal("iv[#{i}]","v[#{i}]", binding, 'videntu') } + + +vu = Vector_ui.new(v) +vu[2] == videntu(vu)[2] + +v[0,3][1] == vu[0,3][1] + +m = [[1,2,3],[2,3],[3,4]] +im = midenti(m) + +0.upto(m.size-1){ |i| 0.upto(m[i].size-1) { |j| swig_assert_equal("m[#{i}][#{j}]","im[#{i}][#{j}]", binding, 'getslice') } } + + +m = [[1,0,1],[1,1],[1,1]] +im = midentb(m) + +0.upto(m.size-1){ |i| 0.upto(m[i].size-1) { |j| swig_assert_equal("(m[#{i}][#{j}]==1)","im[#{i}][#{j}]", binding, 'getslice') } } + +mi = Imatrix.new(m) +mc = Cmatrix.new(m) +mi[0][1] == mc[0][1] # or bad matrix + +map ={} +map['hello'] = 1 +map['hi'] = 2 +map['3'] = 2 + +imap = Std_containers.mapident(map) +map.each_key { |k| swig_assert_equal("map['#{k}']", "imap['#{k}']", binding) } + +mapc ={} +c1 = C.new +c2 = C.new +mapc[1] = c1 +mapc[2] = c2 + +mapidentc(mapc) + +vi = Vector_i.new([2,2,3,4]) +v1 = vi.dup +v1.class == vi.class +v1 != vi +v1.object_id != vi.object_id + +v = [1,2] +v1 = v_inout(vi) +vi[1] == v1[1] +# vi.class == v1.class # only if SWIG_RUBY_EXTRA_NATIVE_CONTAINERS was set + +v1,v2 = [[1,2],[3,4]] +v1,v2 = v_inout2(v1,v2) +v2 == [1,2] +v1 == [3,4] + +a1 = A.new(1) +a2 = A.new(2) + +p1 = [1,a1] +p2 = [2,a2] +v = [p1,p2] +v2 = pia_vident(v) + + + +# v2[0][1].a +# v2[1][1].a + +# v3 = Std_containers.vector_piA(v2) + +# v3[0][1].a +# v3[1][1].a + + + + +s = Set_i.new +s.push(1) +s.push(2) +s.push(3) +j = 1 +s.each { |i| swig_assert_equal("#{i}","#{j}", binding, "for s[#{i}]"); j += 1 } + + +EOF + Property changes on: trunk/Examples/test-suite/ruby/std_containers_runme.rb ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Added: trunk/Examples/test-suite/std_containers.i =================================================================== --- trunk/Examples/test-suite/std_containers.i (rev 0) +++ trunk/Examples/test-suite/std_containers.i 2007-05-01 22:40:55 UTC (rev 9746) @@ -0,0 +1,207 @@ +%module std_containers + +// +// STL containers test suite. +// Tests: +// std::complex, std::string, std::vector, std::set, std::deque, +// std::pair, std::map, std::multiset, std::multimap and IN/OUT functions +// for them, with C++ types. +// + +%{ +#include <set> +%} +%include std_vector.i +%include std_string.i +%include std_deque.i +%include std_list.i +%include std_set.i +%include std_multiset.i +%include std_pair.i +%include std_map.i +%include std_multimap.i +%include std_complex.i + +%template() std::vector<double>; +%template() std::pair<std::string, int>; +%template() std::pair<int,double>; + +%template() std::vector< std::vector<double > > ; +%template(ccube) std::vector< std::vector< std::vector<double > > >; + +%inline +{ + typedef + std::vector<std::vector<std::vector<double > > > + ccube; + + ccube cident(const ccube& c) + { + return c; + } + + struct C + { + }; +} + + +%template(map_si) std::map<std::string, int>; +%template(pair_iC) std::pair<int, C*>; +%template(map_iC) std::map<int, C*>; +%template(mmap_si) std::multimap<std::string, int>; +%template(set_i) std::set<int>; +%template(multiset_i) std::multiset<int>; +%template(list_i) std::list<int>; +%template(deque_i) std::deque<int>; + +%template(vector_b) std::vector<bool>; +%template(vector_i) std::vector<int>; +%template(vector_c) std::vector<std::complex<double> >; +%template(vector_ui) std::vector<unsigned int>; + +%template(bmatrix) std::vector<std::vector<bool> >; +%template(imatrix) std::vector<std::vector<int> >; +%template(cmatrix) std::vector<std::vector<std::complex<double> > >; + +%apply std::vector<int> *INOUT {std::vector<int> *INOUT2}; + +%inline +{ + typedef std::vector<std::vector<int> > imatrix; + imatrix midenti(const imatrix& v) + { + return v; + } + + typedef std::vector<std::vector<bool> > bmatrix; + bmatrix midentb(const bmatrix& v) + { + return v; + } + + std::map<int,C*> mapidentc(const std::map<int,C*>& v) + { + return v; + } + + std::map<int,int> mapidenti(const std::map<int,int>& v) + { + return v; + } + + std::map<std::string,int> mapident(const std::map<std::string,int>& v) + { + return v; + } + + std::multimap<std::string,int> mapident(const std::multimap<std::string,int>& v) + { + return v; + } + + std::vector<int> vident(const std::vector<int>& v) + { + return v; + } + + std::set<int> sident(const std::set<int>& v) + { + return v; + } + + std::vector<unsigned int> videntu(const std::vector<unsigned int>& v) + { + return v; + } + + + int get_elem(const std::vector<int>& v, int index) + { + return v[index]; + } + + std::pair<int,double> pident(const std::pair<int,double>& p) + { + return p; + } + + void + v_inout(std::vector<int> *INOUT) { + *INOUT = *INOUT; + } + + void + v_inout2(std::vector<int> *INOUT, std::vector<int> *INOUT2) { + std::swap(*INOUT, *INOUT2); + } + +} + + +%{ + + template <class C> struct Param + { + }; +%} + + +template <class C> struct Param +{ +}; + + +%template(Param_c) Param<std::complex<double> >; +%inline +{ + int hello(Param<std::complex<double> > c) + { + return 0; + } +} + +%inline +{ + struct A + { + A(int aa = 0) : a(aa) + { + } + int a; + }; +} + +%template() std::pair<A,int>; +%template(pair_iA) std::pair<int,A>; +%template(vector_piA) std::vector<std::pair<int,A> >; + + +%inline { + std::pair<A,int> ident(std::pair<int,A> a, const std::pair<int,int>& b) + { + return std::pair<A,int>(); + } + + + std::vector<std::pair<int,A> > pia_vident(std::vector<std::pair<int,A> > a ) + { + return a; + } + + struct Foo + { + Foo(int i) { + } + }; + +} + + +%std_nodefconst_type(Foo); + +%template(vector_Foo) std::vector<Foo>; +%template(deque_Foo) std::deque<Foo>; +%template(list_Foo) std::list<Foo>; + + Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 21:38:33 UTC (rev 9745) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-01 22:40:55 UTC (rev 9746) @@ -1007,6 +1007,7 @@ RARRAY_PTR(obj)[i] = swig::from<value_type>(*it); } RARRAY_LEN(obj) = size; + rb_obj_freeze(obj); // treat as immutable result return obj; } else { rb_raise(rb_eRangeError,"sequence size not valid in ruby"); Modified: trunk/Lib/ruby/std_pair.i =================================================================== --- trunk/Lib/ruby/std_pair.i 2007-05-01 21:38:33 UTC (rev 9745) +++ trunk/Lib/ruby/std_pair.i 2007-05-01 22:40:55 UTC (rev 9746) @@ -124,13 +124,15 @@ static VALUE from(const std::pair<T,U>& val) { VALUE obj = rb_ary_new2(2); - RARRAY_PTR(obj)[0] = swig::from< typename swig::noconst_traits<T >::noconst_type>(val.first); + RARRAY_PTR(obj)[0] = swig::from< + typename swig::noconst_traits<T >::noconst_type>(val.first); RARRAY_PTR(obj)[1] = swig::from(val.second); RARRAY_LEN(obj) = 2; rb_define_singleton_method(obj, "second", VALUEFUNC(_wrap_pair_second), 0 ); rb_define_singleton_method(obj, "second=", VALUEFUNC(_wrap_pair_second_eq), 1 ); + rb_obj_freeze(obj); // treat as immutable tuple return obj; } }; Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2007-05-01 21:38:33 UTC (rev 9745) +++ trunk/Source/Modules/ruby.cxx 2007-05-01 22:40:55 UTC (rev 9746) @@ -942,7 +942,7 @@ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); - need_result = 1; + need_result += 1; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); @@ -1239,6 +1239,19 @@ need_result = 1; // Printf(f->code, "DATA_PTR(self) = result;\n"); } + else + { + if ( need_result > 1 ) { + if ( SwigType_type(t) == T_VOID ) + Printf(f->code, "vresult = rb_ary_new();\n"); + else + { + Printf(f->code, "if (vresult == Qnil) vresult = rb_ary_new();\n"); + Printf(f->code, "else vresult = SWIG_Ruby_AppendOutput( " + "rb_ary_new(), vresult);\n"); + } + } + } /* Dump argument output code; */ Printv(f->code, outarg, NIL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-02 01:28:26
|
Revision: 9747 http://swig.svn.sourceforge.net/swig/?rev=9747&view=rev Author: gga73 Date: 2007-05-01 18:28:21 -0700 (Tue, 01 May 2007) Log Message: ----------- Fixed last test in std_set test suite that was failing due to having been done with old hash sort. Improved rubycontainer a little bit. Made GC_VALUE sort an rb_protect function to prevent bad sorting attempt of an Array against a String. Modified Paths: -------------- trunk/Examples/test-suite/ruby/li_std_set_runme.rb trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Lib/ruby/rubyclasses.swg trunk/Lib/ruby/rubycontainer.swg Modified: trunk/Examples/test-suite/ruby/li_std_set_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_set_runme.rb 2007-05-01 22:40:55 UTC (rev 9746) +++ trunk/Examples/test-suite/ruby/li_std_set_runme.rb 2007-05-02 01:28:21 UTC (rev 9747) @@ -57,7 +57,7 @@ s.insert([1,2]) s.insert(1) s.insert("hello") -s.to_a == [1,'hello',[1,2]] +s.to_a == [1,[1,2],'hello'] # sort order: s.sort {|a,b| a.hash <=> b.hash} EOF Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-01 22:40:55 UTC (rev 9746) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-05-02 01:28:21 UTC (rev 9747) @@ -93,5 +93,8 @@ halved == dv.to_a sv = StructVector.new sv << Li_std_vector::Struct.new +sv[0].class == Li_std_vector::Struct +sv[1] = Li_std_vector::Struct.new + EOF Modified: trunk/Lib/ruby/rubyclasses.swg =================================================================== --- trunk/Lib/ruby/rubyclasses.swg 2007-05-01 22:40:55 UTC (rev 9746) +++ trunk/Lib/ruby/rubyclasses.swg 2007-05-02 01:28:21 UTC (rev 9747) @@ -135,6 +135,13 @@ static ID cmp_id; static ID hash_id; + + static VALUE swig_protect_funcall( VALUE p ) + { + swig::GC_VALUE* args = (swig::GC_VALUE*) p; + return rb_funcall(VALUE(args[0]), cmp_id, 1, VALUE(args[1])); + } + bool operator()( const swig::GC_VALUE& v, const swig::GC_VALUE& w ) const { @@ -145,7 +152,10 @@ // First, try to compare using the <=> operator if present if ( rb_respond_to( v, cmp_id ) == Qtrue ) { - ret = rb_funcall(VALUE(v), cmp_id, 1, VALUE(w)); + int status; + swig::GC_VALUE args[] = { v, w }; + ret = rb_protect( PROTECTFUNC(swig_protect_funcall), VALUE(args), + &status ); } bool res; Modified: trunk/Lib/ruby/rubycontainer.swg =================================================================== --- trunk/Lib/ruby/rubycontainer.swg 2007-05-01 22:40:55 UTC (rev 9746) +++ trunk/Lib/ruby/rubycontainer.swg 2007-05-02 01:28:21 UTC (rev 9747) @@ -607,7 +607,7 @@ VALUE r = Qnil; try { - r = swig::from< Sequence >( *(swig::getslice(self, i, j)) ); + r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { @@ -744,7 +744,7 @@ VALUE r = Qnil; try { - r = swig::from< Sequence >( *(swig::getslice(self, i, j)) ); + r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { @@ -792,46 +792,65 @@ if ( noend ) e -= 1; if ( e >= len ) e = len - 1; - return swig::from< Sequence >( *(swig::getslice(self, s, e+1)) ); + return swig::from< Sequence* >( swig::getslice(self, s, e+1) ); } - VALUE __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { - *(swig::getpos(self,i)) = x; - return swig::from< Sequence::value_type >( x ); - } + VALUE __setitem__(difference_type i, const value_type& x) + { + std::size_t len = $self->size(); + if ( i < 0 ) i = len - i; + else if ( i >= len ) + $self->resize( i+1, x ); + else + *(swig::getpos(self,i)) = x; + return swig::from< Sequence::value_type >( x ); + } + VALUE __setitem__(difference_type i, difference_type j, const Sequence& v) - throw (std::out_of_range, std::invalid_argument) { + throw (std::invalid_argument) { if ( j <= 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) i = len - i; - j += i; if ( j >= len ) j = len-1; + j += i; + if ( j >= len ) { + $self->resize( j+1, *(v.begin()) ); + j = len-1; + } VALUE r = Qnil; - try { - swig::setslice(self, i, j, v); - r = swig::from< const Sequence* >( &v ); - } - catch( std::out_of_range ) - { - } + swig::setslice(self, i, j, v); + r = swig::from< const Sequence* >( &v ); return r; } } %enddef +// ..I don't think %swig_sequence_methods_val are really used at all anymore... %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { - value_type __getitem__(difference_type i) throw (std::out_of_range) { - return *(swig::cgetpos(self, i)); + VALUE __getitem__(difference_type i) { + VALUE r = Qnil; + try { + r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); + } + catch( std::out_of_range ) + { + } + return r; } - void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { - *(swig::getpos(self,i)) = x; + VALUE __setitem__(difference_type i, value_type x) { + std::size_t len = $self->size(); + if ( i < 0 ) i = len - i; + else if ( i >= len ) + $self->resize( i+1, x ); + else *(swig::getpos(self,i)) = x; + return swig::from< Sequence::value_type >( x ); } } %enddef This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-02 10:00:28
|
Revision: 9750 http://swig.svn.sourceforge.net/swig/?rev=9750&view=rev Author: gga73 Date: 2007-05-02 03:00:26 -0700 (Wed, 02 May 2007) Log Message: ----------- STL stream support for Ruby. docstring and autodoc support for Ruby. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/ruby/rubytypemaps.swg trunk/Lib/ruby/std_ios.i trunk/Lib/ruby/std_string.i trunk/Source/Modules/ruby.cxx Added Paths: ----------- trunk/Examples/test-suite/li_std_stream.i trunk/Examples/test-suite/ruby/li_std_stream_runme.rb trunk/Lib/ruby/std_basic_string.i trunk/Lib/ruby/std_char_traits.i trunk/Lib/ruby/std_iostream.i trunk/Lib/ruby/std_sstream.i trunk/Lib/ruby/std_streambuf.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-05-02 05:22:44 UTC (rev 9749) +++ trunk/CHANGES.current 2007-05-02 10:00:26 UTC (rev 9750) @@ -8,13 +8,12 @@ Added typename for raw lua_State* Added documentation on native functions. -05/07/2007: gga +05/02/2007: gga [Ruby] Docstrings are now supported. %feature("autodoc") and %feature("docstring") are now properly supported in Ruby. These features will generate a _wrap.cxx file with rdoc comments in them. - TODO: add doxygen -> rdoc conversion support. 05/05/2007: gga [Ruby] @@ -42,6 +41,14 @@ 05/02/2007: gga [Ruby] + Changed the value of SWIG_TYPECHECK_BOOL to be 10000 (ie. higher + than that of all integers). This is because Ruby allows typecasting + integers down to booleans which can make overloaded functions on + bools and integers to fail. + (bug# 1488142) + +05/02/2007: gga + [Ruby] Fixed a subtle bug in multiple argouts that could get triggered if the user returned two or more arguments and the first one was an array. Added: trunk/Examples/test-suite/li_std_stream.i =================================================================== --- trunk/Examples/test-suite/li_std_stream.i (rev 0) +++ trunk/Examples/test-suite/li_std_stream.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1,59 @@ +%module li_std_stream + +%inline %{ + struct A; +%} + +%include <std_iostream.i> +%include <std_sstream.i> + + + +%callback(1) A::bar; + +%inline %{ + + struct B { + virtual ~B() + { + } + + }; + + struct A : B + { + void __add__(int a) + { + } + + void __add__(double a) + { + } + + static int bar(int a){ + return a; + } + + static int foo(int a, int (*pf)(int a)) + { + return pf(a); + } + + + std::ostream& __rlshift__(std::ostream& out) + { + out << "A class"; + return out; + } + }; +%} + +%extend std::basic_ostream<char>{ + std::basic_ostream<char>& + operator<<(const A& a) + { + *self << "A class"; + return *self; + } +} + Added: trunk/Examples/test-suite/ruby/li_std_stream_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_stream_runme.rb (rev 0) +++ trunk/Examples/test-suite/ruby/li_std_stream_runme.rb 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# +# Simple test of std::ostringstream. +# +# Author:: gga +# Copyright:: 2007 +# License:: Ruby +# + +require 'swig_assert' + +require 'li_std_stream' +include Li_std_stream + +swig_assert_each_line(<<'EOF', binding) + +a = A.new +o = Ostringstream.new +o << a << " " << 2345 << " " << 1.435 +o.str == "A class 2345 1.435" + +EOF Property changes on: trunk/Examples/test-suite/ruby/li_std_stream_runme.rb ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Modified: trunk/Lib/ruby/rubytypemaps.swg =================================================================== --- trunk/Lib/ruby/rubytypemaps.swg 2007-05-02 05:22:44 UTC (rev 9749) +++ trunk/Lib/ruby/rubytypemaps.swg 2007-05-02 10:00:26 UTC (rev 9750) @@ -4,6 +4,9 @@ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ +/* bool is dangerous in Ruby, change precedence */ +#undef SWIG_TYPECHECK_BOOL +%define SWIG_TYPECHECK_BOOL 10000 %enddef /* Include fundamental fragemt definitions */ %include <typemaps/fragments.swg> Added: trunk/Lib/ruby/std_basic_string.i =================================================================== --- trunk/Lib/ruby/std_basic_string.i (rev 0) +++ trunk/Lib/ruby/std_basic_string.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1,97 @@ +#if !defined(SWIG_STD_STRING) +#define SWIG_STD_BASIC_STRING + +%include <rubycontainer.swg> + +#define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) + + +%traits_swigtype(std::basic_string<char>); +%fragment(SWIG_Traits_frag(std::basic_string<char>)); + + +%fragment(SWIG_AsPtr_frag(std::basic_string<char>),"header", + fragment="SWIG_AsCharPtrAndSize") { +SWIGINTERN int +SWIG_AsPtr(std::basic_string<char>)(VALUE obj, std::string **val) +{ + static swig_type_info* string_info = + SWIG_TypeQuery("std::basic_string<char> *"); + std::string *vptr; + if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { + if (val) *val = vptr; + return SWIG_OLDOBJ; + } else { + char* buf = 0 ; size_t size = 0; int alloc = 0; + if (SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { + if (buf) { + if (val) *val = new std::string(buf, size - 1); + if (alloc == SWIG_NEWOBJ) %delete_array(buf); + return SWIG_NEWOBJ; + } + } + if (val) { + rb_raise( rb_eTypeError, "a string is expected"); + } + return 0; + } +} +} + +%fragment(SWIG_From_frag(std::basic_string<char>),"header", + fragment="SWIG_FromCharPtrAndSize") { +SWIGINTERNINLINE VALUE + SWIG_From(std::basic_string<char>)(const std::string& s) + { + return SWIG_FromCharPtrAndSize(s.data(), s.size()); + } +} + +%include <std/std_basic_string.i> +%typemaps_asptrfromn(%checkcode(STRING), std::basic_string<char>); + +#endif + + +#if !defined(SWIG_STD_WSTRING) + +%fragment(SWIG_AsPtr_frag(std::basic_string<wchar_t>),"header", + fragment="SWIG_AsWCharPtrAndSize") { +SWIGINTERN int + SWIG_AsPtr(std::basic_string<wchar_t>)(VALUE obj, std::wstring **val) + { + static swig_type_info* string_info = + SWIG_TypeQuery("std::basic_string<wchar_t> *"); + std::wstring *vptr; + if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { + if (val) *val = vptr; + return SWIG_OLDOBJ; + } else { + wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; + if (SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { + if (buf) { + if (val) *val = new std::wstring(buf, size - 1); + if (alloc == SWIG_NEWOBJ) %delete_array(buf); + return SWIG_NEWOBJ; + } + } + if (val) { + rb_raise( rb_eTypeError, "a string is expected"); + } + return 0; + } + } +} + +%fragment(SWIG_From_frag(std::basic_string<wchar_t>),"header", + fragment="SWIG_FromWCharPtrAndSize") { +SWIGINTERNINLINE VALUE + SWIG_From(std::basic_string<wchar_t>)(const std::wstring& s) + { + return SWIG_FromWCharPtrAndSize(s.data(), s.size()); + } +} + +%typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string<wchar_t>); + +#endif Added: trunk/Lib/ruby/std_char_traits.i =================================================================== --- trunk/Lib/ruby/std_char_traits.i (rev 0) +++ trunk/Lib/ruby/std_char_traits.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1 @@ +%include <std/std_char_traits.i> Modified: trunk/Lib/ruby/std_ios.i =================================================================== --- trunk/Lib/ruby/std_ios.i 2007-05-02 05:22:44 UTC (rev 9749) +++ trunk/Lib/ruby/std_ios.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -1,3 +1,6 @@ + +#pragma SWIG nowarn=801 + %rename(ios_base_in) std::ios_base::in; %include <std/std_ios.i> Added: trunk/Lib/ruby/std_iostream.i =================================================================== --- trunk/Lib/ruby/std_iostream.i (rev 0) +++ trunk/Lib/ruby/std_iostream.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1,12 @@ +namespace std +{ +%callback("%s") endl; +%callback("%s") ends; +%callback("%s") flush; +} + +%warnfilter(365) operator+=; +%warnfilter(802) std::basic_iostream; // turn off multiple inheritance warning + +%include <std/std_iostream.i> + Added: trunk/Lib/ruby/std_sstream.i =================================================================== --- trunk/Lib/ruby/std_sstream.i (rev 0) +++ trunk/Lib/ruby/std_sstream.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1,2 @@ + +%include <std/std_sstream.i> Added: trunk/Lib/ruby/std_streambuf.i =================================================================== --- trunk/Lib/ruby/std_streambuf.i (rev 0) +++ trunk/Lib/ruby/std_streambuf.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -0,0 +1 @@ +%include <std/std_streambuf.i> Modified: trunk/Lib/ruby/std_string.i =================================================================== --- trunk/Lib/ruby/std_string.i 2007-05-02 05:22:44 UTC (rev 9749) +++ trunk/Lib/ruby/std_string.i 2007-05-02 10:00:26 UTC (rev 9750) @@ -1 +1,6 @@ + +%warnfilter(801) std::string; // wrong class name +%warnfilter(378) std::basic_string::operator!=; + %include <typemaps/std_string.swg> + Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2007-05-02 05:22:44 UTC (rev 9749) +++ trunk/Source/Modules/ruby.cxx 2007-05-02 10:00:26 UTC (rev 9750) @@ -113,6 +113,16 @@ }; +/* flags for the make_autodoc function */ +enum autodoc_t { + AUTODOC_CLASS, + AUTODOC_CTOR, + AUTODOC_DTOR, + AUTODOC_STATICFUNC, + AUTODOC_FUNC, + AUTODOC_METHOD +}; + static const char *usage = "\ Ruby Options (available with -ruby)\n\ -globalmodule - Wrap everything into the global module\n\ @@ -166,6 +176,378 @@ STATIC_VAR }; + /* ------------------------------------------------------------ + * autodoc level declarations + * ------------------------------------------------------------ */ + + enum autodoc_l { + NO_AUTODOC = -2, // no autodoc + STRING_AUTODOC = -1, // use provided string + NAMES_AUTODOC = 0, // only parameter names + TYPES_AUTODOC = 1, // parameter names and types + EXTEND_AUTODOC = 2, // extended documentation and parameter names + EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names + }; + + + autodoc_l autodoc_level(String *autodoc) { + autodoc_l dlevel = NO_AUTODOC; + if (autodoc) { + char *c = Char(autodoc); + if (c && isdigit(c[0])) { + dlevel = (autodoc_l) atoi(c); + } else { + if (strcmp(c, "extended") == 0) { + dlevel = EXTEND_AUTODOC; + } else { + dlevel = STRING_AUTODOC; + } + } + } + return dlevel; + } + + + + /* ------------------------------------------------------------ + * have_docstring() + * Check if there is a docstring directive and it has text, + * or there is an autodoc flag set + * ------------------------------------------------------------ */ + + bool have_docstring(Node *n) { + String *str = Getattr(n, "feature:docstring"); + return (str != NULL && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); + } + + /* ------------------------------------------------------------ + * docstring() + * Get the docstring text, stripping off {} if neccessary, + * and enclose in triple double quotes. If autodoc is also + * set then it will build a combined docstring. + * ------------------------------------------------------------ */ + + String *docstring(Node *n, autodoc_t ad_type) { + String *str = Getattr(n, "feature:docstring"); + bool have_ds = (str != NULL && Len(str) > 0); + bool have_auto = (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); + String *autodoc = NULL; + String *doc = NULL; + + if (have_ds) { + char *t = Char(str); + if (*t == '{') { + Delitem(str, 0); + Delitem(str, DOH_END); + } + } + + if (have_auto) { + autodoc = make_autodoc(n, ad_type); + have_auto = (autodoc != NULL && Len(autodoc) > 0); + } + // If there is more than one line then make docstrings like this: + // + // This is line1 + // And here is line2 followed by the rest of them + // + // otherwise, put it all on a single line + // + if (have_auto && have_ds) { // Both autodoc and docstring are present + doc = NewString(""); + Printv(doc, "\n", autodoc, "\n", str, NIL); + } else if (!have_auto && have_ds) { // only docstring + if (Strchr(str, '\n') == NULL) { + doc = NewString(str); + } else { + doc = NewString(""); + Printv(doc, str, NIL); + } + } else if (have_auto && !have_ds) { // only autodoc + if (Strchr(autodoc, '\n') == NULL) { + doc = NewStringf("%s", autodoc); + } else { + doc = NewString(""); + Printv(doc, "\n", autodoc, NIL); + } + } else + doc = NewString(""); + + // Save the generated strings in the parse tree in case they are used later + // by post processing tools + Setattr(n, "ruby:docstring", doc); + Setattr(n, "ruby:autodoc", autodoc); + return doc; + } + + /* ------------------------------------------------------------ + * make_autodocParmList() + * Generate the documentation for the function parameters + * ------------------------------------------------------------ */ + + String *make_autodocParmList(Node *n, bool showTypes) { + String *doc = NewString(""); + String *pdocs = Copy(Getattr(n, "feature:pdocs")); + ParmList *plist = CopyParmList(Getattr(n, "parms")); + Parm *p; + Parm *pnext; + Node *lookup; + int lines = 0; + const int maxwidth = 50; + + if (pdocs) + Append(pdocs, "\n"); + + + Swig_typemap_attach_parms("in", plist, 0); + Swig_typemap_attach_parms("doc", plist, 0); + + for (p = plist; p; p = pnext) { + String *name = 0; + String *type = 0; + String *value = 0; + String *ptype = 0; + String *pdoc = Getattr(p, "tmap:doc"); + if (pdoc) { + name = Getattr(p, "tmap:doc:name"); + type = Getattr(p, "tmap:doc:type"); + value = Getattr(p, "tmap:doc:value"); + ptype = Getattr(p, "tmap:doc:pytype"); + } + + name = name ? name : Getattr(p, "name"); + type = type ? type : Getattr(p, "type"); + value = value ? value : Getattr(p, "value"); + + String *tm = Getattr(p, "tmap:in"); + if (tm) { + pnext = Getattr(p, "tmap:in:next"); + } else { + pnext = nextSibling(p); + } + + // Skip the 'self' parameter which in ruby is implicit + if ( Cmp(name, "self") == 0 ) + continue; + + if (Len(doc)) { + // add a comma to the previous one if any + Append(doc, ", "); + + // Do we need to wrap a long line? + if ((Len(doc) - lines * maxwidth) > maxwidth) { + Printf(doc, "\n%s", tab4); + lines += 1; + } + } + // Do the param type too? + if (showTypes) { + type = SwigType_base(type); + lookup = Swig_symbol_clookup(type, 0); + if (lookup) + type = Getattr(lookup, "sym:name"); + Printf(doc, "%s ", type); + } + + if (name) { + Append(doc, name); + if (pdoc) { + if (!pdocs) + pdocs = NewString("Parameters:\n"); + Printf(pdocs, " %s\n", pdoc); + } + } else { + Append(doc, "?"); + } + + if (value) { + if (Strcmp(value, "NULL") == 0) + value = NewString("nil"); + else if (Strcmp(value, "true") == 0 || Strcmp(value, "TRUE") == 0) + value = NewString("true"); + else if (Strcmp(value, "false") == 0 || Strcmp(value, "FALSE") == 0) + value = NewString("false"); + else { + lookup = Swig_symbol_clookup(value, 0); + if (lookup) + value = Getattr(lookup, "sym:name"); + } + Printf(doc, "=%s", value); + } + } + if (pdocs) + Setattr(n, "feature:pdocs", pdocs); + Delete(plist); + return doc; + } + + /* ------------------------------------------------------------ + * make_autodoc() + * Build a docstring for the node, using parameter and other + * info in the parse tree. If the value of the autodoc + * attribute is "0" then do not include parameter types, if + * it is "1" (the default) then do. If it has some other + * value then assume it is supplied by the extension writer + * and use it directly. + * ------------------------------------------------------------ */ + + String *make_autodoc(Node *n, autodoc_t ad_type) { + int extended = 0; + // If the function is overloaded then this funciton is called + // for the last one. Rewind to the first so the docstrings are + // in order. + while (Getattr(n, "sym:previousSibling")) + n = Getattr(n, "sym:previousSibling"); + + Node *pn = Swig_methodclass(n); + String* class_name = Getattr(pn, "sym:name"); + String* full_name; + if ( module ) { + full_name = NewString(module); + Append(full_name, "::"); + } + else + full_name = NewString(""); + if ( class_name ) + Append(full_name, class_name); + + String *doc = NewString("/*\n"); + int counter = 0; + for ( ; n; ++counter ) { + bool showTypes = false; + bool skipAuto = false; + String *autodoc = Getattr(n, "feature:autodoc"); + autodoc_l dlevel = autodoc_level(autodoc); + switch (dlevel) { + case NO_AUTODOC: + break; + case NAMES_AUTODOC: + showTypes = false; + break; + case TYPES_AUTODOC: + showTypes = true; + break; + case EXTEND_AUTODOC: + extended = 1; + showTypes = false; + break; + case EXTEND_TYPES_AUTODOC: + extended = 1; + showTypes = true; + break; + case STRING_AUTODOC: + Append(doc, autodoc); + skipAuto = true; + break; + } + + if (!skipAuto) { + String *symname = Getattr(n, "sym:name"); + if ( Getattr( special_methods, symname ) ) + symname = Getattr( special_methods, symname ); + + SwigType *type = Getattr(n, "type"); + + if (type) { + if (Strcmp(type, "void") == 0) + type = NULL; + else { + SwigType *qt = SwigType_typedef_resolve_all(type); + if (SwigType_isenum(qt)) + type = NewString("int"); + else { + type = SwigType_base(type); + Node *lookup = Swig_symbol_clookup(type, 0); + if (lookup) + type = Getattr(lookup, "sym:name"); + } + } + } + + switch (ad_type) { + case AUTODOC_CLASS: + { + // Only do the autodoc if there isn't a docstring for the class + String *str = Getattr(n, "feature:docstring"); + if (counter == 0 && (str == NULL || Len(str) == 0)) { + if (CPlusPlus) { + Printf(doc, " Document-class: %s\n\n Proxy of C++ %s class", + full_name, class_name); + } else { + Printf(doc, " Document-class: %s\n\n Proxy of C %s struct", + full_name, class_name); + } + } + } + break; + case AUTODOC_CTOR: + if (counter == 0) + Append(doc, " Document-method: new\n\n call-seq:\n"); + if (Strcmp(class_name, symname) == 0) { + String *paramList = make_autodocParmList(n, showTypes); + if (Len(paramList)) + Printf(doc, " %s.new(%s)", class_name, paramList); + else + Printf(doc, " %s.new", class_name); + } else + Printf(doc, " %s.new(%s)", class_name, + make_autodocParmList(n, showTypes)); + break; + + case AUTODOC_DTOR: + break; + + case AUTODOC_STATICFUNC: + if (counter == 0) + Printf(doc, " Document-method: %s\n\n call-seq:\n", full_name); + Printf(doc, " %s(%s)", full_name, + make_autodocParmList(n, showTypes)); + + if (type) + Printf(doc, " -> %s", type); + break; + + case AUTODOC_FUNC: + if (counter == 0) + Printf(doc, " Document-method: %s\n\n call-seq:\n", symname); + Printf(doc, " %s(%s)", symname, + make_autodocParmList(n, showTypes)); + if (type) + Printf(doc, " -> %s", type); + break; + + case AUTODOC_METHOD: + if (counter == 0) + Printf(doc, " Document-method: %s\n\n call-seq:\n", symname); + String *paramList = make_autodocParmList(n, showTypes); + if (Len(paramList)) + Printf(doc, " %s(%s)", symname, paramList); + else + Printf(doc, " %s", symname); + if (type) + Printf(doc, " -> %s", type); + break; + } + } + if (extended) { + String *pdocs = Getattr(n, "feature:pdocs"); + if (pdocs) { + Printv(doc, "\n", pdocs, NULL); + } + } + + // if it's overloaded then get the next decl and loop around again + n = Getattr(n, "sym:nextSibling"); + if (n) + Append(doc, "\n"); + } + + Append(doc, "\n\n*/\n"); + Delete(full_name); + + return doc; + } + public: /* --------------------------------------------------------------------- @@ -1064,6 +1446,9 @@ bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; + + + /* Now write the wrapper function itself */ if (current == CONSTRUCTOR_ALLOCATE) { Printf(f->def, "#ifdef HAVE_RB_DEFINE_ALLOC_FUNC\n"); @@ -1110,7 +1495,7 @@ insertArgOutputCode(l, outarg, need_result); /* if the object is a director, and the method call originated from its - * underlying python object, resolve the call by going up the c++ + * underlying Ruby object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in python. * without this check an infinite loop is set up between the director and * shadow class method calls. @@ -1751,6 +2136,9 @@ * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { + String* docs = docstring(n, AUTODOC_CLASS); + Printf(f_wrappers, "%s", docs); + Delete(docs); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); @@ -1842,6 +2230,11 @@ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; + + String* docs = docstring(n, AUTODOC_METHOD); + Printf(f_wrappers, "%s", docs); + Delete(docs); + Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; @@ -1908,7 +2301,13 @@ Delete(self); } + + /* Now do the instance initialize method */ + String* docs = docstring(n, AUTODOC_CTOR); + Printf(f_wrappers, "%s", docs); + Delete(docs); + current = CONSTRUCTOR_INITIALIZE; Swig_name_register((String_or_char *) "construct", (String_or_char *) "new_%c"); Language::constructorHandler(n); @@ -2005,6 +2404,10 @@ * -------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { + String* docs = docstring(n, AUTODOC_METHOD); + Printf(f_wrappers, "%s", docs); + Delete(docs); + current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; @@ -2018,6 +2421,10 @@ * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { + String* docs = docstring(n, AUTODOC_STATICFUNC); + Printf(f_wrappers, "%s", docs); + Delete(docs); + current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; @@ -2031,6 +2438,10 @@ * --------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { + String* docs = docstring(n, AUTODOC_STATICFUNC); + Printf(f_wrappers, "%s", docs); + Delete(docs); + current = CLASS_CONST; Language::memberconstantHandler(n); current = NO_CPP; @@ -2042,6 +2453,10 @@ * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { + String* docs = docstring(n, AUTODOC_STATICFUNC); + Printf(f_wrappers, "%s", docs); + Delete(docs); + current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-02 19:39:55
|
Revision: 9752 http://swig.svn.sourceforge.net/swig/?rev=9752&view=rev Author: gga73 Date: 2007-05-02 12:39:53 -0700 (Wed, 02 May 2007) Log Message: ----------- Improvements to ruby's autodocumentation. GC.start was failing when ruby was run without verbose warnings. Fixed. Modified Paths: -------------- trunk/Examples/test-suite/li_std_stream.i trunk/Examples/test-suite/ruby/swig_gc.rb trunk/Source/Modules/ruby.cxx Modified: trunk/Examples/test-suite/li_std_stream.i =================================================================== --- trunk/Examples/test-suite/li_std_stream.i 2007-05-02 13:32:18 UTC (rev 9751) +++ trunk/Examples/test-suite/li_std_stream.i 2007-05-02 19:39:53 UTC (rev 9752) @@ -1,4 +1,5 @@ %module li_std_stream +%feature("autodoc","4"); %inline %{ struct A; Modified: trunk/Examples/test-suite/ruby/swig_gc.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_gc.rb 2007-05-02 13:32:18 UTC (rev 9751) +++ trunk/Examples/test-suite/ruby/swig_gc.rb 2007-05-02 19:39:53 UTC (rev 9752) @@ -30,44 +30,41 @@ # License:: Ruby # -if $VERBOSE - module GC +module GC - class << self + class << self - attr :last_stat - attr_accessor :track_class + attr :last_stat + attr_accessor :track_class - alias :_start :start - - def start - _start - stats - end - - def stats - stats = Hash.new(0) - ObjectSpace.each_object {|o| stats[o.class] += 1} - - if track_class - v = stats[track_class] - printf "\t%-30s %10d", track_class.to_s, v - if last_stat - printf " | delta %10d", (v - last_stat[track_class]) - end + alias :_start :start + + def start + _start + stats if $VERBOSE + end + + def stats + stats = Hash.new(0) + ObjectSpace.each_object {|o| stats[o.class] += 1} + + if track_class + v = stats[track_class] + printf "\t%-30s %10d", track_class.to_s, v + if last_stat + printf " | delta %10d", (v - last_stat[track_class]) + end + puts + else + stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v| + printf "\t%-30s %10d", k, v + printf " | delta %10d", (v - last_stat[k]) if last_stat puts - else - stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v| - printf "\t%-30s %10d", k, v - printf " | delta %10d", (v - last_stat[k]) if last_stat - puts - end end - - last_stat = stats end + + last_stat = stats end - end - -end + +end Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2007-05-02 13:32:18 UTC (rev 9751) +++ trunk/Source/Modules/ruby.cxx 2007-05-02 19:39:53 UTC (rev 9752) @@ -143,6 +143,7 @@ const char* description; }; + static const Autodoc kAutoDocs[] = { { "to_a", "Convert class to an Array" }, { "to_s", "Convert class to a String representation" }, @@ -167,6 +168,8 @@ { "**", "Exponential operator" }, { "divmod", "Modulo of division" }, { "hash", "Hashing function for class" }, + { "dup", "Create a duplicate of the class and unfreeze it if needed" }, + { "clone", "Create a duplicate of the class" }, { "coerce", "Coerce class to a number" }, { "<=>", "Comparison operator" }, {0,0} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-05-02 20:37:26
|
Revision: 9753 http://swig.svn.sourceforge.net/swig/?rev=9753&view=rev Author: gga73 Date: 2007-05-02 13:37:21 -0700 (Wed, 02 May 2007) Log Message: ----------- Improved autodoc documentation for standard ruby methods and for STL containers, using %feature instead of hard-coding the stuff in ruby.cxx. Modified Paths: -------------- trunk/Lib/ruby/ruby.swg trunk/Lib/ruby/rubystdcommon.swg trunk/Lib/ruby/std_common.i trunk/Lib/ruby/std_string.i trunk/Source/Modules/ruby.cxx Added Paths: ----------- trunk/Lib/ruby/rubyautodoc.swg trunk/Lib/ruby/rubystdautodoc.swg Modified: trunk/Lib/ruby/ruby.swg =================================================================== --- trunk/Lib/ruby/ruby.swg 2007-05-02 19:39:53 UTC (rev 9752) +++ trunk/Lib/ruby/ruby.swg 2007-05-02 20:37:21 UTC (rev 9753) @@ -59,6 +59,11 @@ %include <rubykw.swg> /* ------------------------------------------------------------ + * Documentation for common Ruby methods + * ------------------------------------------------------------ */ +%include <rubyautodoc.swg> + +/* ------------------------------------------------------------ * The Ruby initialization function * ------------------------------------------------------------ */ %include <rubyinit.swg> Added: trunk/Lib/ruby/rubyautodoc.swg =================================================================== --- trunk/Lib/ruby/rubyautodoc.swg (rev 0) +++ trunk/Lib/ruby/rubyautodoc.swg 2007-05-02 20:37:21 UTC (rev 9753) @@ -0,0 +1,54 @@ +/** + * @file rubyautodoc.swg + * @author gga + * @date Wed May 2 16:41:59 2007 + * + * @brief This file implements autodoc typemaps for some common + * ruby methods. + * + * + */ + +%define AUTODOC(func, str) + %feature("autodoc", str) func; +%enddef + + +AUTODOC(to_a, "Convert class to an Array"); +AUTODOC(to_s, "Convert class to a String representation"); +AUTODOC(inspect, "Inspect class and its contents"); +AUTODOC(__getitem__, "Element accessor/slicing"); +AUTODOC(__setitem__, "Element setter/slicing"); +AUTODOC(operator==, "Equality comparison operator"); +AUTODOC(operator<=, "Lower or equal comparison operator"); +AUTODOC(operator>=, "Higher or equal comparison operator"); +AUTODOC(operator<, "Lower than comparison operator"); +AUTODOC(operator>, "Higher than comparison operator"); +AUTODOC(operator<<, "Left shifting or appending operator"); +AUTODOC(operator>>, "Right shifting operator or extracting operator"); +AUTODOC(operator+, "Add operator"); +AUTODOC(operator-, "Substraction operator"); +AUTODOC(operator+(), "Positive operator"); +AUTODOC(operator-(), "Negation operator"); +AUTODOC(operator&, "AND operator"); +AUTODOC(operator|, "OR operator"); +AUTODOC(operator^, "XOR operator"); +AUTODOC(operator~, "Invert operator"); +AUTODOC(__pow__, "Exponential operator"); +AUTODOC(__divmod__, "Modulo of division"); +AUTODOC(hash, "Hashing function for class"); +AUTODOC(dup, "Create a duplicate of the class and unfreeze it if needed"); +AUTODOC(clone, "Create a duplicate of the class"); +AUTODOC(coerce, "Coerce class to a number"); +AUTODOC(__cmp__, "Comparison operator"); +AUTODOC(size, "Size or Length of the container"); +AUTODOC(slice, "Return a slice (portion of) the container"); +AUTODOC(each, "Iterate thru each element in the container. A block must be provided"); +AUTODOC(find, "Find an element in the class or container"); +AUTODOC(each_key, "Iterate thru each key element in the container. A block must be provided"); +AUTODOC(each_value, "Iterate thru each key element in the container. A block must be provided"); +AUTODOC(reject, "Iterate thru each element in the container and reject those that fail a condition returning a new container. A block must be provided"); +AUTODOC(reject_bang, "Iterate thru each element in the container and reject those that fail a condition. A block must be provided. Container is modified in place"); +AUTODOC(select, "Iterate thru each element in the container and select those that match a condition. A block must be provided"); + + Added: trunk/Lib/ruby/rubystdautodoc.swg =================================================================== --- trunk/Lib/ruby/rubystdautodoc.swg (rev 0) +++ trunk/Lib/ruby/rubystdautodoc.swg 2007-05-02 20:37:21 UTC (rev 9753) @@ -0,0 +1,28 @@ +/** + * @file rubystdautodoc.swg + * @author gga + * @date Wed May 2 17:20:39 2007 + * + * @brief This file contains autodocs for standard STL functions. + * + * + */ + +// +// For STL autodocumentation +// +AUTODOC(c_str, "Convert class to a String representation"); +AUTODOC(begin, "Return an iterator to the beginning of the container"); +AUTODOC(end, "Return an iterator to past the end of the container"); +AUTODOC(rbegin, "Return a reverse iterator to the beginning (the end) of the container"); +AUTODOC(rend, "Return a reverse iterator to past the end (past the beginning) of the container"); +AUTODOC(length, "Size or Length of the container"); +AUTODOC(resize, "Resize the size of the container"); +AUTODOC(capacity, "Reserved capacity of the container"); +AUTODOC(reserve, "Reserve memory in the container for a number of elements"); +AUTODOC(erase, "Delete a portion of the container"); +AUTODOC(max_size, "Maximum size of elements allowed in the container"); +AUTODOC(iterator, "Return an iterator to the container"); +AUTODOC(empty, "Check if the container is empty or not"); +AUTODOC(rfind, "Find an element in reverse usually starting from the end of the container"); +AUTODOC(substr, "Return a portion of the String"); Modified: trunk/Lib/ruby/rubystdcommon.swg =================================================================== --- trunk/Lib/ruby/rubystdcommon.swg 2007-05-02 19:39:53 UTC (rev 9752) +++ trunk/Lib/ruby/rubystdcommon.swg 2007-05-02 20:37:21 UTC (rev 9753) @@ -203,3 +203,4 @@ #define SWIG_RUBY_THREAD_BEGIN_BLOCK #define SWIG_RUBY_THREAD_END_BLOCK + Modified: trunk/Lib/ruby/std_common.i =================================================================== --- trunk/Lib/ruby/std_common.i 2007-05-02 19:39:53 UTC (rev 9752) +++ trunk/Lib/ruby/std_common.i 2007-05-02 20:37:21 UTC (rev 9753) @@ -1,5 +1,7 @@ %include <std/std_except.i> %include <rubystdcommon.swg> +%include <rubystdautodoc.swg> + // // Use the following macro with modern STL implementations // Modified: trunk/Lib/ruby/std_string.i =================================================================== --- trunk/Lib/ruby/std_string.i 2007-05-02 19:39:53 UTC (rev 9752) +++ trunk/Lib/ruby/std_string.i 2007-05-02 20:37:21 UTC (rev 9753) @@ -2,5 +2,9 @@ %warnfilter(801) std::string; // wrong class name %warnfilter(378) std::basic_string::operator!=; + +%rename("empty?") std::string::empty; +%rename("empty?") std::basic_string::empty; + %include <typemaps/std_string.swg> Modified: trunk/Source/Modules/ruby.cxx =================================================================== --- trunk/Source/Modules/ruby.cxx 2007-05-02 19:39:53 UTC (rev 9752) +++ trunk/Source/Modules/ruby.cxx 2007-05-02 20:37:21 UTC (rev 9753) @@ -145,33 +145,6 @@ static const Autodoc kAutoDocs[] = { - { "to_a", "Convert class to an Array" }, - { "to_s", "Convert class to a String representation" }, - { "inspect", "Inspect class and its contents" }, - { "[]", "Element accessor/slicing" }, - { "[]=", "Element setter/slicing" }, - { "==", "Equality comparison operator" }, - { "<=", "Lower or equal comparison operator" }, - { ">=", "Higher or equal comparison operator" }, - { "<", "Lower than comparison operator" }, - { ">", "Higher than comparison operator" }, - { "<<", "Left shifting or appending operator" }, - { ">>", "Right shifting operator or extracting operator" }, - { "+", "Add operator" }, - { "-", "Substraction operator" }, - { "+@", "Positive operator" }, - { "-@", "Negation operator" }, - { "&", "AND operator" }, - { "|", "OR operator" }, - { "^", "XOR operator" }, - { "~", "Invert operator" }, - { "**", "Exponential operator" }, - { "divmod", "Modulo of division" }, - { "hash", "Hashing function for class" }, - { "dup", "Create a duplicate of the class and unfreeze it if needed" }, - { "clone", "Create a duplicate of the class" }, - { "coerce", "Coerce class to a number" }, - { "<=>", "Comparison operator" }, {0,0} }; @@ -335,7 +308,7 @@ const int maxwidth = 50; if (pdocs) - Append(pdocs, "\n"); + Append(pdocs, ".\n"); Swig_typemap_attach_parms("in", plist, 0); @@ -393,7 +366,7 @@ if (pdoc) { if (!pdocs) pdocs = NewString("Parameters:\n"); - Printf(pdocs, " %s\n", pdoc); + Printf(pdocs, " %s.\n", pdoc); } } else { Append(doc, "?"); @@ -529,8 +502,26 @@ if (skipAuto) { - Append(doc, autodoc); - } + if ( counter == 0 ) Printf(doc, " call-seq:\n"); + switch( ad_type ) + { + case AUTODOC_STATICFUNC: + case AUTODOC_FUNC: + case AUTODOC_METHOD: + { + String *paramList = make_autodocParmList(n, showTypes); + if (Len(paramList)) + Printf(doc, " %s(%s)", symname, paramList); + else + Printf(doc, " %s", symname); + if (type) + Printf(doc, " -> %s", type); + break; + } + default: + break; + } + } else { switch (ad_type) { case AUTODOC_CLASS: @@ -585,8 +576,8 @@ Append(doc, "\n"); } + Printf(doc, "\n\n"); if (!skipAuto) { - Printf(doc, "\n\n "); switch (ad_type) { case AUTODOC_CLASS: break; @@ -606,24 +597,7 @@ break; case AUTODOC_METHOD: - bool found = false; - if ( symname ) - { - const Autodoc* d = kAutoDocs; - for ( ; d->symname != NULL; ++d ) - { - if ( Cmp(symname, d->symname) == 0 ) - { - found = true; - Printf(doc, "%s.\n", d->description); - break; - } - } - } - if (!found) - { - Printf(doc, "A method.\n"); - } + Printf(doc, "A method.\n"); break; } } @@ -642,20 +616,26 @@ case NO_AUTODOC: case NAMES_AUTODOC: case TYPES_AUTODOC: - case STRING_AUTODOC: extended = 0; break; + case STRING_AUTODOC: + extended = 2; + Printv(doc, autodoc, ".", NIL); + break; case EXTEND_AUTODOC: case EXTEND_TYPES_AUTODOC: extended = 1; break; } + if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n\n", pdocs, NULL); + break; } + if ( extended == 2 ) break; } n = Getattr(n, "sym:nextSibling"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gg...@us...> - 2007-04-28 04:20:49
|
Revision: 9691 http://swig.svn.sourceforge.net/swig/?rev=9691&view=rev Author: gga73 Date: 2007-04-27 21:20:28 -0700 (Fri, 27 Apr 2007) Log Message: ----------- Fixed ruby's newobject1 and newobject2 demos. Added swig_assert.rb and started using it in some tests. Added my patches to ruby.cxx, rubyrun.swg, rubystrings.swg and rubytracking.swg [see: sourceforge] Modified Paths: -------------- trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb trunk/Examples/test-suite/ruby/abstract_signature_runme.rb trunk/Examples/test-suite/ruby/abstract_typedef2_runme.rb trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb trunk/Examples/test-suite/ruby/abstract_virtual_runme.rb trunk/Examples/test-suite/ruby/aggregate_runme.rb trunk/Examples/test-suite/ruby/array_member_runme.rb trunk/Examples/test-suite/ruby/arrays_global_runme.rb trunk/Examples/test-suite/ruby/bools_runme.rb trunk/Examples/test-suite/ruby/char_constant_runme.rb trunk/Examples/test-suite/ruby/class_ignore_runme.rb trunk/Examples/test-suite/ruby/constover_runme.rb trunk/Examples/test-suite/ruby/cpp_namespace_runme.rb trunk/Examples/test-suite/ruby/default_constructor_runme.rb trunk/Examples/test-suite/ruby/director_abstract_runme.rb trunk/Examples/test-suite/ruby/director_basic_runme.rb trunk/Examples/test-suite/ruby/director_constructor_runme.rb trunk/Examples/test-suite/ruby/director_default_runme.rb trunk/Examples/test-suite/ruby/director_detect_runme.rb trunk/Examples/test-suite/ruby/director_exception_runme.rb trunk/Examples/test-suite/ruby/director_frob_runme.rb trunk/Examples/test-suite/ruby/director_nested_runme.rb trunk/Examples/test-suite/ruby/director_protected_runme.rb trunk/Examples/test-suite/ruby/director_string_runme.rb trunk/Examples/test-suite/ruby/director_unroll_runme.rb trunk/Examples/test-suite/ruby/director_wombat_runme.rb trunk/Examples/test-suite/ruby/disown_runme.rb trunk/Examples/test-suite/ruby/dynamic_cast_runme.rb trunk/Examples/test-suite/ruby/enum_thorough_runme.rb trunk/Examples/test-suite/ruby/enums_runme.rb trunk/Examples/test-suite/ruby/extend_template_ns_runme.rb trunk/Examples/test-suite/ruby/extend_template_runme.rb trunk/Examples/test-suite/ruby/friends_runme.rb trunk/Examples/test-suite/ruby/grouping_runme.rb trunk/Examples/test-suite/ruby/ignore_parameter_runme.rb trunk/Examples/test-suite/ruby/imports_runme.rb trunk/Examples/test-suite/ruby/inherit_missing_runme.rb trunk/Examples/test-suite/ruby/keywords_runme.rb trunk/Examples/test-suite/ruby/li_carrays_runme.rb trunk/Examples/test-suite/ruby/li_factory_runme.rb trunk/Examples/test-suite/ruby/li_std_deque_runme.rb trunk/Examples/test-suite/ruby/li_std_pair_runme.rb trunk/Examples/test-suite/ruby/li_std_string_runme.rb trunk/Examples/test-suite/ruby/li_std_vector_runme.rb trunk/Examples/test-suite/ruby/minherit_runme.rb trunk/Examples/test-suite/ruby/namespace_typemap_runme.rb trunk/Examples/test-suite/ruby/naming_runme.rb trunk/Examples/test-suite/ruby/newobject1_runme.rb trunk/Examples/test-suite/ruby/newobject2_runme.rb trunk/Examples/test-suite/ruby/overload_copy_runme.rb trunk/Examples/test-suite/ruby/overload_extend_runme.rb trunk/Examples/test-suite/ruby/overload_extendc_runme.rb trunk/Examples/test-suite/ruby/overload_simple_runme.rb trunk/Examples/test-suite/ruby/overload_subtype_runme.rb trunk/Examples/test-suite/ruby/overload_template_runme.rb trunk/Examples/test-suite/ruby/primitive_ref_runme.rb trunk/Examples/test-suite/ruby/primitive_types_runme.rb trunk/Examples/test-suite/ruby/profiletest_runme.rb trunk/Examples/test-suite/ruby/refcount_runme.rb trunk/Examples/test-suite/ruby/reference_global_vars_runme.rb trunk/Examples/test-suite/ruby/rename_scope_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_const_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_multi_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_multi_typedef_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_not_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_overload_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_rename_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_simple_runme.rb trunk/Examples/test-suite/ruby/smart_pointer_typedef_runme.rb trunk/Examples/test-suite/ruby/sneaky1_runme.rb trunk/Examples/test-suite/ruby/static_const_member_2_runme.rb trunk/Examples/test-suite/ruby/struct_value_runme.rb trunk/Examples/test-suite/ruby/template_construct_runme.rb trunk/Examples/test-suite/ruby/template_extend1_runme.rb trunk/Examples/test-suite/ruby/template_extend2_runme.rb trunk/Examples/test-suite/ruby/template_inherit_runme.rb trunk/Examples/test-suite/ruby/template_ns4_runme.rb trunk/Examples/test-suite/ruby/template_ns_runme.rb trunk/Examples/test-suite/ruby/template_rename_runme.rb trunk/Examples/test-suite/ruby/template_tbase_template_runme.rb trunk/Examples/test-suite/ruby/template_type_namespace_runme.rb trunk/Examples/test-suite/ruby/template_typedef_cplx2_runme.rb trunk/Examples/test-suite/ruby/template_typedef_cplx3_runme.rb trunk/Examples/test-suite/ruby/template_typedef_cplx4_runme.rb trunk/Examples/test-suite/ruby/template_typedef_cplx_runme.rb trunk/Examples/test-suite/ruby/throw_exception_runme.rb trunk/Examples/test-suite/ruby/track_objects_directors_runme.rb trunk/Examples/test-suite/ruby/track_objects_runme.rb trunk/Examples/test-suite/ruby/typedef_inherit_runme.rb trunk/Examples/test-suite/ruby/typedef_scope_runme.rb trunk/Examples/test-suite/ruby/typemap_namespace_runme.rb trunk/Examples/test-suite/ruby/typemap_ns_using_runme.rb trunk/Examples/test-suite/ruby/typename_runme.rb trunk/Examples/test-suite/ruby/unions_runme.rb trunk/Examples/test-suite/ruby/using1_runme.rb trunk/Examples/test-suite/ruby/using2_runme.rb trunk/Examples/test-suite/ruby/using_composition_runme.rb trunk/Examples/test-suite/ruby/using_extend_runme.rb trunk/Examples/test-suite/ruby/using_inherit_runme.rb trunk/Examples/test-suite/ruby/using_private_runme.rb trunk/Examples/test-suite/ruby/using_protected_runme.rb trunk/Examples/test-suite/ruby/varargs_runme.rb trunk/Examples/test-suite/ruby/virtual_derivation_runme.rb trunk/Examples/test-suite/ruby/virtual_poly_runme.rb trunk/Examples/test-suite/ruby/voidtest_runme.rb trunk/Lib/ruby/rubyrun.swg trunk/Lib/ruby/rubystrings.swg trunk/Lib/ruby/rubytracking.swg trunk/Source/Modules/ruby.cxx Added Paths: ----------- trunk/Examples/test-suite/ruby/swig_assert.rb Modified: trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_inherit_ok_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_inherit_ok' include Abstract_inherit_ok Modified: trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_inherit_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_inherit' include Abstract_inherit Modified: trunk/Examples/test-suite/ruby/abstract_signature_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_signature_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_signature_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_signature' include Abstract_signature Modified: trunk/Examples/test-suite/ruby/abstract_typedef2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_typedef2_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_typedef2_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_typedef2' include Abstract_typedef2 Modified: trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_typedef_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_typedef' include Abstract_typedef Modified: trunk/Examples/test-suite/ruby/abstract_virtual_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/abstract_virtual_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/abstract_virtual_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'abstract_virtual' include Abstract_virtual Modified: trunk/Examples/test-suite/ruby/aggregate_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/aggregate_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/aggregate_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'aggregate' include Aggregate Modified: trunk/Examples/test-suite/ruby/array_member_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/array_member_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/array_member_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'array_member' include Array_member Modified: trunk/Examples/test-suite/ruby/arrays_global_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/arrays_global_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/arrays_global_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'arrays_global' Arrays_global.array_i = Arrays_global.array_const_i Modified: trunk/Examples/test-suite/ruby/bools_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/bools_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/bools_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,4 +1,15 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# +require 'swig_assert' + + require 'bools' # bool constant check Modified: trunk/Examples/test-suite/ruby/char_constant_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/char_constant_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/char_constant_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'char_constant' Modified: trunk/Examples/test-suite/ruby/class_ignore_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/class_ignore_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/class_ignore_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'class_ignore' a = Class_ignore::Bar.new Modified: trunk/Examples/test-suite/ruby/constover_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/constover_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/constover_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'constover' error = 0 Modified: trunk/Examples/test-suite/ruby/cpp_namespace_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/cpp_namespace_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/cpp_namespace_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + # Note: This example assumes that namespaces are flattened require 'cpp_namespace' Modified: trunk/Examples/test-suite/ruby/default_constructor_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/default_constructor_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/default_constructor_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'default_constructor' include Default_constructor Modified: trunk/Examples/test-suite/ruby/director_abstract_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_abstract_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_abstract_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_abstract' class MyFoo < Director_abstract::Foo Modified: trunk/Examples/test-suite/ruby/director_basic_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_basic_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_basic_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_basic' class MyFoo < Director_basic::Foo Modified: trunk/Examples/test-suite/ruby/director_constructor_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_constructor_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_constructor_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_constructor' include Director_constructor Modified: trunk/Examples/test-suite/ruby/director_default_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_default_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_default_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_default' Modified: trunk/Examples/test-suite/ruby/director_detect_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_detect_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_detect_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_detect' class MyBar < Director_detect::Bar Modified: trunk/Examples/test-suite/ruby/director_exception_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_exception_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_exception_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_exception' include Director_exception Modified: trunk/Examples/test-suite/ruby/director_frob_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_frob_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_frob_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_frob' foo = Director_frob::Bravo.new; Modified: trunk/Examples/test-suite/ruby/director_nested_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_nested_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_nested_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_nested' NoProtectedError = Kernel.const_defined?("NoMethodError") ? NoMethodError : NameError Modified: trunk/Examples/test-suite/ruby/director_protected_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_protected_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_protected_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_protected' NoProtectedError = Kernel.const_defined?("NoMethodError") ? NoMethodError : NameError Modified: trunk/Examples/test-suite/ruby/director_string_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_string_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_string_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_string' class B < Director_string::A @@ -10,4 +21,4 @@ b = B.new("hello") b.get_first -b.get(0) \ No newline at end of file +b.get(0) Modified: trunk/Examples/test-suite/ruby/director_unroll_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_unroll_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_unroll_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_unroll' class MyFoo < Director_unroll::Foo Modified: trunk/Examples/test-suite/ruby/director_wombat_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/director_wombat_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/director_wombat_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'director_wombat' include Director_wombat Modified: trunk/Examples/test-suite/ruby/disown_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/disown_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/disown_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'disown' include Disown Modified: trunk/Examples/test-suite/ruby/dynamic_cast_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/dynamic_cast_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/dynamic_cast_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'dynamic_cast' f = Dynamic_cast::Foo.new Modified: trunk/Examples/test-suite/ruby/enum_thorough_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/enum_thorough_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/enum_thorough_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'enum_thorough' include Enum_thorough Modified: trunk/Examples/test-suite/ruby/enums_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/enums_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/enums_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'enums' Enums.bar2(1) Modified: trunk/Examples/test-suite/ruby/extend_template_ns_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/extend_template_ns_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/extend_template_ns_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'extend_template_ns' include Extend_template_ns Modified: trunk/Examples/test-suite/ruby/extend_template_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/extend_template_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/extend_template_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'extend_template' f = Extend_template::Foo_0.new Modified: trunk/Examples/test-suite/ruby/friends_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/friends_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/friends_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'friends' Modified: trunk/Examples/test-suite/ruby/grouping_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/grouping_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/grouping_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'grouping' x = Grouping.test1(42) Modified: trunk/Examples/test-suite/ruby/ignore_parameter_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/ignore_parameter_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/ignore_parameter_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'ignore_parameter' include Ignore_parameter Modified: trunk/Examples/test-suite/ruby/imports_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/imports_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/imports_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + # This is the import runtime testcase. require 'imports_a' Modified: trunk/Examples/test-suite/ruby/inherit_missing_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/inherit_missing_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/inherit_missing_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'inherit_missing' a = Inherit_missing.new_Foo() Modified: trunk/Examples/test-suite/ruby/keywords_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/keywords_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/keywords_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'keywords' kw = Keywords::Keywords.new Modified: trunk/Examples/test-suite/ruby/li_carrays_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_carrays_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_carrays_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_carrays' include Li_carrays Modified: trunk/Examples/test-suite/ruby/li_factory_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_factory_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_factory_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_factory' circle = Li_factory::Geometry.create(Li_factory::Geometry::CIRCLE) Modified: trunk/Examples/test-suite/ruby/li_std_deque_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_deque_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_std_deque_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_std_deque' include Li_std_deque Modified: trunk/Examples/test-suite/ruby/li_std_pair_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_pair_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_std_pair_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_std_pair' include Li_std_pair Modified: trunk/Examples/test-suite/ruby/li_std_string_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_string_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_std_string_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_std_string' include Li_std_string Modified: trunk/Examples/test-suite/ruby/li_std_vector_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/li_std_vector_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'li_std_vector' include Li_std_vector Modified: trunk/Examples/test-suite/ruby/minherit_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/minherit_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/minherit_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'minherit' a = Minherit::Foo.new Modified: trunk/Examples/test-suite/ruby/namespace_typemap_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/namespace_typemap_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/namespace_typemap_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'namespace_typemap' include Namespace_typemap Modified: trunk/Examples/test-suite/ruby/naming_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/naming_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/naming_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'naming' # Check class names Modified: trunk/Examples/test-suite/ruby/newobject1_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/newobject1_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/newobject1_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,23 @@ +#!/usr/bin/env ruby +# +# Simple test of %newobject +# * The purpose of this test is to confirm that a language module +# * correctly handles the case when C++ class member functions (of both +# * the static and non-static persuasion) have been tagged with the +# * %newobject directive. +# +# Ruby's GC is somewhat broken in that it will mark some more stack space +# leading to the collection of local objects to be delayed. +# Thus, upon invokation, it sometimes you can wait up to several +# instructions to kick in. +# See: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/7449 +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' require 'newobject1' include Newobject1 @@ -2,12 +22,6 @@ -foo1 = Foo.makeFoo -raise RuntimeError if Foo.fooCount != 1 -foo2 = foo1.makeMore -raise RuntimeError if Foo.fooCount != 2 +100.times { foo1 = Foo.makeFoo; foo2 = foo1.makeMore } +GC.start +swig_assert( 'Foo.fooCount <= 2', "but is #{Foo.fooCount}" ) -foo1 = nil ; GC.start -raise RuntimeError if Foo.fooCount != 1 - -foo2 = nil ; GC.start -raise RuntimeError if Foo.fooCount != 0 Modified: trunk/Examples/test-suite/ruby/newobject2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/newobject2_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/newobject2_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,17 @@ +#!/usr/bin/env ruby +# +# Ruby's GC is somewhat broken in that it will mark some more stack space +# leading to the collection of local objects to be delayed. +# Thus, upon invokation, it sometimes you can wait up to several +# instructions to kick in. +# See: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/7449 +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' require 'newobject2' include Newobject2 @@ -2,12 +16,12 @@ -foo1 = makeFoo -raise RuntimeError if fooCount != 1 -foo2 = makeFoo -raise RuntimeError if fooCount != 2 +100.times { foo1 = makeFoo } +GC.start +swig_assert( 'fooCount == 1', "but is #{fooCount}" ) -foo1 = nil ; GC.start -raise RuntimeError if fooCount != 1 -foo2 = nil ; GC.start -raise RuntimeError if fooCount != 0 +@foos = [] +100.times { @foos << makeFoo } +swig_assert( 'fooCount == 101', "but is #{fooCount}" ) + +GC.start Modified: trunk/Examples/test-suite/ruby/overload_copy_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_copy_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_copy_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_copy' include Overload_copy Modified: trunk/Examples/test-suite/ruby/overload_extend_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_extend_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_extend_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_extend' f = Overload_extend::Foo.new Modified: trunk/Examples/test-suite/ruby/overload_extendc_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_extendc_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_extendc_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_extend' f = Overload_extend::Foo.new Modified: trunk/Examples/test-suite/ruby/overload_simple_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_simple_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_simple_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_simple' include Overload_simple Modified: trunk/Examples/test-suite/ruby/overload_subtype_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_subtype_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_subtype_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_subtype' include Overload_subtype Modified: trunk/Examples/test-suite/ruby/overload_template_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/overload_template_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/overload_template_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'overload_template' f = Overload_template.foo() Modified: trunk/Examples/test-suite/ruby/primitive_ref_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/primitive_ref_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/primitive_ref_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'primitive_ref' include Primitive_ref Modified: trunk/Examples/test-suite/ruby/primitive_types_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/primitive_types_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/primitive_types_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'primitive_types' include Primitive_types Modified: trunk/Examples/test-suite/ruby/profiletest_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/profiletest_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/profiletest_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'profiletest' a = Profiletest::A.new() Modified: trunk/Examples/test-suite/ruby/refcount_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/refcount_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/refcount_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'refcount' Modified: trunk/Examples/test-suite/ruby/reference_global_vars_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/reference_global_vars_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/reference_global_vars_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'reference_global_vars' # primitive reference variables Modified: trunk/Examples/test-suite/ruby/rename_scope_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/rename_scope_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/rename_scope_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'rename_scope' include Rename_scope Modified: trunk/Examples/test-suite/ruby/smart_pointer_const_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_const_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_const_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_const' include Smart_pointer_const Modified: trunk/Examples/test-suite/ruby/smart_pointer_multi_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_multi_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_multi_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_multi' include Smart_pointer_multi Modified: trunk/Examples/test-suite/ruby/smart_pointer_multi_typedef_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_multi_typedef_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_multi_typedef_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_multi_typedef' include Smart_pointer_multi_typedef Modified: trunk/Examples/test-suite/ruby/smart_pointer_not_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_not_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_not_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_not' include Smart_pointer_not Modified: trunk/Examples/test-suite/ruby/smart_pointer_overload_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_overload_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_overload_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_overload' include Smart_pointer_overload Modified: trunk/Examples/test-suite/ruby/smart_pointer_rename_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_rename_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_rename_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_rename' include Smart_pointer_rename Modified: trunk/Examples/test-suite/ruby/smart_pointer_simple_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_simple_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_simple_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_simple' include Smart_pointer_simple Modified: trunk/Examples/test-suite/ruby/smart_pointer_typedef_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/smart_pointer_typedef_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/smart_pointer_typedef_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'smart_pointer_typedef' include Smart_pointer_typedef Modified: trunk/Examples/test-suite/ruby/sneaky1_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/sneaky1_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/sneaky1_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'sneaky1' x = Sneaky1.add(3, 4) Modified: trunk/Examples/test-suite/ruby/static_const_member_2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/static_const_member_2_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/static_const_member_2_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'static_const_member_2' include Static_const_member_2 Modified: trunk/Examples/test-suite/ruby/struct_value_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/struct_value_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/struct_value_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'struct_value' b = Struct_value::Bar.new Added: trunk/Examples/test-suite/ruby/swig_assert.rb =================================================================== --- trunk/Examples/test-suite/ruby/swig_assert.rb (rev 0) +++ trunk/Examples/test-suite/ruby/swig_assert.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# +# A simple function to create useful asserts +# +# Author:: gga +# Copyright:: 2007 +# License:: Ruby +# + + +class SwigRubyError < RuntimeError +end + +def swig_assert( condition, *args ) + raise SwigRubyError.new("FAILED CHECK: #{condition} #{args.join(' ')}") unless eval(condition) +end Property changes on: trunk/Examples/test-suite/ruby/swig_assert.rb ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Modified: trunk/Examples/test-suite/ruby/template_construct_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_construct_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_construct_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,2 +1,13 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_construct' Modified: trunk/Examples/test-suite/ruby/template_extend1_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_extend1_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_extend1_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_extend1' a = Template_extend1::LBaz.new Modified: trunk/Examples/test-suite/ruby/template_extend2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_extend2_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_extend2_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_extend2' a = Template_extend2::LBaz.new Modified: trunk/Examples/test-suite/ruby/template_inherit_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_inherit_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_inherit_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_inherit' include Template_inherit Modified: trunk/Examples/test-suite/ruby/template_ns4_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_ns4_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_ns4_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_ns4' d = Template_ns4.make_Class_DD() Modified: trunk/Examples/test-suite/ruby/template_ns_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_ns_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_ns_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_ns' include Template_ns Modified: trunk/Examples/test-suite/ruby/template_rename_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_rename_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_rename_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_rename' i = Template_rename::IFoo.new Modified: trunk/Examples/test-suite/ruby/template_tbase_template_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_tbase_template_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_tbase_template_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_tbase_template' include Template_tbase_template Modified: trunk/Examples/test-suite/ruby/template_type_namespace_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_type_namespace_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_type_namespace_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_type_namespace' include Template_type_namespace Modified: trunk/Examples/test-suite/ruby/template_typedef_cplx2_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_typedef_cplx2_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_typedef_cplx2_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_typedef_cplx2' include Template_typedef_cplx2 Modified: trunk/Examples/test-suite/ruby/template_typedef_cplx3_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_typedef_cplx3_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_typedef_cplx3_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_typedef_cplx3' include Template_typedef_cplx3 Modified: trunk/Examples/test-suite/ruby/template_typedef_cplx4_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_typedef_cplx4_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_typedef_cplx4_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_typedef_cplx4' include Template_typedef_cplx4 Modified: trunk/Examples/test-suite/ruby/template_typedef_cplx_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/template_typedef_cplx_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/template_typedef_cplx_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'template_typedef_cplx' include Template_typedef_cplx Modified: trunk/Examples/test-suite/ruby/throw_exception_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/throw_exception_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/throw_exception_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'throw_exception' include Throw_exception Modified: trunk/Examples/test-suite/ruby/track_objects_directors_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/track_objects_directors_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/track_objects_directors_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'track_objects_directors' class MyFoo < Track_objects_directors::Foo Modified: trunk/Examples/test-suite/ruby/track_objects_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/track_objects_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/track_objects_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'track_objects' def test_same_ruby_object(foo1, foo2) Modified: trunk/Examples/test-suite/ruby/typedef_inherit_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/typedef_inherit_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/typedef_inherit_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'typedef_inherit' a = Typedef_inherit::Foo.new Modified: trunk/Examples/test-suite/ruby/typedef_scope_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/typedef_scope_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/typedef_scope_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'typedef_scope' b = Typedef_scope::Bar.new Modified: trunk/Examples/test-suite/ruby/typemap_namespace_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/typemap_namespace_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/typemap_namespace_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'typemap_namespace' include Typemap_namespace Modified: trunk/Examples/test-suite/ruby/typemap_ns_using_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/typemap_ns_using_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/typemap_ns_using_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'typemap_ns_using' raise RuntimeError unless Typemap_ns_using.spam(37) == 37 Modified: trunk/Examples/test-suite/ruby/typename_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/typename_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/typename_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,3 +1,14 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# + +require 'swig_assert' + require 'typename' f = Typename::Foo.new Modified: trunk/Examples/test-suite/ruby/unions_runme.rb =================================================================== --- trunk/Examples/test-suite/ruby/unions_runme.rb 2007-04-27 21:12:36 UTC (rev 9690) +++ trunk/Examples/test-suite/ruby/unions_runme.rb 2007-04-28 04:20:28 UTC (rev 9691) @@ -1,4 +1,15 @@ +#!/usr/bin/env ruby +# +# Put description here +# +# Author:: gga +# Copyright:: 2007 +# License:: SWIG +# +require 'swig_assert' + + # This is the union runtime testcase. It ensures that values within a # union embedded w... [truncated message content] |