From: <wsf...@us...> - 2008-07-17 21:05:52
|
Revision: 10676 http://swig.svn.sourceforge.net/swig/?rev=10676&view=rev Author: wsfulton Date: 2008-07-17 21:05:49 +0000 (Thu, 17 Jul 2008) Log Message: ----------- SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. Modified Paths: -------------- trunk/CHANGES.current trunk/configure.in Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-07-17 20:59:23 UTC (rev 10675) +++ trunk/CHANGES.current 2008-07-17 21:05:49 UTC (rev 10676) @@ -1,6 +1,10 @@ Version 1.3.37 (in progress) ============================= +2008-07-17: wsfulton + Fix SF #2019156 Configuring with --without-octave or --without-alllang + did not disable octave. + 2008-07-14: wsfultonn [Java, C#] Fix director typemaps for pointers so that NULL pointers are correctly marshalled to C#/Java null in director methods. Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-07-17 20:59:23 UTC (rev 10675) +++ trunk/configure.in 2008-07-17 21:05:49 UTC (rev 10676) @@ -732,13 +732,13 @@ OCTAVE_SO=.oct AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave]) -AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[ OCTAVEBIN="$withval"], [OCTAVEBIN=yes]) +AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN=yes]) # First, check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno -o x"${with_alllang}" = xno ; then AC_MSG_NOTICE([Disabling Octave]) OCTAVE= -fi +else # First figure out what the name of Octave is @@ -779,6 +779,8 @@ AC_MSG_RESULT(could not figure out how to run octave) fi +fi + AC_SUBST(OCTAVE) AC_SUBST(OCTAVEEXT) AC_SUBST(OCTAVE_SO) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-07-19 22:46:06
|
Revision: 10683 http://swig.svn.sourceforge.net/swig/?rev=10683&view=rev Author: wsfulton Date: 2008-07-19 22:45:54 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Fix building of Tcl examples/test-suite on Mac OSX Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/Makefile.in trunk/configure.in Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-07-19 18:08:06 UTC (rev 10682) +++ trunk/CHANGES.current 2008-07-19 22:45:54 UTC (rev 10683) @@ -1,6 +1,9 @@ Version 1.3.37 (in progress) ============================= +2008-07-19: wsfulton + Fix building of Tcl examples/test-suite on Mac OSX reported by Gideon Simpson. + 2008-07-17: wsfulton Fix SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2008-07-19 18:08:06 UTC (rev 10682) +++ trunk/Examples/Makefile.in 2008-07-19 22:45:54 UTC (rev 10683) @@ -96,6 +96,8 @@ # Extra Tcl specific dynamic linking options TCL_DLNK = @TCLDYNAMICLINKING@ TCL_SO = @TCL_SO@ +TCLLDSHARED = @TCLLDSHARED@ +TCLCXXSHARED = @TCLCXXSHARED@ # ----------------------------------------------------------- # Build a new version of the tclsh shell @@ -134,7 +136,7 @@ tcl: $(SRCS) $(SWIG) -tcl8 $(SWIGOPT) $(TCL_SWIGOPTS) $(INTERFACE) $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(TCL_INCLUDE) - $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) + $(TCLLDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) # ----------------------------------------------------------- # Build a Tcl7.5 dynamic loadable module for C++ @@ -143,7 +145,7 @@ tcl_cpp: $(SRCS) $(SWIG) -tcl8 -c++ $(SWIGOPT) $(TCL_SWIGOPTS) $(INTERFACE) $(CXX) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(TCL_INCLUDE) - $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) + $(TCLCXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) # ----------------------------------------------------------------- # Cleaning the Tcl examples Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-07-19 18:08:06 UTC (rev 10682) +++ trunk/configure.in 2008-07-19 22:45:54 UTC (rev 10683) @@ -533,14 +533,27 @@ # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; -*-*-darwin*) TCLDYNAMICLINKING="-dynamiclib -flat_namespace -undefined suppress";; *)TCLDYNAMICLINKING="";; esac + +case $host in +*-*-darwin*) + TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' + TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' + ;; +*) + TCLLDSHARED='$(LDSHARED)' + TCLCXXSHARED='$(CXXSHARED)' + ;; +esac + fi AC_SUBST(TCLINCLUDE) AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) +AC_SUBST(TCLLDSHARED) +AC_SUBST(TCLCXXSHARED) #---------------------------------------------------------------- # Look for Python This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wu...@us...> - 2008-08-02 08:28:05
|
Revision: 10726 http://swig.svn.sourceforge.net/swig/?rev=10726&view=rev Author: wuzzeb Date: 2008-08-02 08:28:02 +0000 (Sat, 02 Aug 2008) Log Message: ----------- Commit patch 2019314 Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/allegrocl/allegrocl.swg trunk/Lib/chicken/chicken.swg trunk/Source/Modules/allegrocl.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-07-31 23:14:45 UTC (rev 10725) +++ trunk/CHANGES.current 2008-08-02 08:28:02 UTC (rev 10726) @@ -1,6 +1,11 @@ Version 1.3.37 (in progress) ============================= +2008-08-02: wuzzeb + [Chicken,Allegro] Commit Patch 2019314 + Fixes a build error in chicken, and several build errors and other errors + in Allegro CL + 2008-07-19: wsfulton Fix building of Tcl examples/test-suite on Mac OSX reported by Gideon Simpson. Modified: trunk/Lib/allegrocl/allegrocl.swg =================================================================== --- trunk/Lib/allegrocl/allegrocl.swg 2008-07-31 23:14:45 UTC (rev 10725) +++ trunk/Lib/allegrocl/allegrocl.swg 2008-08-02 08:28:02 UTC (rev 10726) @@ -296,15 +296,30 @@ sym)))) (cl::defun full-name (id type arity class) - (cl::case type - (:getter (cl::format nil "~@[~A_~]~A" class id)) - (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) - (:destructor (cl::format nil "delete_~A" id)) - (:type (cl::format nil "ff_~A" id)) - (:slot id) - (:ff-operator (cl::format nil "ffi_~A" id)) - (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" - class id arity)))) + ; We need some kind of a hack here to handle template classes + ; and other synonym types right. We need the original name. + (let*( (sym (read-symbol-from-string + (if (eq *swig-identifier-converter* 'identifier-convert-lispify) + (string-lispify id) + id))) + (sym-class (find-class sym nil)) + (id (cond ( (not sym-class) + id ) + ( (and sym-class + (not (eq (class-name sym-class) + sym))) + (class-name sym-class) ) + ( t + id ))) ) + (cl::case type + (:getter (cl::format nil "~@[~A_~]~A" class id)) + (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) + (:destructor (cl::format nil "delete_~A" id)) + (:type (cl::format nil "ff_~A" id)) + (:slot id) + (:ff-operator (cl::format nil "ffi_~A" id)) + (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" + class id arity))))) (cl::defun identifier-convert-null (id &key type class arity) (cl::if (cl::eq type :setter) @@ -312,40 +327,37 @@ id :type :getter :class class :arity arity)) (read-symbol-from-string (full-name id type arity class)))) -(cl::defun identifier-convert-lispify (cname &key type class arity) - (cl::assert (cl::stringp cname)) - (cl::when (cl::eq type :setter) - (cl::return-from identifier-convert-lispify - `(cl::setf ,(identifier-convert-lispify - cname :type :getter :class class :arity arity)))) - (cl::setq cname (full-name cname type arity class)) - (cl::if (cl::eq type :constant) - (cl::setf cname (cl::format nil "*~A*" cname))) - (cl::setf cname (excl::replace-regexp cname "_" "-")) - (cl::let ((lastcase :other) - newcase char res) +(cl::defun string-lispify (str) + (cl::let ( (cname (excl::replace-regexp str "_" "-")) + (lastcase :other) + newcase char res ) (cl::dotimes (n (cl::length cname)) (cl::setf char (cl::schar cname n)) (excl::if* (cl::alpha-char-p char) then (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower)) - - (cl::when (cl::or (cl::and (cl::eq lastcase :upper) - (cl::eq newcase :lower)) - (cl::and (cl::eq lastcase :lower) - (cl::eq newcase :upper))) + (cl::when (cl::and (cl::eq lastcase :lower) + (cl::eq newcase :upper)) ;; case change... add a dash (cl::push #\- res) (cl::setf newcase :other)) - (cl::push (cl::char-downcase char) res) - (cl::setf lastcase newcase) - else (cl::push char res) (cl::setf lastcase :other))) - (read-symbol-from-string (cl::coerce (cl::nreverse res) 'string)))) + (cl::coerce (cl::nreverse res) 'string))) + +(cl::defun identifier-convert-lispify (cname &key type class arity) + (cl::assert (cl::stringp cname)) + (cl::when (cl::eq type :setter) + (cl::return-from identifier-convert-lispify + `(cl::setf ,(identifier-convert-lispify + cname :type :getter :class class :arity arity)))) + (cl::setq cname (full-name cname type arity class)) + (cl::if (cl::eq type :constant) + (cl::setf cname (cl::format nil "*~A*" cname))) + (read-symbol-from-string (string-lispify cname))) (cl::defun id-convert-and-export (name &rest kwargs) (cl::multiple-value-bind (symbol package) Modified: trunk/Lib/chicken/chicken.swg =================================================================== --- trunk/Lib/chicken/chicken.swg 2008-07-31 23:14:45 UTC (rev 10725) +++ trunk/Lib/chicken/chicken.swg 2008-08-02 08:28:02 UTC (rev 10726) @@ -10,6 +10,7 @@ /* chicken.h has to appear first. */ %insert(runtime) %{ +#include <assert.h> #include <chicken.h> %} Modified: trunk/Source/Modules/allegrocl.cxx =================================================================== --- trunk/Source/Modules/allegrocl.cxx 2008-07-31 23:14:45 UTC (rev 10725) +++ trunk/Source/Modules/allegrocl.cxx 2008-08-02 08:28:02 UTC (rev 10726) @@ -1084,7 +1084,8 @@ of_ltype = lookup_defined_foreign_ltype(of_name); // Printf(f_clhead,";; from emit-synonym\n"); - Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); + if( of_ltype ) + Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); Delete(synonym_ns); Delete(of_ns_list); @@ -1521,6 +1522,8 @@ } + Preprocessor_define("SWIGALLEGROCL 1", 0); + allow_overloading(); } @@ -1531,7 +1534,7 @@ swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig"); - Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), Swig_file_basename(Getattr(n,"infile"))); + Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name); f_cl = NewFile(cl_filename, "w"); if (!f_cl) { @@ -2628,7 +2631,7 @@ String *actioncode = emit_action(n); String *tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode); - if (tm) { + if (!is_void_return && tm) { Replaceall(tm, "$result", "lresult"); Printf(f->code, "%s\n", tm); Printf(f->code, " return lresult;\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ta...@us...> - 2008-08-08 03:10:57
|
Revision: 10743 http://swig.svn.sourceforge.net/swig/?rev=10743&view=rev Author: talby Date: 2008-08-08 03:10:55 +0000 (Fri, 08 Aug 2008) Log Message: ----------- initial steps to clean up perl5 class methods (primarily constructors). Modified Paths: -------------- trunk/Examples/test-suite/perl5/imports_runme.pl trunk/Source/Modules/perl5.cxx Modified: trunk/Examples/test-suite/perl5/imports_runme.pl =================================================================== --- trunk/Examples/test-suite/perl5/imports_runme.pl 2008-08-07 19:46:20 UTC (rev 10742) +++ trunk/Examples/test-suite/perl5/imports_runme.pl 2008-08-08 03:10:55 UTC (rev 10743) @@ -1,5 +1,5 @@ use imports_b; use imports_a; -$x = imports_bc::new_B(); +$x = imports_b::B->new(); imports_ac::A_hello($x); Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2008-08-07 19:46:20 UTC (rev 10742) +++ trunk/Source/Modules/perl5.cxx 2008-08-08 03:10:55 UTC (rev 10743) @@ -556,6 +556,7 @@ String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); + ParmList *outer = Getattr(n, "perl5:implicits"); String *overname = 0; Parm *p; @@ -565,7 +566,7 @@ String *tm; String *cleanup, *outarg; int num_saved = 0; - int num_arguments, num_required; + int num_arguments, num_required, num_implicits; int varargs = 0; if (Getattr(n, "sym:overloaded")) { @@ -587,6 +588,19 @@ Printv(f->def, "XS(", wname, ") {\n", "{\n", /* scope to destroy C++ objects before croaking */ NIL); + num_implicits = 0; + if(outer) { + Parm *tmp = outer; + Parm *tail; + while(tmp) { + tail = tmp; + num_implicits++; + tmp = nextSibling(tmp); + } + /* link the outer with inner parms */ + set_nextSibling(tail, l); + } + emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); @@ -599,13 +613,28 @@ /* Check the number of arguments */ if (!varargs) { - Printf(f->code, " if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); + Printf(f->code, " if ((items < %d) || (items > %d)) {\n", + num_required + num_implicits, num_arguments + num_implicits); } else { - Printf(f->code, " if (items < %d) {\n", num_required); + Printf(f->code, " if (items < %d) {\n", + num_required + num_implicits); } - Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, l)); + Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, outer)); Printf(f->code, "}\n"); + if (num_implicits) { + /* TODO: support implicits of types other than SVs */ + Parm *p = outer; + for(i = 0; i < num_implicits; i++) { + String *pname = Getattr(p, "name"); + String *pinit = SwigType_str(Getattr(p, "type"), pname); + Wrapper_add_local(f, pname, pinit); + Delete(pinit); + Printf(f->code, "%s = ST(%d);\n", pname, i++); + p = nextSibling(p); + } + Printf(f->code, "ax += %d;\n", num_implicits); + } /* Write code to extract parameters. */ i = 0; for (i = 0, p = l; i < num_arguments; i++) { @@ -795,6 +824,10 @@ Printv(df->def, "XS(", dname, ") {\n", NIL); Wrapper_add_local(df, "dXSARGS", "dXSARGS"); + if(num_implicits) { + Printf(df->code, "ax += %d;\n", num_implicits); + Printf(df->code, "items -= %d;\n", num_implicits); + } Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "croak(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "XSRETURN(0);\n"); @@ -1041,13 +1074,14 @@ Clear(temp); Printf(temp, "%s(", iname); - /* Now go through and print parameters */ + i = 0; + /* Now go through and print normal parameters */ p = l; - i = 0; while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); if (!checkAttribute(p,"tmap:in:numinputs","0")) { + if(i > 0) Append(temp, ","); /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { @@ -1057,16 +1091,8 @@ } } i++; - p = nextSibling(p); - if (p) - if (!checkAttribute(p,"tmap:in:numinputs","0")) - Putc(',', temp); - } else { - p = nextSibling(p); - if (p) - if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) - Putc(',', temp); } + p = nextSibling(p); } Printf(temp, ");"); return Char(temp); @@ -1490,6 +1516,15 @@ String *symname = Getattr(n, "sym:name"); + { + String *type = NewString("SV"); + SwigType_add_pointer(type); + Parm *p = NewParm(type, "proto"); + Delete(type); + Setattr(n, "perl5:implicits", p); + Delete(p); + } + member_func = 1; Language::constructorHandler(n); @@ -1510,7 +1545,7 @@ } Printv(pcode, - tab4, "my $pkg = shift;\n", + tab4, "my $pkg = $_[0];\n", tab4, "my $self = ", cmodule, "::", Swig_name_construct(symname), "(@_);\n", tab4, "bless $self, $pkg if defined($self);\n", "}\n\n", NIL); have_constructor = 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ta...@us...> - 2008-08-09 23:57:59
|
Revision: 10749 http://swig.svn.sourceforge.net/swig/?rev=10749&view=rev Author: talby Date: 2008-08-09 23:57:55 +0000 (Sat, 09 Aug 2008) Log Message: ----------- usage_func() fix + CHANGES.current entry to explain my past few commits. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/perl5.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-08-09 20:14:41 UTC (rev 10748) +++ trunk/CHANGES.current 2008-08-09 23:57:55 UTC (rev 10749) @@ -1,6 +1,9 @@ Version 1.3.37 (in progress) ============================= +2008-08-09: talby + [Perl5] Unify Perl and C portions of constructor wrappers. + 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2008-08-09 20:14:41 UTC (rev 10748) +++ trunk/Source/Modules/perl5.cxx 2008-08-09 23:57:55 UTC (rev 10749) @@ -619,7 +619,7 @@ Printf(f->code, " if (items < %d) {\n", num_required + num_implicits); } - Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, outer)); + Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, outer, l)); Printf(f->code, "}\n"); if (num_implicits) { @@ -1073,7 +1073,7 @@ /* ------------------------------------------------------------ * usage_func() * ------------------------------------------------------------ */ - char *usage_func(char *iname, SwigType *, ParmList *l) { + char *usage_func(char *iname, SwigType *, ParmList *il, ParmList *l) { static String *temp = 0; Parm *p; int i; @@ -1084,6 +1084,9 @@ Printf(temp, "%s(", iname); i = 0; + /* Print implicit parameters */ + for(p = il; p; p = nextSibling(p)) + Printv(temp, (i > 0 ? "," : ""), Getattr(p, "name"), NIL); /* Now go through and print normal parameters */ p = l; while (p != 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ta...@us...> - 2008-08-19 07:09:32
|
Revision: 10794 http://swig.svn.sourceforge.net/swig/?rev=10794&view=rev Author: talby Date: 2008-08-19 07:09:29 +0000 (Tue, 19 Aug 2008) Log Message: ----------- rollback 10737:10749, this work is better left on a branch until it is in support a significant feature enhancement. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/perl5/imports_runme.pl trunk/Source/Modules/perl5.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-08-18 18:51:22 UTC (rev 10793) +++ trunk/CHANGES.current 2008-08-19 07:09:29 UTC (rev 10794) @@ -1,9 +1,6 @@ Version 1.3.37 (in progress) ============================= -2008-08-09: talby - [Perl5] Unify Perl and C portions of constructor wrappers. - 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors Modified: trunk/Examples/test-suite/perl5/imports_runme.pl =================================================================== --- trunk/Examples/test-suite/perl5/imports_runme.pl 2008-08-18 18:51:22 UTC (rev 10793) +++ trunk/Examples/test-suite/perl5/imports_runme.pl 2008-08-19 07:09:29 UTC (rev 10794) @@ -1,5 +1,5 @@ use imports_b; use imports_a; -$x = imports_b::B->new(); +$x = imports_bc::new_B(); imports_ac::A_hello($x); Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2008-08-18 18:51:22 UTC (rev 10793) +++ trunk/Source/Modules/perl5.cxx 2008-08-19 07:09:29 UTC (rev 10794) @@ -100,6 +100,8 @@ static int have_destructor = 0; static int have_data_members = 0; static String *class_name = 0; /* Name of the class (what Perl thinks it is) */ +static String *real_classname = 0; /* Real name of C/C++ class */ +static String *fullclassname = 0; static String *pcode = 0; /* Perl code associated with each class */ /* static String *blessedmembers = 0; *//* Member data associated with each class */ @@ -556,7 +558,6 @@ String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); - ParmList *outer = Getattr(n, "perl5:implicits"); String *overname = 0; Parm *p; @@ -566,7 +567,7 @@ String *tm; String *cleanup, *outarg; int num_saved = 0; - int num_arguments, num_required, num_implicits; + int num_arguments, num_required; int varargs = 0; if (Getattr(n, "sym:overloaded")) { @@ -588,19 +589,6 @@ Printv(f->def, "XS(", wname, ") {\n", "{\n", /* scope to destroy C++ objects before croaking */ NIL); - num_implicits = 0; - if (outer) { - Parm *tmp = outer; - Parm *tail; - while(tmp) { - tail = tmp; - num_implicits++; - tmp = nextSibling(tmp); - } - /* link the outer with inner parms */ - set_nextSibling(tail, l); - } - emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); @@ -613,29 +601,13 @@ /* Check the number of arguments */ if (!varargs) { - Printf(f->code, " if ((items < %d) || (items > %d)) {\n", - num_required + num_implicits, num_arguments + num_implicits); + Printf(f->code, " if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); } else { - Printf(f->code, " if (items < %d) {\n", - num_required + num_implicits); + Printf(f->code, " if (items < %d) {\n", num_required); } - Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, outer, l)); + Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, l)); Printf(f->code, "}\n"); - if (num_implicits) { - /* TODO: support implicits of types other than SVs */ - Parm *p = outer; - for(i = 0; i < num_implicits; i++) { - String *pname = Getattr(p, "name"); - String *pinit = SwigType_str(Getattr(p, "type"), pname); - Wrapper_add_local(f, pname, pinit); - Delete(pinit); - Printf(f->code, "%s = ST(%d);\n", pname, i++); - p = nextSibling(p); - } - if (l) - Printf(f->code, "ax += %d;\n", num_implicits); - } /* Write code to extract parameters. */ i = 0; for (i = 0, p = l; i < num_arguments; i++) { @@ -748,9 +720,6 @@ Wrapper_add_localv(f, "_saved", "SV *", temp, NIL); } - if (num_implicits && l) - Printf(f->code, "ax -= %d;\n", num_implicits); - /* Now write code to make the function call */ Swig_director_emit_dynamic_cast(n, f); @@ -797,11 +766,6 @@ Printf(f->code, "%s\n", tm); } - if (blessed && Equal(nodeType(n), "constructor")) { - Append(f->code, - "if (SvOK(ST(0))) sv_bless(ST(0), gv_stashsv(proto, 0));\n"); - } - Printv(f->code, "XSRETURN(argvi);\n", "fail:\n", cleanup, "SWIG_croak_null();\n" "}\n" "}\n", NIL); /* Add the dXSARGS last */ @@ -833,10 +797,6 @@ Printv(df->def, "XS(", dname, ") {\n", NIL); Wrapper_add_local(df, "dXSARGS", "dXSARGS"); - if (num_implicits) { - Printf(df->code, "ax += %d;\n", num_implicits); - Printf(df->code, "items -= %d;\n", num_implicits); - } Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "croak(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "XSRETURN(0);\n"); @@ -1073,7 +1033,7 @@ /* ------------------------------------------------------------ * usage_func() * ------------------------------------------------------------ */ - char *usage_func(char *iname, SwigType *, ParmList *il, ParmList *l) { + char *usage_func(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i; @@ -1083,17 +1043,13 @@ Clear(temp); Printf(temp, "%s(", iname); - i = 0; - /* Print implicit parameters */ - for(p = il; p; p = nextSibling(p)) - Printv(temp, (i > 0 ? "," : ""), Getattr(p, "name"), NIL); - /* Now go through and print normal parameters */ + /* Now go through and print parameters */ p = l; + i = 0; while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); if (!checkAttribute(p,"tmap:in:numinputs","0")) { - if (i > 0) Append(temp, ","); /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { @@ -1103,8 +1059,16 @@ } } i++; + p = nextSibling(p); + if (p) + if (!checkAttribute(p,"tmap:in:numinputs","0")) + Putc(',', temp); + } else { + p = nextSibling(p); + if (p) + if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) + Putc(',', temp); } - p = nextSibling(p); } Printf(temp, ");"); return Char(temp); @@ -1222,8 +1186,6 @@ * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { - String *name = 0; /* Real name of C/C++ class */ - String *fullclassname = 0; if (blessed) { have_constructor = 0; @@ -1243,7 +1205,7 @@ } else { fullclassname = NewString(class_name); } - name = Getattr(n, "name"); + real_classname = Getattr(n, "name"); pcode = NewString(""); // blessedmembers = NewString(""); } @@ -1255,7 +1217,7 @@ /* Finish the rest of the class */ if (blessed) { /* Generate a client-data entry */ - SwigType *ct = NewStringf("p.%s", name); + SwigType *ct = NewStringf("p.%s", real_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct), ", (void*) \"", fullclassname, "\");\n", NIL); SwigType_remember(ct); Delete(ct); @@ -1528,15 +1490,6 @@ String *symname = Getattr(n, "sym:name"); - { - String *type = NewString("SV"); - SwigType_add_pointer(type); - Parm *p = NewParm(type, "proto"); - Delete(type); - Setattr(n, "perl5:implicits", p); - Delete(p); - } - member_func = 1; Language::constructorHandler(n); @@ -1548,17 +1501,18 @@ Delete(plaction); Printv(pcode, plcode, NIL); } else { - /* Emit a blessed constructor */ - String *cname = Swig_name_construct(symname); - char *pname; - /* override Class->Class to be Class->new */ - if (Cmp(symname, class_name) == 0) - pname = "new"; - else - pname = Char(cname); - Printf(pcode, "*%s = *%s::%s;\n", pname, cmodule, cname); - Delete(cname); + if ((Cmp(symname, class_name) == 0)) { + /* Emit a blessed constructor */ + Printf(pcode, "sub new {\n"); + } else { + /* Constructor doesn't match classname so we'll just use the normal name */ + Printv(pcode, "sub ", Swig_name_construct(symname), " () {\n", NIL); + } + Printv(pcode, + tab4, "my $pkg = shift;\n", + tab4, "my $self = ", cmodule, "::", Swig_name_construct(symname), "(@_);\n", tab4, "bless $self, $pkg if defined($self);\n", "}\n\n", NIL); + have_constructor = 1; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-09-01 20:32:55
|
Revision: 10804 http://swig.svn.sourceforge.net/swig/?rev=10804&view=rev Author: wsfulton Date: 2008-09-01 20:32:53 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Fix array bounds checking in C# std::vector wrappers Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/csharp/std_vector.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-01 20:00:28 UTC (rev 10803) +++ trunk/CHANGES.current 2008-09-01 20:32:53 UTC (rev 10804) @@ -1,6 +1,10 @@ Version 1.3.37 (in progress) ============================= +2008-09-01: wsfulton + [C#] Correct array bounds checking in std::vector typemaps - Insert and InsertRange + methods. + 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors Modified: trunk/Lib/csharp/std_vector.i =================================================================== --- trunk/Lib/csharp/std_vector.i 2008-09-01 20:00:28 UTC (rev 10803) +++ trunk/Lib/csharp/std_vector.i 2008-09-01 20:32:53 UTC (rev 10804) @@ -231,14 +231,14 @@ return new std::vector<CTYPE >(self->begin()+index, self->begin()+index+count); } void Insert(int index, const value_type& x) throw (std::out_of_range) { - if (index>=0 && index<(int)self->size()+1) + if (index>=0 && index<(int)self->size()) self->insert(self->begin()+index, x); else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.InsertRange void InsertRange(int index, const std::vector<CTYPE >& values) throw (std::out_of_range) { - if (index>=0 && index<(int)self->size()+1) + if (index>=0 && index<(int)self->size()) self->insert(self->begin()+index, values.begin(), values.end()); else throw std::out_of_range("index"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-09-01 21:46:43
|
Revision: 10807 http://swig.svn.sourceforge.net/swig/?rev=10807&view=rev Author: wsfulton Date: 2008-09-01 21:46:41 +0000 (Mon, 01 Sep 2008) Log Message: ----------- patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/cffi.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-01 20:42:40 UTC (rev 10806) +++ trunk/CHANGES.current 2008-09-01 21:46:41 UTC (rev 10807) @@ -2,6 +2,10 @@ ============================= 2008-09-01: wsfulton + [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into + no-eval context in DEFCENUM + +2008-09-01: wsfulton [C#] Correct array bounds checking in std::vector typemaps - Insert and InsertRange methods. Modified: trunk/Source/Modules/cffi.cxx =================================================================== --- trunk/Source/Modules/cffi.cxx 2008-09-01 20:42:40 UTC (rev 10806) +++ trunk/Source/Modules/cffi.cxx 2008-09-01 21:46:41 UTC (rev 10807) @@ -630,7 +630,7 @@ else { String *type = Getattr(c, "type"); String *converted_value = convert_literal(value, type); - Printf(f_cl, "\n\t(%s %s)", slot_name, converted_value); + Printf(f_cl, "\n\t(%s #.%s)", slot_name, converted_value); Delete(converted_value); } Delete(value); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-09-02 20:57:02
|
Revision: 10808 http://swig.svn.sourceforge.net/swig/?rev=10808&view=rev Author: wsfulton Date: 2008-09-02 20:56:52 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Add new terminator attribute for the csin typemap for C# Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/CSharp.html trunk/Examples/test-suite/csharp_prepost.i trunk/Source/Modules/csharp.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-01 21:46:41 UTC (rev 10807) +++ trunk/CHANGES.current 2008-09-02 20:56:52 UTC (rev 10808) @@ -1,6 +1,18 @@ Version 1.3.37 (in progress) ============================= +2008-09-02: wsfulton + [C#] Support for 'using' and 'fixed' blocks in the 'csin' typemap is now + possible through the use of the pre attribute and the new terminator attribute, eg + + %typemap(csin, + pre=" using (CDate temp$csinput = new CDate($csinput)) {", + terminator=" } // terminate temp$csinput using block", + ) const CDate & + "$csclassname.getCPtr(temp$csinput)" + + See CSharp.html for more info. + 2008-09-01: wsfulton [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM Modified: trunk/Doc/Manual/CSharp.html =================================================================== --- trunk/Doc/Manual/CSharp.html 2008-09-01 21:46:41 UTC (rev 10807) +++ trunk/Doc/Manual/CSharp.html 2008-09-02 20:56:52 UTC (rev 10808) @@ -1567,6 +1567,7 @@ <pre> class CDate { public: + CDate(); CDate(int year, int month, int day); int getYear(); int getMonth(); @@ -1649,8 +1650,8 @@ <pre> %typemap(cstype) const CDate& "System.DateTime" %typemap(csin, - pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);") - const CDate & + pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);" + ) const CDate & "$csclassname.getCPtr(temp$csinput)" %typemap(cstype) CDate& "out System.DateTime" @@ -1658,7 +1659,8 @@ pre=" CDate temp$csinput = new CDate();", post=" $csinput = new System.DateTime(temp$csinput.getYear()," " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", - cshin="out $csinput") CDate & + cshin="out $csinput" + ) CDate & "$csclassname.getCPtr(temp$csinput)" </pre> @@ -1763,7 +1765,8 @@ pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);", post=" $csinput = new System.DateTime(temp$csinput.getYear()," " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", - cshin="ref $csinput") CDate * + cshin="ref $csinput" + ) CDate * "$csclassname.getCPtr(temp$csinput)" </pre> </div> @@ -1788,6 +1791,50 @@ </pre> </div> +<p> +The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. +The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the <tt>using</tt> block. +The <tt>subtractYears</tt> method is nearly identical to the above <tt>addYears</tt> method. +</p> + +<div class="code"> +<pre> +%typemap(csin, + pre=" using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {", + post=" $csinput = new System.DateTime(temp$csinput.getYear()," + " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", + terminator=" } // terminate temp$csinput using block", + cshin="ref $csinput" + ) CDate * + "$csclassname.getCPtr(temp$csinput)" + +void subtractYears(CDate *pDate, int years) { + *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay()); +} +</pre> +</div> + +<p> +The resulting generated code shows the termination of the <tt>using</tt> block: +</p> + +<div class="code"> +<pre> +public class example { + public static void subtractYears(ref System.DateTime pDate, int years) { + using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) { + try { + examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years); + } finally { + pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(), 0, 0, 0); + } + } // terminate temppDate using block + } + ... +} +</pre> +</div> + <H3><a name="csharp_date_properties"></a>17.5.4 A date example demonstrating marshalling of C# properties</H3> @@ -1827,7 +1874,8 @@ pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);", post=" $csinput = new System.DateTime(temp$csinput.getYear()," " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", - cshin="ref $csinput") CDate * + cshin="ref $csinput" + ) CDate * "$csclassname.getCPtr(temp$csinput)" %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{ Modified: trunk/Examples/test-suite/csharp_prepost.i =================================================================== --- trunk/Examples/test-suite/csharp_prepost.i 2008-09-01 21:46:41 UTC (rev 10807) +++ trunk/Examples/test-suite/csharp_prepost.i 2008-09-02 20:56:52 UTC (rev 10808) @@ -1,6 +1,6 @@ %module csharp_prepost -// Test the pre, post and cshin attributes for csin typemaps +// Test the pre, post, terminate and cshin attributes for csin typemaps %include "std_vector.i" @@ -88,3 +88,102 @@ }; %} + + +// test Date marshalling with pre post and terminate typemap attributes (Documented in CSharp.html) +%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& "out 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="out $csinput" + ) CDate & + "$csclassname.getCPtr(temp$csinput)" + + +%inline %{ +class CDate { +public: + CDate(); + CDate(int year, int month, int day); + int getYear(); + int getMonth(); + int getDay(); +private: + int m_year; + int m_month; + int m_day; +}; +struct Action { + int doSomething(const CDate &dateIn, CDate &dateOut); + Action(const CDate &dateIn, CDate& dateOut); +}; +%} + +%{ +Action::Action(const CDate &dateIn, CDate& dateOut) {dateOut = dateIn;} +int Action::doSomething(const CDate &dateIn, CDate &dateOut) { dateOut = dateIn; return 0; } +CDate::CDate() : m_year(0), m_month(0), m_day(0) {} +CDate::CDate(int year, int month, int day) : m_year(year), m_month(month), m_day(day) {} +int CDate::getYear() { return m_year; } +int CDate::getMonth() { return m_month; } +int CDate::getDay() { return m_day; } +%} + +%typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime" + +%typemap(csin, + pre=" CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);", + 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)" + +%inline %{ +void addYears(CDate *pDate, int years) { + *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay()); +} +%} + +%typemap(csin, + pre=" using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {", + post=" $csinput = new System.DateTime(temp$csinput.getYear()," + " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);", + terminator=" } // terminate temp$csinput using block", + cshin="ref $csinput" + ) CDate * + "$csclassname.getCPtr(temp$csinput)" + +%inline %{ +void subtractYears(CDate *pDate, int years) { + *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay()); +} +%} + +%typemap(csvarin, excode=SWIGEXCODE2) CDate * %{ + /* csvarin typemap code */ + set { + CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day); + $imcall;$excode + } %} + +%typemap(csvarout, excode=SWIGEXCODE2) CDate * %{ + /* csvarout typemap code */ + get { + IntPtr cPtr = $imcall; + CDate tempDate = (cPtr == IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode + return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(), + 0, 0, 0); + } %} + +%inline %{ +CDate ImportantDate = CDate(1999, 12, 31); +%} + Modified: trunk/Source/Modules/csharp.cxx =================================================================== --- trunk/Source/Modules/csharp.cxx 2008-09-01 21:46:41 UTC (rev 10807) +++ trunk/Source/Modules/csharp.cxx 2008-09-02 20:56:52 UTC (rev 10808) @@ -1887,6 +1887,7 @@ bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); + String *terminator_code = NewString(""); if (!proxy_flag) return; @@ -2035,6 +2036,14 @@ Printf(post_code, "\n"); Printv(post_code, post, NIL); } + String *terminator = Getattr(p, "tmap:csin:terminator"); + if (terminator) { + substituteClassname(pt, terminator); + Replaceall(terminator, "$csinput", arg); + if (Len(terminator_code) > 0) + Insert(terminator_code, 0, "\n"); + Insert(terminator_code, 0, terminator); + } 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)); @@ -2060,7 +2069,8 @@ 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) { + bool is_terminator_code = Len(terminator_code) > 0; + if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); @@ -2072,6 +2082,9 @@ Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } + if (is_terminator_code) { + Printv(tm, "\n", terminator_code, NIL); + } Insert(tm, 0, "{"); Printf(tm, "\n }"); } @@ -2171,6 +2184,7 @@ Delete(pre_code); Delete(post_code); + Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); @@ -2191,6 +2205,7 @@ String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); + String *terminator_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); @@ -2286,6 +2301,14 @@ Printf(post_code, "\n"); Printv(post_code, post, NIL); } + String *terminator = Getattr(p, "tmap:csin:terminator"); + if (terminator) { + substituteClassname(pt, terminator); + Replaceall(terminator, "$csinput", arg); + if (Len(terminator_code) > 0) + Insert(terminator_code, 0, "\n"); + Insert(terminator_code, 0, terminator); + } cshin = Getattr(p, "tmap:csin:cshin"); if (cshin) Replaceall(cshin, "$csinput", arg); @@ -2342,7 +2365,8 @@ bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; - if (is_pre_code || is_post_code) { + bool is_terminator_code = Len(terminator_code) > 0; + if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); @@ -2354,6 +2378,9 @@ } else { Printv(helper_code, " return ", imcall, ";", NIL); } + if (is_terminator_code) { + Printv(helper_code, "\n", terminator_code, NIL); + } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); String *im_outattributes = Getattr(n, "tmap:imtype:outattributes"); @@ -2372,6 +2399,7 @@ Delete(im_return_type); Delete(pre_code); Delete(post_code); + Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); @@ -2489,6 +2517,7 @@ bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); + String *terminator_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { @@ -2593,6 +2622,14 @@ Printf(post_code, "\n"); Printv(post_code, post, NIL); } + String *terminator = Getattr(p, "tmap:csin:terminator"); + if (terminator) { + substituteClassname(pt, terminator); + Replaceall(terminator, "$csinput", arg); + if (Len(terminator_code) > 0) + Insert(terminator_code, 0, "\n"); + Insert(terminator_code, 0, terminator); + } 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)); @@ -2617,7 +2654,8 @@ 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) { + bool is_terminator_code = Len(terminator_code) > 0; + if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); @@ -2629,6 +2667,9 @@ Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } + if (is_terminator_code) { + Printv(tm, "\n", terminator_code, NIL); + } Insert(tm, 0, "{"); Printf(tm, "\n }"); } @@ -2704,6 +2745,7 @@ Delete(pre_code); Delete(post_code); + Delete(terminator_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...> - 2008-09-02 23:01:45
|
Revision: 10809 http://swig.svn.sourceforge.net/swig/?rev=10809&view=rev Author: wsfulton Date: 2008-09-02 23:01:37 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Fix #1988296 - Multiple module director linking issue Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/python/director.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-02 20:56:52 UTC (rev 10808) +++ trunk/CHANGES.current 2008-09-02 23:01:37 UTC (rev 10809) @@ -2,6 +2,10 @@ ============================= 2008-09-02: wsfulton + [Python] Commit patch #1988296 GCItem multiple module linking issue when using + directors. + +2008-09-02: wsfulton [C#] Support for 'using' and 'fixed' blocks in the 'csin' typemap is now possible through the use of the pre attribute and the new terminator attribute, eg Modified: trunk/Lib/python/director.swg =================================================================== --- trunk/Lib/python/director.swg 2008-09-02 20:56:52 UTC (rev 10808) +++ trunk/Lib/python/director.swg 2008-09-02 23:01:37 UTC (rev 10809) @@ -107,7 +107,7 @@ /* memory handler */ struct GCItem { - virtual ~GCItem() = 0; + virtual ~GCItem() {} virtual int get_own() const { @@ -115,10 +115,6 @@ } }; - GCItem::~GCItem() - { - } - struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ric...@us...> - 2008-09-10 10:08:24
|
Revision: 10827 http://swig.svn.sourceforge.net/swig/?rev=10827&view=rev Author: richardb Date: 2008-09-10 10:08:21 +0000 (Wed, 10 Sep 2008) Log Message: ----------- [Python] Commit patch #2089149: Director exception handling mangles returned exception. Exceptions raised by Python code in directors are now passed through to the caller without change. Also, remove the ": " prefix which used to be added to other director exceptions (eg, those due to incorrect return types). Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/python/director_exception_runme.py trunk/Lib/python/director.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-08 21:29:02 UTC (rev 10826) +++ trunk/CHANGES.current 2008-09-10 10:08:21 UTC (rev 10827) @@ -2,6 +2,13 @@ ============================= 2008-09-02: wsfulton + [Python] Commit patch #2089149: Director exception handling mangles + returned exception. Exceptions raised by Python code in directors + are now passed through to the caller without change. Also, remove + the ": " prefix which used to be added to other director exceptions + (eg, those due to incorrect return types). + +2008-09-02: wsfulton [Python] Commit patch #1988296 GCItem multiple module linking issue when using directors. Modified: trunk/Examples/test-suite/python/director_exception_runme.py =================================================================== --- trunk/Examples/test-suite/python/director_exception_runme.py 2008-09-08 21:29:02 UTC (rev 10826) +++ trunk/Examples/test-suite/python/director_exception_runme.py 2008-09-10 10:08:21 UTC (rev 10827) @@ -1,45 +1,72 @@ from director_exception import * from exceptions import * +class MyException(Exception): + def __init__(self, a, b): + self.msg = a + b + class MyFoo(Foo): def ping(self): raise NotImplementedError, "MyFoo::ping() EXCEPTION" class MyFoo2(Foo): def ping(self): - return true + return True pass # error: should return a string +class MyFoo3(Foo): + def ping(self): + raise MyException("foo", "bar") + +# Check that the NotImplementedError raised by MyFoo.ping() is returned by +# MyFoo.pong(). ok = 0 - a = MyFoo() b = launder(a) - try: b.pong() except NotImplementedError, e: - ok = 1 + if str(e) == "MyFoo::ping() EXCEPTION": + ok = 1 + else: + print "Unexpected error message: %s" % str(e) except: pass - if not ok: raise RuntimeError + +# Check that the director returns the appropriate TypeError if the return type +# is wrong. ok = 0 - a = MyFoo2() b = launder(a) - try: b.pong() -except: - ok = 1 +except TypeError, e: + if str(e) == "Swig director type mismatch in output value of type 'std::string'": + ok = 1 + else: + print "Unexpected error message: %s" % str(e) +if not ok: + raise RuntimeError +# Check that the director can return an exception which requires two arguments +# to the constructor, without mangling it. +ok = 0 +a = MyFoo3() +b = launder(a) +try: + b.pong() +except MyException, e: + if e.msg == 'foobar': + ok = 1 + else: + print "Unexpected error message: %s" % str(e) if not ok: raise RuntimeError - try: raise Exception2() except Exception2: Modified: trunk/Lib/python/director.swg =================================================================== --- trunk/Lib/python/director.swg 2008-09-08 21:29:02 UTC (rev 10826) +++ trunk/Lib/python/director.swg 2008-09-10 10:08:21 UTC (rev 10827) @@ -208,10 +208,7 @@ swig_msg += msg; } if (!PyErr_Occurred()) { - swig_msg.insert(0, ": "); PyErr_SetString(error, getMessage()); - } else { - SWIG_Python_AddErrorMsg(getMessage()); } SWIG_PYTHON_THREAD_END_BLOCK; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bh...@us...> - 2008-09-11 17:18:14
|
Revision: 10834 http://swig.svn.sourceforge.net/swig/?rev=10834&view=rev Author: bhy Date: 2008-09-11 17:18:07 +0000 (Thu, 11 Sep 2008) Log Message: ----------- Merged the Python 3.0 support branch. The merging progress is not so smooth, so hope this commit won't make anything broken. This is the (incomplemete) log produced by svnmerge.py: Merged revisions 10405-10409,10420-10422,10426,10438,10445,10451,10454-10465,10467,10473-10475,10485,10488-10489,10493-10495,10497,10509-10510,10513-10514,10517,10520,10525,10528-10529,10533-10535,10554-10557,10570,10573,10593,10614,10666-10669,10673,10678,10687,10690,10704-10706,10731,10744,10750-10752,10755,10759,10770,10775-10776,10813,10819 via svnmerge from https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2008-bhy Modified Paths: -------------- trunk/Doc/Manual/Python.html trunk/Examples/GIFPlot/Python/full/Makefile trunk/Examples/GIFPlot/Python/shadow/Makefile trunk/Examples/GIFPlot/Python/simple/Makefile trunk/Examples/Makefile.in trunk/Examples/python/callback/Makefile trunk/Examples/python/class/Makefile trunk/Examples/python/constants/Makefile trunk/Examples/python/contract/Makefile trunk/Examples/python/docstrings/Makefile trunk/Examples/python/enum/Makefile trunk/Examples/python/exception/Makefile trunk/Examples/python/exceptproxy/Makefile trunk/Examples/python/extend/Makefile trunk/Examples/python/funcptr/Makefile trunk/Examples/python/funcptr2/Makefile trunk/Examples/python/functor/Makefile trunk/Examples/python/import/Makefile trunk/Examples/python/import_template/Makefile trunk/Examples/python/libffi/Makefile trunk/Examples/python/multimap/Makefile trunk/Examples/python/multimap/example.i trunk/Examples/python/operator/Makefile trunk/Examples/python/pointer/Makefile trunk/Examples/python/reference/Makefile trunk/Examples/python/simple/Makefile trunk/Examples/python/smartptr/Makefile trunk/Examples/python/std_map/Makefile trunk/Examples/python/std_vector/Makefile trunk/Examples/python/swigrun/Makefile trunk/Examples/python/template/Makefile trunk/Examples/python/varargs/Makefile trunk/Examples/python/variables/Makefile trunk/Examples/python/weave/Makefile trunk/Examples/test-suite/common.mk trunk/Examples/test-suite/li_cstring.i trunk/Examples/test-suite/li_cwstring.i trunk/Examples/test-suite/name_warnings.i trunk/Examples/test-suite/namespace_typemap.i trunk/Examples/test-suite/python/Makefile.in trunk/Examples/test-suite/python/README trunk/Examples/test-suite/python/cpp_namespace_runme.py trunk/Examples/test-suite/python/director_classic_runme.py trunk/Examples/test-suite/python/director_exception_runme.py trunk/Examples/test-suite/python/file_test_runme.py trunk/Examples/test-suite/python/hugemod.pl trunk/Examples/test-suite/python/template_typedef_cplx2_runme.py trunk/Examples/test-suite/python/template_typedef_cplx_runme.py trunk/Lib/python/file.i trunk/Lib/python/pyapi.swg trunk/Lib/python/pycontainer.swg trunk/Lib/python/pyerrors.swg trunk/Lib/python/pyhead.swg trunk/Lib/python/pyinit.swg trunk/Lib/python/pyiterators.swg trunk/Lib/python/pyopers.swg trunk/Lib/python/pyrun.swg trunk/Lib/python/pystrings.swg trunk/Lib/python/pywstrings.swg trunk/Lib/python/std_map.i trunk/Source/CParse/cscanner.c trunk/Source/CParse/parser.y trunk/Source/Modules/python.cxx trunk/configure.in Added Paths: ----------- trunk/Examples/test-suite/operbool.i trunk/Examples/test-suite/python/abstractbase.i trunk/Examples/test-suite/python/abstractbase_runme3.py trunk/Examples/test-suite/python/operbool_runme.py trunk/Examples/test-suite/python/pybuf.i trunk/Examples/test-suite/python/pybuf_benchmark.i trunk/Examples/test-suite/python/pybuf_benchmark_runme.py trunk/Examples/test-suite/python/pybuf_benchmark_runme3.py trunk/Examples/test-suite/python/pybuf_runme3.py trunk/Lib/python/pyabc.i trunk/Lib/python/pybuffer.i Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Modified: svnmerge-integrated - /branches/gsoc2008-bhy:1-10404 + /branches/gsoc2008-bhy:1-10819 Modified: trunk/Doc/Manual/Python.html =================================================================== --- trunk/Doc/Manual/Python.html 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Doc/Manual/Python.html 2008-09-11 17:18:07 UTC (rev 10834) @@ -46,7 +46,7 @@ <li><a href="#Python_nn30">Memory management</a> <li><a href="#Python_nn31">Python 2.2 and classic classes</a> </ul> -<li><a href="#directors">Cross language polymorphism</a> +<li><a href="#Python_directors">Cross language polymorphism</a> <ul> <li><a href="#Python_nn33">Enabling directors</a> <li><a href="#Python_nn34">Director classes</a> @@ -101,7 +101,13 @@ <li><a href="#Python_nn71">%feature("docstring")</a> </ul> <li><a href="#Python_nn72">Python Packages</a> +<li><a href="#Python_python3support">Python 3 Support</a> +<ul> +<li><a href="#Python_nn74">Function annotation</a> +<li><a href="#Python_nn75">Buffer interface</a> +<li><a href="#Python_nn76">Abstract base classes</a> </ul> +</ul> </div> <!-- INDEX --> @@ -113,9 +119,9 @@ <p> This chapter describes SWIG's support of Python. SWIG is compatible -with most recent Python versions including Python 2.2 as well as older -versions dating back to Python 1.5.2. For the best results, consider using Python -2.0 or newer. +with most recent Python versions including Python 3.0 and Python 2.6, +as well as older versions dating back to Python 2.0. For the best results, +consider using Python 2.3 or newer. </p> <p> @@ -2544,7 +2550,7 @@ function or through an instance (see the earlier section). </p> -<H2><a name="directors"></a>30.5 Cross language polymorphism</H2> +<H2><a name="Python_directors"></a>30.5 Cross language polymorphism</H2> <p> @@ -4929,7 +4935,7 @@ <p> Using the <tt>package</tt> option of the <tt>%module</tt> directive allows you to specify what Python package that the module will be -living in when installed. +living in when installed. </p> <div class="code"> @@ -4950,7 +4956,242 @@ different than its own. </p> +<H2><a name="Python_python3support"></a>30.12 Python 3 Support</H2> + +<p> +SWIG is able to support Python 3.0. The wrapper code generated by +SWIG can be compiled with both Python 2.x or 3.0. Further more, by +passing the <tt>-py3</tt> command line option to SWIG, wrapper code +with some Python 3 specific features can be generated (see below +subsections for details of these features). The <tt>-py3</tt> option also +disables some incompatible features for Python 3, such as +<tt>-classic</tt>. + +<p> +There is a list of known-to-be-broken features in Python 3: +</p> +<ul> + <li>No more support for FILE* typemaps, because PyFile_AsFile has been dropped + in Python 3.</li> + <li>The <tt>-apply</tt> command line option is removed and generating + code using apply() is no longer supported.</li> +</ul> + +<p> +The following are Python 3.0 new features that are currently supported by +SWIG. +</p> + +<H3><a name="Python_nn74"></a>30.12.1 Function annotation</H3> + + +<p> +The <tt>-py3</tt> option will enable function annotation support. When used +SWIG is able to generate proxy method definitions like +this: +</p> + +<div class="code"><pre> + def foo(self, bar : "int" = 0) -> "void" : ... +</pre></div> + +<p> +For details of usage of function annotation, see PEP 3107. +</p> + +<H3><a name="Python_nn75"></a>30.12.2 Buffer interface</H3> + + +<p> +Buffer protocols were revised in Python 3. SWIG also gains a series of +new typemaps to support buffer interfaces. These typemap macros are +defined in <tt>pybuffer.i</tt>, which must be included in order to use them. +By using these typemaps, your wrapped function will be able to +accept any Python object that exposes a suitable buffer interface. +</p> + +<p> +For example, the <tt>get_path()</tt> function puts the path string +into the memory pointed to by its argument: +</p> + +<div class="code"><pre> +void get_path(char *s); +</pre></div> + +<p> +Then you can write a typemap like this: (the following example is +applied to both Python 3.0 and 2.6, since the <tt>bytearray</tt> type +is backported to 2.6. +</p> + + +<div class="code"><pre> +%include <pybuffer.i> +%pybuffer_mutable_string(char *str); +void get_path(char *s); +</pre></div> + +<p> +And then on the Python side the wrapped <tt>get_path</tt> could be used in this +way: +</p> + +<div class="targetlang"><pre> +>>> p = bytearray(10) +>>> get_path(p) +>>> print(p) +bytearray(b'/Foo/Bar/\x00') +</pre></div> + +<p> +The macros defined in <tt>pybuffer.i</tt> are similar to those in +<tt>cstring.i</tt>: +</p> + +<p> +<b>%pybuffer_mutable_binary(parm, size_parm)</b> +</p> + +<div class="indent"> + +<p> +The macro can be used to generate a typemap which maps a buffer of an +object to a pointer provided by <tt>parm</tt> and a size argument +provided by <tt>size_parm</tt>. For example: +</p> + +<div class="code"><pre> +%pybuffer_mutable_binary(char *str, size_t size); +... +int snprintf(char *str, size_t size, const char *format, ...); +</pre></div> + +<p> +In Python: +</p> + +<div class="targetlang"><pre> +>>> buf = bytearray(6) +>>> snprintf(buf, "Hello world!") +>>> print(buf) +bytearray(b'Hello\x00') +>>> +</pre></div> + +</div> + +<p> +<b>%pybuffer_mutable_string(parm)</b> +</p> + +<div class="indent"> + +<p> +This typemap macro requires the buffer to be a zero terminated string, +and maps the pointer of the buffer to <tt>parm</tt>. For example: +</p> + +<div class="code"><pre> +%pybuffer_mutable_string(char *str); +... +size_t make_upper(char *str); +</pre></div> + +<p> +In Python: +</p> + +<div class="targetlang"><pre> +>>> buf = bytearray(b'foo\x00') +>>> make_upper(buf) +>>> print(buf) +bytearray(b'FOO\x00') +>>> +</pre></div> + +<p> +Both <tt>%pybuffer_mutable_binary</tt> and <tt>%pybuffer_mutable_string</tt> +require the provided buffer to be mutable, eg. they can accept a +<tt>bytearray</tt> type but can't accept an immutable <tt>byte</tt> +type. +</p> + +</div> + +<p> +<b>%pybuffer_binary(parm, size_parm)</b> +</p> + +<div class="indent"> + +<p> +This macro maps an object's buffer to a pointer <tt>parm</tt> and a +size <tt>size_parm</tt>. It is similar to +<tt>%pybuffer_mutable_binary</tt>, except the +<tt>%pybuffer_binary</tt> an accept both mutable and immutable +buffers. As a result, the wrapped function should not modify the buffer. +</p> + +</div> + +<p> +<b>%pybuffer_string(parm)</b> +</p> + +<div class="indent"> + +<p> +This macro maps an object's buffer as a string pointer <tt>parm</tt>. +It is similar to <tt>%pybuffer_mutable_string</tt> but the buffer +could be both mutable and immutable. And your function should not +modify the buffer. +</p> + +</div> + + +<H3><a name="Python_nn76"></a>30.12.3 Abstract base classes</H3> + + +<p> +By including <tt>pyabc.i</tt> and using the <tt>-py3</tt> command +line option when calling SWIG, the proxy classes of the STL containers +will automatically gain an appropriate abstract base class. For +example, the following SWIG interface: +</p> + +<div class="code"><pre> +%include <pyabc.i> +%include <std_map.i> +%include <std_list.i> + +namespace std { + %template(Mapii) map<int, int>; + %template(IntList) list<int>; +} +</pre></div> + +<p> +will generate a Python proxy class <tt>Mapii</tt> inheriting from +<tt>collections.MutableMap</tt> and a proxy class <tt>IntList</tt> +inheriting from <tt>collections.MutableSequence</tt>. +</p> + +<p> +<tt>pyabc.i</tt> also provides a macro <tt>%pythonabc</tt> that could be +used to define an abstract base class for your own C++ class: +</p> + +<div class="code"><pre> +%pythonabc(MySet, collections.MutableSet); +</pre></div> + +<p> +For details of abstract base class, please see PEP 3119. +</p> + </body> </html> Modified: trunk/Examples/GIFPlot/Python/full/Makefile =================================================================== --- trunk/Examples/GIFPlot/Python/full/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/GIFPlot/Python/full/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,5 +1,5 @@ TOP = ../../.. -SWIG = $(TOP)/../swig +SWIG = $(TOP)/../preinst-swig SWIGOPT = -I../../Include SRCS = TARGET = gifplot @@ -23,3 +23,4 @@ rm -f *.gif check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/GIFPlot/Python/shadow/Makefile =================================================================== --- trunk/Examples/GIFPlot/Python/shadow/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/GIFPlot/Python/shadow/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,5 +1,5 @@ TOP = ../../.. -SWIG = $(TOP)/../swig +SWIG = $(TOP)/../preinst-swig SWIGOPT = -I../../Interface SRCS = TARGET = gifplot @@ -23,3 +23,4 @@ rm -f *.gif check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/GIFPlot/Python/simple/Makefile =================================================================== --- trunk/Examples/GIFPlot/Python/simple/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/GIFPlot/Python/simple/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,5 +1,5 @@ TOP = ../../.. -SWIG = $(TOP)/../swig +SWIG = $(TOP)/../preinst-swig SWIGOPT = SRCS = TARGET = simple @@ -23,3 +23,4 @@ rm -f *.gif check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/Makefile.in 2008-09-11 17:18:07 UTC (rev 10834) @@ -223,19 +223,39 @@ ################################################################## # Make sure these locate your Python installation -PYTHON_INCLUDE= $(DEFS) @PYINCLUDE@ -PYTHON_LIB = @PYLIB@ +ifeq (,$(PY3)) + PYTHON_INCLUDE= $(DEFS) @PYINCLUDE@ + PYTHON_LIB = @PYLIB@ + PYTHON = @PYTHON@ +else + PYTHON_INCLUDE= $(DEFS) @PY3INCLUDE@ + PYTHON_LIB = @PY3LIB@ + PYTHON = @PYTHON3@ +endif -# Extra Python specific dynamic linking options -PYTHON_DLNK = @PYTHONDYNAMICLINKING@ +# Extra Python specific linking options +ifeq (,$(PY3)) + PYTHON_DLNK = @PYTHONDYNAMICLINKING@ + PYTHON_LINK = @PYLINK@ +else + PYTHON_DLNK = @PYTHON3DYNAMICLINKING@ + PYTHON_LINK = @PY3LINK@ +endif PYTHON_SO = @PYTHON_SO@ +# SWIG option for Python +ifeq (,$(PY3)) + SWIGPYTHON = $(SWIG) -python +else + SWIGPYTHON = $(SWIG) -python -py3 +endif + # ---------------------------------------------------------------- # Build a C dynamically loadable module # ---------------------------------------------------------------- python: $(SRCS) - $(SWIG) -python $(SWIGOPT) $(INTERFACE) + $(SWIGPYTHON) $(SWIGOPT) $(INTERFACE) $(CC) -c $(CCSHARED) $(CFLAGS) $(ISRCS) $(SRCS) $(INCLUDES) $(PYTHON_INCLUDE) $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(PYTHON_DLNK) $(LIBS) -o $(LIBPREFIX)_$(TARGET)$(PYTHON_SO) @@ -244,7 +264,7 @@ # ----------------------------------------------------------------- python_cpp: $(SRCS) - $(SWIG) -c++ -python $(SWIGOPT) $(INTERFACE) + $(SWIGPYTHON) -c++ $(SWIGOPT) $(INTERFACE) $(CXX) -c $(CCSHARED) $(CFLAGS) $(ICXXSRCS) $(SRCS) $(CXXSRCS) $(INCLUDES) $(PYTHON_INCLUDE) $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(PYTHON_DLNK) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)_$(TARGET)$(PYTHON_SO) @@ -257,18 +277,37 @@ #TKINTER = -L/usr/X11R6.3/lib -L/usr/local/compat/lib -ltk4.0 -ltcl7.4 -lX11 TKINTER = -PYTHON_LIBOPTS = @PYLINK@ @LIBS@ $(TKINTER) $(SYSLIBS) +PYTHON_LIBOPTS = $(PYTHON_LINK) @LIBS@ $(TKINTER) $(SYSLIBS) python_static: $(SRCS) - $(SWIG) -python -lembed.i $(SWIGOPT) $(INTERFACE) + $(SWIGPYTHON) -lembed.i $(SWIGOPT) $(INTERFACE) $(CC) $(CFLAGS) @LINKFORSHARED@ $(ISRCS) $(SRCS) $(INCLUDES) \ $(PYTHON_INCLUDE) $(LIBS) -L$(PYTHON_LIB) $(PYTHON_LIBOPTS) -o $(TARGET) python_static_cpp: $(SRCS) - $(SWIG) -c++ -python -lembed.i $(SWIGOPT) $(INTERFACE) + $(SWIGPYTHON) -c++ -lembed.i $(SWIGOPT) $(INTERFACE) $(CXX) $(CFLAGS) $(ICXXSRCS) $(SRCS) $(CXXSRCS) $(INCLUDES) \ $(PYTHON_INCLUDE) $(LIBS) -L$(PYTHON_LIB) $(PYTHON_LIBOPTS) -o $(TARGET) +# ----------------------------------------------------------------- +# Running a Python example +# ----------------------------------------------------------------- + +ifeq (,$(PY3)) + SCRIPT = runme.py +else + SCRIPT = runme3.py +endif + +PY2TO3 = 2to3 `2to3 -l | grep -v -E "Available|import$$" | awk '{print "-f "$$0}'` + +python_run: $(SCRIPT) + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=$(srcdir):$$PYTHONPATH $(PYTHON) $(SCRIPT) >/dev/null + +runme3.py: runme.py + cp $< $@ + $(PY2TO3) -w $@ >/dev/null 2>&1 + # ----------------------------------------------------------------- # Cleaning the python examples # ----------------------------------------------------------------- @@ -278,6 +317,7 @@ rm -f core @EXTRA_CLEAN@ rm -f *.@OBJEXT@ *@SO@ *@PYTHON_SO@ + ################################################################## ##### OCTAVE ###### ################################################################## Modified: trunk/Examples/python/callback/Makefile =================================================================== --- trunk/Examples/python/callback/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/callback/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/class/Makefile =================================================================== --- trunk/Examples/python/class/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/class/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -18,3 +18,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/constants/Makefile =================================================================== --- trunk/Examples/python/constants/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/constants/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/contract/Makefile =================================================================== --- trunk/Examples/python/contract/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/contract/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/docstrings/Makefile =================================================================== --- trunk/Examples/python/docstrings/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/docstrings/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -21,3 +21,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/enum/Makefile =================================================================== --- trunk/Examples/python/enum/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/enum/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -18,3 +18,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/exception/Makefile =================================================================== --- trunk/Examples/python/exception/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/exception/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -18,3 +18,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/exceptproxy/Makefile =================================================================== --- trunk/Examples/python/exceptproxy/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/exceptproxy/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/extend/Makefile =================================================================== --- trunk/Examples/python/extend/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/extend/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/funcptr/Makefile =================================================================== --- trunk/Examples/python/funcptr/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/funcptr/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/funcptr2/Makefile =================================================================== --- trunk/Examples/python/funcptr2/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/funcptr2/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/functor/Makefile =================================================================== --- trunk/Examples/python/functor/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/functor/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/import/Makefile =================================================================== --- trunk/Examples/python/import/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/import/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ @rm -f foo.py bar.py spam.py base.py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/import_template/Makefile =================================================================== --- trunk/Examples/python/import_template/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/import_template/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ @rm -f foo.py bar.py spam.py base.py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/libffi/Makefile =================================================================== --- trunk/Examples/python/libffi/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/libffi/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/multimap/Makefile =================================================================== --- trunk/Examples/python/multimap/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/multimap/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/multimap/example.i =================================================================== --- trunk/Examples/python/multimap/example.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/multimap/example.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,6 +17,7 @@ %typemap(in,fragment="t_output_helper") (int argc, char *argv[]) { int i; + int l; if (!PyList_Check($input)) { SWIG_exception(SWIG_ValueError, "Expecting a list"); } @@ -27,11 +28,21 @@ $2 = (char **) malloc(($1+1)*sizeof(char *)); for (i = 0; i < $1; i++) { PyObject *s = PyList_GetItem($input,i); - if (!PyString_Check(s)) { +%#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check(s)) +%#else + if (!PyString_Check(s)) +%#endif + { free($2); SWIG_exception(SWIG_ValueError, "List items must be strings"); } +%#if PY_VERSION_HEX >= 0x03000000 + $2[i] = PyUnicode_AsStringAndSize(s, &l); +%#else $2[i] = PyString_AsString(s); +%#endif + } $2[i] = 0; } @@ -39,12 +50,21 @@ extern int gcdmain(int argc, char *argv[]); %typemap(in) (char *bytes, int len) { + +%#if PY_VERSION_HEX >= 0x03000000 + if (!PyUnicode_Check($input)) { + PyErr_SetString(PyExc_ValueError,"Expected a string"); + return NULL; + } + $1 = PyUnicode_AsStringAndSize($input, &$2); +%#else if (!PyString_Check($input)) { PyErr_SetString(PyExc_ValueError,"Expected a string"); return NULL; } $1 = PyString_AsString($input); $2 = PyString_Size($input); +%#endif } extern int count(char *bytes, int len, char c); @@ -56,9 +76,15 @@ so that we don't violate it's mutability */ %typemap(in) (char *str, int len) { +%#if PY_VERSION_HEX >= 0x03000000 + $2 = PyUnicode_GetSize($input); + $1 = (char *) malloc($2+1); + memmove($1,PyUnicode_AsString($input),$2); +%#else $2 = PyString_Size($input); $1 = (char *) malloc($2+1); memmove($1,PyString_AsString($input),$2); +%#endif } /* Return the mutated string as a new object. The t_output_helper @@ -67,7 +93,11 @@ %typemap(argout) (char *str, int len) { PyObject *o; +%#if PY_VERSION_HEX >= 0x03000000 + o = PyUnicode_FromStringAndSize($1,$2); +%#else o = PyString_FromStringAndSize($1,$2); +%#endif $result = t_output_helper($result,o); free($1); } Modified: trunk/Examples/python/operator/Makefile =================================================================== --- trunk/Examples/python/operator/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/operator/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/pointer/Makefile =================================================================== --- trunk/Examples/python/pointer/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/pointer/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/reference/Makefile =================================================================== --- trunk/Examples/python/reference/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/reference/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -18,3 +18,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/simple/Makefile =================================================================== --- trunk/Examples/python/simple/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/simple/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/smartptr/Makefile =================================================================== --- trunk/Examples/python/smartptr/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/smartptr/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/std_map/Makefile =================================================================== --- trunk/Examples/python/std_map/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/std_map/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -22,3 +22,4 @@ python runme.py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/std_vector/Makefile =================================================================== --- trunk/Examples/python/std_vector/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/std_vector/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/swigrun/Makefile =================================================================== --- trunk/Examples/python/swigrun/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/swigrun/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -22,3 +22,4 @@ check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/template/Makefile =================================================================== --- trunk/Examples/python/template/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/template/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/varargs/Makefile =================================================================== --- trunk/Examples/python/varargs/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/varargs/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/variables/Makefile =================================================================== --- trunk/Examples/python/variables/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/variables/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -17,3 +17,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/python/weave/Makefile =================================================================== --- trunk/Examples/python/weave/Makefile 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/python/weave/Makefile 2008-09-11 17:18:07 UTC (rev 10834) @@ -19,3 +19,4 @@ rm -f $(TARGET).py check: all + $(MAKE) -f $(TOP)/Makefile python_run Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/common.mk 2008-09-11 17:18:07 UTC (rev 10834) @@ -237,6 +237,7 @@ null_pointer \ operator_overload \ operator_overload_break \ + operbool \ ordering \ overload_copy \ overload_extend \ Modified: trunk/Examples/test-suite/li_cstring.i =================================================================== --- trunk/Examples/test-suite/li_cstring.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/li_cstring.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -4,7 +4,7 @@ #ifndef SWIG_CSTRING_UNIMPL -%cstring_input_binary(char *in, int n); +%cstring_input_binary(char *str_in, int n); %cstring_bounded_output(char *out1, 512); %cstring_chunk_output(char *out2, 64); %cstring_bounded_mutable(char *out3, 512); @@ -22,13 +22,13 @@ %inline %{ -int count(char *in, int n, char c) { +int count(char *str_in, int n, char c) { int r = 0; while (n > 0) { - if (*in == c) { + if (*str_in == c) { r++; } - in++; + str_in++; --n; } return r; Modified: trunk/Examples/test-suite/li_cwstring.i =================================================================== --- trunk/Examples/test-suite/li_cwstring.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/li_cwstring.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -4,7 +4,7 @@ #ifndef SWIG_CWSTRING_UNIMPL -%cwstring_input_binary(wchar_t *in, int n); +%cwstring_input_binary(wchar_t *str_in, int n); %cwstring_bounded_output(wchar_t *out1, 512); %cwstring_chunk_output(wchar_t *out2, 64); %cwstring_bounded_mutable(wchar_t *out3, 512); @@ -22,13 +22,13 @@ %inline %{ -int count(wchar_t *in, int n, wchar_t c) { +int count(wchar_t *str_in, int n, wchar_t c) { int r = 0; while (n > 0) { - if (*in == c) { + if (*str_in == c) { r++; } - in++; + str_in++; --n; } return r; Modified: trunk/Examples/test-suite/name_warnings.i =================================================================== --- trunk/Examples/test-suite/name_warnings.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/name_warnings.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -58,13 +58,12 @@ %template(max_i) max<int>; - %inline { /* silently rename the parameter names in csharp/java */ #ifdef SWIGR double foo(double inparam, double out) { return 1.0; } #else - double foo(double in, double out) { return 1.0; } + double foo(double abstract, double out) { return 1.0; } #endif double bar(double native, bool boolean) { return 1.0; } } Modified: trunk/Examples/test-suite/namespace_typemap.i =================================================================== --- trunk/Examples/test-suite/namespace_typemap.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/namespace_typemap.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -75,7 +75,7 @@ class string_class; #ifdef SWIGPYTHON %typemap(in) string_class * { - $1 = new string_class(PyString_AsString($input)); + $1 = new string_class(SWIG_Python_str_AsChar($input)); } %typemap(freearg) string_class * { delete $1; Added: trunk/Examples/test-suite/operbool.i =================================================================== --- trunk/Examples/test-suite/operbool.i (rev 0) +++ trunk/Examples/test-suite/operbool.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,10 @@ +%module operbool + +%inline %{ + class Test { + public: + operator bool() { + return false; + } + }; +%} Modified: trunk/Examples/test-suite/python/Makefile.in =================================================================== --- trunk/Examples/test-suite/python/Makefile.in 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/Makefile.in 2008-09-11 17:18:07 UTC (rev 10834) @@ -2,14 +2,41 @@ # Makefile for python test-suite ####################################################################### +ifeq (,$(PY3)) + PYBIN = @PYTHON@ +else + PYBIN = @PYTHON3@ +endif + LANGUAGE = python -PYTHON = @PYTHON@ -SCRIPTSUFFIX = _runme.py +ifneq (,$(USE_VALGRIND)) + PYTHON = valgrind --leak-check=full --suppressions=pyswig.supp $(PYBIN) +else + PYTHON = $(PYBIN) +endif + +#*_runme.py for Python 2.x, *_runme3.py for Python 3.x +PY2SCRIPTSUFFIX = _runme.py +PY3SCRIPTSUFFIX = _runme3.py + +ifeq (,$(PY3)) + SCRIPTSUFFIX = $(PY2SCRIPTSUFFIX) +else + SCRIPTSUFFIX = $(PY3SCRIPTSUFFIX) +endif + srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ + +#Use the tricky command because we want to disable the "import" fixer, +#but currently 2to3 has no option to let us do it +PY2TO3 = 2to3 `2to3 -l | grep -v -E "Available|import$$" | awk '{print "-f "$$0}'` + + CPP_TEST_CASES += \ + abstractbase \ argcargvtest \ autodoc \ callback \ @@ -77,13 +104,36 @@ +$(swig_and_compile_multi_cpp) $(run_testcase) + +# Call 2to3 to generate Python 3.x test from the Python 2.x's *_runme.py file +%$(PY3SCRIPTSUFFIX): %$(PY2SCRIPTSUFFIX) + cp $< $@ + $(PY2TO3) -w $@ >/dev/null 2>&1 + + # Runs the testcase. A testcase is only run if -# a file is found which has _runme.py appended after the testcase name. +# a file is found which has _runme.py (or _runme3.py for Python 3) appended after the testcase name. + +run_python = env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=$(srcdir):$$PYTHONPATH $(RUNTOOL) $(PYTHON) $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) + +ifeq (,$(PY3)) run_testcase = \ if [ -f $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then ( \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=$(srcdir):$$PYTHONPATH $(RUNTOOL) $(PYTHON) $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX);) \ + $(run_python);)\ fi; +else +py2_runme = $(srcdir)/$(SCRIPTPREFIX)$*$(PY2SCRIPTSUFFIX) +py3_runme = $(srcdir)/$(SCRIPTPREFIX)$*$(PY3SCRIPTSUFFIX) +run_testcase = \ + if [ -f $(py2_runme) ]; then ( \ + $(MAKE) -f $(srcdir)/Makefile $(py3_runme) && \ + $(run_python);) \ + elif [ -f $(py3_runme)]; then ( \ + $(run_python);) \ + fi; +endif + # Clean: remove the generated .py file %.clean: @rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py @@ -101,14 +151,15 @@ @echo clientdata_prop_b.py @echo imports_a.py @echo imports_b.py - @echo mod_a.py mod_b.py + @echo mod_a.py mod_b.py @echo hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py @echo template_typedef_import.py +hugemod_runme = hugemod$(SCRIPTPREFIX) hugemod: - perl hugemod.pl + perl hugemod.pl $(hugemod_runme) $(MAKE) hugemod_a.cpptest $(MAKE) hugemod_b.cpptest - time $(PYTHON) hugemod_runme.py - time $(PYTHON) hugemod_runme.py + sh -c "time $(PYTHON) $(hugemod_runme)" + sh -c "time $(PYTHON) $(hugemod_runme)" Modified: trunk/Examples/test-suite/python/README =================================================================== --- trunk/Examples/test-suite/python/README 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/README 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,4 +1,8 @@ See ../README for common README file. -Any testcases which have _runme.py appended after the testcase name will be detected and run. +Any testcases which have _runme.py (or _runme3.py for Python 3) appended after the testcase name will be detected and run. +If you intend to write a testcase for both Python 2.x and 3.x, do *not* directly put the _runme3.py in this directory. Just write Python 2.x's _runme.py testcase and it will be automatically converted to Python 3 code during test. + +You can run make with PY3=y to run test case with Python 3.x, eg. + $ make voidtest.cpptest PY3=y Added: trunk/Examples/test-suite/python/abstractbase.i =================================================================== --- trunk/Examples/test-suite/python/abstractbase.i (rev 0) +++ trunk/Examples/test-suite/python/abstractbase.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,18 @@ +%module abstractbase +%include <pyabc.i> +%include <std_map.i> +%include <std_multimap.i> +%include <std_set.i> +%include <std_multiset.i> +%include <std_list.i> +%include <std_vector.i> + +namespace std +{ + %template(Mapii) map<int, int>; + %template(Multimapii) multimap<int, int>; + %template(IntSet) set<int>; + %template(IntMultiset) multiset<int>; + %template(IntVector) vector<int>; + %template(IntList) list<int>; +} Added: trunk/Examples/test-suite/python/abstractbase_runme3.py =================================================================== --- trunk/Examples/test-suite/python/abstractbase_runme3.py (rev 0) +++ trunk/Examples/test-suite/python/abstractbase_runme3.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,8 @@ +from abstractbase import * +from collections import * +assert issubclass(Mapii, MutableMapping) +assert issubclass(Multimapii, MutableMapping) +assert issubclass(IntSet, MutableSet) +assert issubclass(IntMultiset, MutableSet) +assert issubclass(IntVector, MutableSequence) +assert issubclass(IntList, MutableSequence) Modified: trunk/Examples/test-suite/python/cpp_namespace_runme.py =================================================================== --- trunk/Examples/test-suite/python/cpp_namespace_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/cpp_namespace_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -3,20 +3,20 @@ n = cpp_namespace.fact(4) if n != 24: - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.cvar.Foo != 42: - raise "Bad variable value!" + raise RuntimeError("Bad variable value!") t = cpp_namespace.Test() if t.method() != "Test::method": - raise "Bad method return value!" + raise RuntimeError("Bad method return value!") if cpp_namespace.do_method(t) != "Test::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.do_method2(t) != "Test::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") cpp_namespace.weird("hello", 4) @@ -28,18 +28,18 @@ t5 = cpp_namespace.Test5() if cpp_namespace.foo3(42) != 42: - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.do_method3(t2,40) != "Test2::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.do_method3(t3,40) != "Test3::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.do_method3(t4,40) != "Test4::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") if cpp_namespace.do_method3(t5,40) != "Test5::method": - raise "Bad return value!" + raise RuntimeError("Bad return value!") Modified: trunk/Examples/test-suite/python/director_classic_runme.py =================================================================== --- trunk/Examples/test-suite/python/director_classic_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/director_classic_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,56 +1,56 @@ from director_classic import * class TargetLangPerson(Person): - def __init__(self): - Person.__init__(self) - def id(self): - identifier = "TargetLangPerson" - return identifier + def __init__(self): + Person.__init__(self) + def id(self): + identifier = "TargetLangPerson" + return identifier class TargetLangChild(Child): - def __init__(self): - Child.__init__(self) - def id(self): - identifier = "TargetLangChild" - return identifier + def __init__(self): + Child.__init__(self) + def id(self): + identifier = "TargetLangChild" + return identifier class TargetLangGrandChild(GrandChild): - def __init__(self): - GrandChild.__init__(self) - def id(self): - identifier = "TargetLangGrandChild" - return identifier + def __init__(self): + GrandChild.__init__(self) + def id(self): + identifier = "TargetLangGrandChild" + return identifier # Semis - don't override id() in target language class TargetLangSemiPerson(Person): - def __init__(self): - Person.__init__(self) + def __init__(self): + Person.__init__(self) # No id() override class TargetLangSemiChild(Child): - def __init__(self): - Child.__init__(self) + def __init__(self): + Child.__init__(self) # No id() override class TargetLangSemiGrandChild(GrandChild): - def __init__(self): - GrandChild.__init__(self) + def __init__(self): + GrandChild.__init__(self) # No id() override # Orphans - don't override id() in C++ class TargetLangOrphanPerson(OrphanPerson): - def __init__(self): - OrphanPerson.__init__(self) - def id(self): - identifier = "TargetLangOrphanPerson" - return identifier + def __init__(self): + OrphanPerson.__init__(self) + def id(self): + identifier = "TargetLangOrphanPerson" + return identifier class TargetLangOrphanChild(OrphanChild): - def __init__(self): - Child.__init__(self) - def id(self): - identifier = "TargetLangOrphanChild" - return identifier + def __init__(self): + Child.__init__(self) + def id(self): + identifier = "TargetLangOrphanChild" + return identifier def check(person, expected): @@ -61,7 +61,7 @@ if (debug): print(ret) if (ret != expected): - raise ("Failed. Received: " + ret + " Expected: " + expected) + raise RuntimeError("Failed. Received: " + str(ret) + " Expected: " + expected) # Polymorphic call from C++ caller = Caller() @@ -70,7 +70,7 @@ if (debug): print(ret) if (ret != expected): - raise ("Failed. Received: " + ret + " Expected: " + expected) + raise RuntimeError("Failed. Received: " + str(ret) + " Expected: " + expected) # Polymorphic call of object created in target language and passed to C++ and back again baseclass = caller.baseClass() @@ -78,7 +78,7 @@ if (debug): print(ret) if (ret != expected): - raise ("Failed. Received: " + ret + " Expected: " + expected) + raise RuntimeError("Failed. Received: " + str(ret)+ " Expected: " + expected) caller.resetCallback() if (debug): Modified: trunk/Examples/test-suite/python/director_exception_runme.py =================================================================== --- trunk/Examples/test-suite/python/director_exception_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/director_exception_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,5 +1,4 @@ from director_exception import * -from exceptions import * class MyException(Exception): def __init__(self, a, b): Modified: trunk/Examples/test-suite/python/file_test_runme.py =================================================================== --- trunk/Examples/test-suite/python/file_test_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/file_test_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,7 +1,8 @@ import sys import file_test -file_test.nfile(sys.stdout) +if sys.version_info < (3,0): + file_test.nfile(sys.stdout) cstdout = file_test.GetStdOut() Modified: trunk/Examples/test-suite/python/hugemod.pl =================================================================== --- trunk/Examples/test-suite/python/hugemod.pl 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/hugemod.pl 2008-09-11 17:18:07 UTC (rev 10834) @@ -2,8 +2,12 @@ use strict; +my $modsize = 399; #adjust it so you can have a smaller or bigger hugemod + +my $runme = shift @ARGV; + open HEADER, ">hugemod.h" or die "error"; -open TEST, ">hugemod_runme.py" or die "error"; +open TEST, ">$runme" or die "error"; open I1, ">hugemod_a.i" or die "error"; open I2, ">hugemod_b.i" or die "error"; @@ -21,7 +25,7 @@ my $i; -for ($i = 0; $i < 6000; $i++) { +for ($i = 0; $i < $modsize; $i++) { my $t = $i * 4; print HEADER "class type$i { public: int a; };\n"; print I2 "class dtype$i : public type$i { public: int b; };\n"; Added: trunk/Examples/test-suite/python/operbool_runme.py =================================================================== --- trunk/Examples/test-suite/python/operbool_runme.py (rev 0) +++ trunk/Examples/test-suite/python/operbool_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,4 @@ +#!/usr/bin/env python +import operbool +assert not operbool.Test() + Added: trunk/Examples/test-suite/python/pybuf.i =================================================================== --- trunk/Examples/test-suite/python/pybuf.i (rev 0) +++ trunk/Examples/test-suite/python/pybuf.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,34 @@ +%module pybuf +%include<pybuffer.i> + +%pybuffer_mutable_binary(char *buf1, int len); +%pybuffer_mutable_string(char *buf2); +%pybuffer_binary(const char *buf3, int len); +%pybuffer_string(const char *buf4); + +%inline %{ + void func1(char *buf1, int len) + { + int i; + for (i=0; i<len; ++i) + buf1[i] = 'a'; + return; + } + void func2(char *buf2) + { + strcpy(buf2, "Hello world!"); + } + int func3(const char *buf3, int len) + { + int count = 0; + int i; + for(i=0; i<len; ++i) + if (isalnum(buf3[i])) + ++count; + return count; + } + int func4(const char *buf4) + { + return strlen(buf4); + } +%} Added: trunk/Examples/test-suite/python/pybuf_benchmark.i =================================================================== --- trunk/Examples/test-suite/python/pybuf_benchmark.i (rev 0) +++ trunk/Examples/test-suite/python/pybuf_benchmark.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,31 @@ +%module pybuf_benchmark + +%include<pybuffer.i> +%include<cstring.i> +%pybuffer_mutable_string(char *str1); +%cstring_mutable(char *str2); + +%inline %{ +void title(char *str) { + int outword = 0; + while(*str) { + if (isalnum(*str)) { + if (outword) { + outword = 1; + *str = toupper(*str); + } + } + else { + outword = 0; + } + str++; + } +} + +void title1(char *str1) { + title(str1); +} +void title2(char *str2) { + title(str2); +} +%} Added: trunk/Examples/test-suite/python/pybuf_benchmark_runme.py =================================================================== --- trunk/Examples/test-suite/python/pybuf_benchmark_runme.py (rev 0) +++ trunk/Examples/test-suite/python/pybuf_benchmark_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,16 @@ +import pybuf +import time +k=1000000 +n=7 + +t=time.time() +a = bytearray(b'hello world') +for i in range(k): + pybuf.title1(a) +print "Time used by bytearray:",time.time()-t + +t=time.time() +b = 'hello world' +for i in range(k): + pybuf.title2(b) +print "Time used by string:",time.time()-t Added: trunk/Examples/test-suite/python/pybuf_benchmark_runme3.py =================================================================== --- trunk/Examples/test-suite/python/pybuf_benchmark_runme3.py (rev 0) +++ trunk/Examples/test-suite/python/pybuf_benchmark_runme3.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,16 @@ +import pybuf +import time +k=1000000 +n=7 + +t=time.time() +a = bytearray(b'hello world') +for i in range(k): + pybuf.title1(a) +print("Time used by bytearray:",time.time()-t) + +t=time.time() +b = 'hello world' +for i in range(k): + pybuf.title2(b) +print("Time used by string:",time.time()-t) Added: trunk/Examples/test-suite/python/pybuf_runme3.py =================================================================== --- trunk/Examples/test-suite/python/pybuf_runme3.py (rev 0) +++ trunk/Examples/test-suite/python/pybuf_runme3.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,15 @@ +import pybuf +buf1 = bytearray(10) +buf2 = bytearray(50) + +pybuf.func1(buf1) +assert buf1 == b'a'*10 + +pybuf.func2(buf2) +assert buf2.startswith(b"Hello world!\x00") + +count = pybuf.func3(buf2) +assert count==10 #number of alpha and number in 'Hello world!' + +length = pybuf.func4(buf2) +assert length==12 Modified: trunk/Examples/test-suite/python/template_typedef_cplx2_runme.py =================================================================== --- trunk/Examples/test-suite/python/template_typedef_cplx2_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/template_typedef_cplx2_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,4 +1,3 @@ -import string from template_typedef_cplx2 import * # @@ -13,7 +12,7 @@ raise RuntimeError s = '%s' % d -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print d, "is not an ArithUnaryFunction" raise RuntimeError @@ -25,7 +24,7 @@ raise RuntimeError s = '%s' % e -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print e, "is not an ArithUnaryFunction" raise RuntimeError @@ -42,7 +41,7 @@ raise RuntimeError s = '%s' % c -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print c, "is not an ArithUnaryFunction" raise RuntimeError @@ -54,7 +53,7 @@ raise RuntimeError s = '%s' % f -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print f, "is not an ArithUnaryFunction" raise RuntimeError @@ -70,7 +69,7 @@ raise RuntimeError s = '%s' % g -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print g, "is not an ArithUnaryFunction" raise RuntimeError @@ -83,7 +82,7 @@ raise RuntimeError s = '%s' % h -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print h, "is not an ArithUnaryFunction" raise RuntimeError Modified: trunk/Examples/test-suite/python/template_typedef_cplx_runme.py =================================================================== --- trunk/Examples/test-suite/python/template_typedef_cplx_runme.py 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Examples/test-suite/python/template_typedef_cplx_runme.py 2008-09-11 17:18:07 UTC (rev 10834) @@ -1,4 +1,3 @@ -import string from template_typedef_cplx import * # @@ -13,7 +12,7 @@ raise RuntimeError s = '%s' % d -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print d, "is not an ArithUnaryFunction" raise RuntimeError @@ -25,7 +24,7 @@ raise RuntimeError s = '%s' % e -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print e, "is not an ArithUnaryFunction" raise RuntimeError @@ -42,7 +41,7 @@ raise RuntimeError s = '%s' % c -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print c, "is not an ArithUnaryFunction" raise RuntimeError @@ -54,7 +53,7 @@ raise RuntimeError s = '%s' % f -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print f, "is not an ArithUnaryFunction" raise RuntimeError @@ -70,7 +69,7 @@ raise RuntimeError s = '%s' % g -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print g, "is not an ArithUnaryFunction" raise RuntimeError @@ -83,6 +82,6 @@ raise RuntimeError s = '%s' % h -if string.find(s, 'ArithUnaryFunction') == -1: +if str.find(s, 'ArithUnaryFunction') == -1: print h, "is not an ArithUnaryFunction" raise RuntimeError Modified: trunk/Lib/python/file.i =================================================================== --- trunk/Lib/python/file.i 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Lib/python/file.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -20,11 +20,13 @@ if ((SWIG_ConvertPtr(obj, &vptr, desc, 0)) == SWIG_OK) { if (val) *val = (FILE *)vptr; return SWIG_OK; - } + } +%#if PY_VERSION_HEX < 0x03000000 if (PyFile_Check(obj)) { if (val) *val = PyFile_AsFile(obj); return SWIG_OK; } +%#endif return SWIG_TypeError; } } Added: trunk/Lib/python/pyabc.i =================================================================== --- trunk/Lib/python/pyabc.i (rev 0) +++ trunk/Lib/python/pyabc.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,10 @@ +%define %pythonabc(Type, Abc) + %feature("python:abc", #Abc) Type; +%enddef +%pythoncode {import collections}; +%pythonabc(std::vector, collections.MutableSequence); +%pythonabc(std::list, collections.MutableSequence); +%pythonabc(std::map, collections.MutableMapping); +%pythonabc(std::multimap, collections.MutableMapping); +%pythonabc(std::set, collections.MutableSet); +%pythonabc(std::multiset, collections.MutableSet); Modified: trunk/Lib/python/pyapi.swg =================================================================== --- trunk/Lib/python/pyapi.swg 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Lib/python/pyapi.swg 2008-09-11 17:18:07 UTC (rev 10834) @@ -27,6 +27,20 @@ swig_type_info **ptype; } swig_const_info; + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *self, PyObject *func) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyInstanceMethod_New(func); +#else + return NULL; +#endif +} + #ifdef __cplusplus #if 0 { /* cc-mode */ Added: trunk/Lib/python/pybuffer.i =================================================================== --- trunk/Lib/python/pybuffer.i (rev 0) +++ trunk/Lib/python/pybuffer.i 2008-09-11 17:18:07 UTC (rev 10834) @@ -0,0 +1,107 @@ +/* Impelementing buffer protocol typemaps */ + +/* %pybuffer_mutable_binary(TYPEMAP, SIZE) + * + * Macro for functions accept mutable buffer pointer with a size. + * This can be used for both input and output. For example: + * + * %pybuffer_mutable_binary(char *buff, int size); + * void foo(char *buff, int size) { + * for(int i=0; i<size; ++i) + * buff[i]++; + * } + */ + +%define %pybuffer_mutable_binary(TYPEMAP, SIZE) +%typemap(in) (TYPEMAP, SIZE) + (int res, Py_ssize_t size = 0, void *buf = 0) { + res = PyObject_AsWriteBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; + $2 = ($2_ltype) size; +} +%enddef + +/* %pybuffer_mutable_string(TYPEMAP, SIZE) + * + * Macro for functions accept mutable zero terminated string pointer. + * This can be used for both input and output. For example: + * + * %pybuffer_mutable_string(char *str); + * void foo(char *str) { + * while(*str) { + * *str = toupper(*str); + * str++; + * } + */ + +%define %pybuffer_mutable_string(TYPEMAP) +%typemap(in) (TYPEMAP) + (int res, Py_ssize_t size = 0, void *buf = 0) { + res = PyObject_AsWriteBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; +} +%enddef + +/* pybuffer_binary(TYPEMAP, SIZE) + * + * Macro for functions accept read only buffer pointer with a size. + * This must be used for input. For example: + * + * %pybuffer_binary(char *buff, int size); + * int foo(char *buff, int size) { + * int count = 0; + * for(int i=0; i<size; ++i) + * if (0==buff[i]) count++; + * return count; + * } + */ + +%define %pybuffer_binary(TYPEMAP, SIZE) +%typemap(in) (TYPEMAP, SIZE) + (int res, Py_ssize_t size = 0, const void *buf = 0) { + res = PyObject_AsReadBuffer($input, &buf, &size); + if (res<0) { + PyErr_Clear(); + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; + $2 = ($2_ltype) size; +} +%enddef + +/* %pybuffer_string(TYPEMAP, SIZE) + * + * Macro for functions accept read only zero terminated string pointer. + * This can be used for input. For example: + * + * %pybuffer_string(char *str); + * int foo(char *str) { + * int count = 0; + * while(*str) { + * if (isalnum(*str)) + * count++; + * str++; + * } + */ + +%define %pybuffer_string(TYPEMAP) +%typemap(in) (TYPEMAP) + (int res, Py_ssize_t size = 0, const void *buf = 0) { + res = PyObject_AsReadBuffer($input, &buf, &size); + if (res<0) { + %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); + } + $1 = ($1_ltype) buf; +} +%enddef + + + Modified: trunk/Lib/python/pycontainer.swg =================================================================== --- trunk/Lib/python/pycontainer.swg 2008-09-11 06:14:49 UTC (rev 10833) +++ trunk/Lib/python/pycontainer.swg 2008-09-11 17:18:07 UTC (rev 10834) @@ -116,6 +116,17 @@ bool res; SWIG_PYTHON_THREAD_BEGIN_BLOCK; res = PyObject_Compare(v, w) < 0; + /* This may fall into a case of inconsistent + eg. ObjA > ObjX > ObjB + but ObjA < ObjB + */ + if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) + { + /* Objects can't be compared, this mostly occured in Python 3.0 */ + /* Compare their ptr directly for a workaround */ + res = (v < w); + PyErr_Clear(); + } SWIG_PYTHON_THREAD_END_BLOCK; return res; } @@ -597,6 +608,11 @@ return !(self->empty()); } + /* Alias for Python 3 compatibility */ + bool __bool__() const { + return !(self->empty()); + } + size_type __len__() const { return self->size(); } @@ -618,6 +634,... [truncated message content] |
From: <bh...@us...> - 2008-09-13 14:11:57
|
Revision: 10856 http://swig.svn.sourceforge.net/swig/?rev=10856&view=rev Author: bhy Date: 2008-09-13 14:11:49 +0000 (Sat, 13 Sep 2008) Log Message: ----------- more document for limitation of parameter list, and doc of removal of -apply in CHANGES.current Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Python.html Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-13 13:42:24 UTC (rev 10855) +++ trunk/CHANGES.current 2008-09-13 14:11:49 UTC (rev 10856) @@ -20,6 +20,10 @@ "Python 3 Support" section in the "SWIG and Python" chapter of SWIG documentation. + The "-apply" command line option and support of generating codes + using apply() is removed. Since this is only required by very old + Python. + This merge also patched SWIG's parser to solve a bug. By this patch, SWIG features able to be correctly applied on C++ conversion operator, such like this: Modified: trunk/Doc/Manual/Python.html =================================================================== --- trunk/Doc/Manual/Python.html 2008-09-13 13:42:24 UTC (rev 10855) +++ trunk/Doc/Manual/Python.html 2008-09-13 14:11:49 UTC (rev 10856) @@ -4988,8 +4988,7 @@ <p> The <tt>-py3</tt> option will enable function annotation support. When used -SWIG is able to generate proxy method definitions like -this: +SWIG is able to generate proxy method definitions like this: </p> <div class="code"><pre> @@ -4997,9 +4996,25 @@ </pre></div> <p> -For details of usage of function annotation, see PEP 3107. +Also, even if without passing SWIG the <tt>-py3</tt> option, the parameter list +still could be generated: </p> +<div class="code"><pre> + def foo(self, bar = 0): ... +</pre></div> + +<p> +But for overloaded function or method, the parameter list would fallback to +<tt>*args</tt> or <tt>self, *args</tt>, and <tt>**kwargs</tt> may be append +depend on whether you enabled the keyword argument. This fallback is due to +all overloaded functions share the same function in SWIG generated proxy class. +</p> + +<p> +For detailed usage of function annotation, see PEP 3107. +</p> + <H3><a name="Python_nn75"></a>30.12.2 Buffer interface</H3> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mut...@us...> - 2008-09-17 12:13:15
|
Revision: 10860 http://swig.svn.sourceforge.net/swig/?rev=10860&view=rev Author: mutandiz Date: 2008-09-17 19:13:12 +0000 (Wed, 17 Sep 2008) Log Message: ----------- [allegrocl] Fix handling of forward references. Remove code breaking typical code generation. See ChangeLog for more details on the latter. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/allegrocl/allegrocl.swg trunk/Source/Modules/allegrocl.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-17 16:01:32 UTC (rev 10859) +++ trunk/CHANGES.current 2008-09-17 19:13:12 UTC (rev 10860) @@ -1,6 +1,22 @@ Version 1.3.37 (in progress) ============================= +2008-09-17: mutandiz (Mikel Bancroft) + [allegrocl] + - Fix how forward reference typedefs are handled, so as not to conflict + with other legit typedefs. + - Don't (for now) perform an ffitype typemap lookup when trying to + when calling compose_foreign_type(). This is actually a useful thing + to do in certain cases, the test cases for which I can't currently + locate :/. It's breaking some wrapping behavior that is more commonly + seen, however. I'll readd in a more appropriate way when I can + recreate the needed test case, or a user complains (which means + they probably have a test case). + - document the -isolate command-line arg in the 'swig -help' output. + It was in the html docs, but not there. + - small amount of code cleanup, removed some unused code. + - some minor aesthetic changes. + 2008-09-12: bhy [Python] Python 3.0 support branch merged into SWIG trunk. Thanks Google Summer of Code 2008 for support this project! By default Modified: trunk/Lib/allegrocl/allegrocl.swg =================================================================== --- trunk/Lib/allegrocl/allegrocl.swg 2008-09-17 16:01:32 UTC (rev 10859) +++ trunk/Lib/allegrocl/allegrocl.swg 2008-09-17 19:13:12 UTC (rev 10860) @@ -248,7 +248,7 @@ %insert("lisphead") %{ ;; $Id$ -(eval-when (compile load eval) +(eval-when (:compile-toplevel :load-toplevel :execute) ;; avoid compiling ef-templates at runtime (excl:find-external-format :fat) @@ -375,7 +375,7 @@ (defswig2 swig-defconstant (string value) (cl::let ((symbol (id-convert-and-export string :type :constant))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defconstant ,symbol ,value)))) (cl::defun maybe-reorder-args (funcname arglist) @@ -421,7 +421,7 @@ ) (cl::when (swig-anyvarargs-p ffargs) (cl::setq ffargs '())) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) @@ -447,7 +447,7 @@ ffargs (cl::loop for (nil name nil . ffi) in ffargs collect `(,name ,@ffi))))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) @@ -459,7 +459,7 @@ (defswig1 swig-dispatcher ((name &key (type :operator) class arities)) (cl::let ((symbol (id-convert-and-export name :type type :class class))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defun ,symbol (&rest args) (cl::case (cl::length args) ,@(cl::loop for arity in arities @@ -472,14 +472,14 @@ (defswig2 swig-def-foreign-stub (name) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol (:class )) (cl::defclass ,lsymbol (ff:foreign-pointer) ())))) (defswig2 swig-def-foreign-class (name supers &rest rest) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest) (cl::defclass ,lsymbol ,supers ((foreign-type :initform ',symbol :initarg :foreign-type @@ -487,11 +487,11 @@ (defswig2 swig-def-foreign-type (name &rest rest) (cl::let ((symbol (id-convert-and-export name :type :type))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest)))) (defswig2 swig-def-synonym-type (synonym of ff-synonym) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::setf (cl::find-class ',synonym) (cl::find-class ',of)) (ff:def-foreign-type ,ff-synonym (:struct )))) @@ -511,24 +511,24 @@ (parent-strings (cl::mapcar #'package-name-for-namespace parent-namespaces)) (string (package-name-for-namespace namespace))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defpackage ,string (:use :swig :ff #+ignore '(:common-lisp :ff :excl) ,@parent-strings ,*swig-module-name*) (:import-from :cl :* :nil :t))))) (cl::defmacro swig-in-package (namespace) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::in-package ,(package-name-for-namespace namespace)))) (defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural)) (cl::let ((symbol (id-convert-and-export name :type type))) - `(cl::eval-when (compile load eval) + `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype)))) ) ;; eval-when -(cl::eval-when (compile eval) +(cl::eval-when (:compile-toplevel :execute) (cl::flet ((starts-with-p (str prefix) (cl::and (cl::>= (cl::length str) (cl::length prefix)) (cl::string= str prefix :end1 (cl::length prefix))))) @@ -539,8 +539,8 @@ %} +typedef void *__SWIGACL_FwdReference; - %{ #ifdef __cplusplus @@ -551,6 +551,8 @@ #define EXPORT EXTERN SWIGEXPORT +typedef void *__SWIGACL_FwdReference; + #include <string.h> #include <stdlib.h> %} Modified: trunk/Source/Modules/allegrocl.cxx =================================================================== --- trunk/Source/Modules/allegrocl.cxx 2008-09-17 16:01:32 UTC (rev 10859) +++ trunk/Source/Modules/allegrocl.cxx 2008-09-17 19:13:12 UTC (rev 10860) @@ -34,6 +34,8 @@ static bool Generate_Wrapper = false; static bool unique_swig_package = false; +static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference"); + static String *current_namespace = NewString(""); static String *current_package = NewString(""); static Hash *defined_namespace_packages = NewHash(); @@ -725,7 +727,7 @@ } else { Printf(stderr, "Unable to compose foreign type of: '%s'\n", tok); } - Printf(ffiType, "(* :void)"); + Printf(ffiType, "%s", get_ffi_type(fwdref_ffi_type, "")); } } } @@ -735,22 +737,33 @@ String *compose_foreign_type(SwigType *ty, String *id = 0) { - Hash *lookup_res = Swig_typemap_search("ffitype", ty, id, 0); +/* Hash *lookup_res = Swig_typemap_search("ffitype", ty, id, 0); */ + #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); - String *id_ref = SwigType_str(ty, id); + Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); + /* String *id_ref = SwigType_str(ty, id); Printf(stderr, "looking up typemap for %s, found '%s'(%x)\n", id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); + if (lookup_res) Swig_print_node(lookup_res); + */ #endif + /* should we allow named lookups in the typemap here? YES! */ /* unnamed lookups should be found in get_ffi_type, called by internal_compose_foreign_type(), below. */ + + /* I'm reverting to 'no' for the question above. I can no longer + remember why I needed it. If a user needed it, I'll find out + as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */ + +/* if(id && lookup_res) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code")); #endif return NewString(Getattr(lookup_res, "code")); } +*/ SwigType *temp = SwigType_strip_qualifiers(ty); String *res = internal_compose_foreign_type(temp); @@ -1516,7 +1529,10 @@ "\tcalled to convert identifiers to symbols.\n" "\n" " -[no]cwrap\n" - "\tTurn on or turn off generation of an intermediate C file when\n" "\tcreating a C interface. By default this is only done for C++ code.\n"); + "\tTurn on or turn off generation of an intermediate C file when\n" "\tcreating a C interface. By default this is only done for C++ code.\n" + " -isolate\n" + "Define all SWIG helper functions in a package unique to this module. Avoids redefinition warnings when loading multiple SWIGged modules\n" + "into the same running Allegro CL image.\n"); } @@ -1571,7 +1587,7 @@ " (:export #:*swig-identifier-converter* #:*swig-module-name*\n" " #:*void* #:*swig-export-list*))\n" "(in-package :%s)\n\n" - "(eval-when (compile load eval)\n" + "(eval-when (:compile-toplevel :load-toplevel :execute)\n" " (defparameter *swig-identifier-converter* '%s)\n" " (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name); Printf(f_cl, "(defpackage :%s\n" " (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package); @@ -2632,13 +2648,18 @@ String *tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode); if (!is_void_return && tm) { - Replaceall(tm, "$result", "lresult"); - Printf(f->code, "%s\n", tm); - Printf(f->code, " return lresult;\n"); - Delete(tm); - } else { - Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), name); + if (tm) { + Replaceall(tm, "$result", "lresult"); + Printf(f->code, "%s\n", tm); + Printf(f->code, " return lresult;\n"); + Delete(tm); + } else { + Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, + "Unable to use return type %s in function %s.\n", + SwigType_str(t, 0), name); + } } + emit_return_variable(n, t, f); if (CPlusPlus) { @@ -2901,9 +2922,7 @@ Printf(stderr, " typedef in class '%s'(%x)\n", Getattr(in_class, "sym:name"), in_class); #endif Setattr(n, "allegrocl:typedef:in-class", in_class); - } - if (in_class) { String *class_name = Getattr(in_class, "name"); name = NewStringf("%s__%s", class_name, sym_name); type_ref = NewStringf("%s::%s", class_name, sym_name); @@ -2917,9 +2936,11 @@ String *lookup = lookup_defined_foreign_type(typedef_type); - // Printf(stderr, "** lookup='%s'(%x), ff_type='%s', strstr = '%d'\n", lookup, lookup, ff_type, !Strstr(ff_type,"void")); +#ifdef ALLEGROCL_TYPE_DEBUG + Printf(stderr, "** lookup='%s'(%x), ff_type='%s', !strstr = '%d'\n", lookup, lookup, ff_type, !Strstr(ff_type,"void")); +#endif - if(lookup || (!lookup && !Strstr(ff_type,"void"))) + if(lookup || (!lookup && !Strstr(ff_type,"__SWIGACL_FwdReference"))) add_defined_foreign_type(n, 0, type_ref, name); else add_forward_referenced_type(n); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-09-18 02:54:21
|
Revision: 10862 http://swig.svn.sourceforge.net/swig/?rev=10862&view=rev Author: olly Date: 2008-09-18 09:54:18 +0000 (Thu, 18 Sep 2008) Log Message: ----------- [PHP5] Fix wrapping of a renamed enumerated value of an enum class member (SF#2095273). Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-17 19:50:51 UTC (rev 10861) +++ trunk/CHANGES.current 2008-09-18 09:54:18 UTC (rev 10862) @@ -1,6 +1,10 @@ Version 1.3.37 (in progress) ============================= +2008-09-18: olly + [PHP5] Fix wrapping of a renamed enumerated value of an enum class + member (SF#2095273). + 2008-09-17: mutandiz (Mikel Bancroft) [allegrocl] - Fix how forward reference typedefs are handled, so as not to conflict Modified: trunk/Source/Modules/php.cxx =================================================================== --- trunk/Source/Modules/php.cxx 2008-09-17 19:50:51 UTC (rev 10861) +++ trunk/Source/Modules/php.cxx 2008-09-18 09:54:18 UTC (rev 10862) @@ -2007,7 +2007,7 @@ * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { - wrapping_member_constant = Getattr(n, "name"); + wrapping_member_constant = Getattr(n, "sym:name"); Language::memberconstantHandler(n); wrapping_member_constant = NULL; return SWIG_OK; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-09-18 06:01:57
|
Revision: 10863 http://swig.svn.sourceforge.net/swig/?rev=10863&view=rev Author: olly Date: 2008-09-18 13:01:52 +0000 (Thu, 18 Sep 2008) Log Message: ----------- [PHP5] Fix extra code added to proxy class constructors in the case where the only constructor takes no arguments. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-18 09:54:18 UTC (rev 10862) +++ trunk/CHANGES.current 2008-09-18 13:01:52 UTC (rev 10863) @@ -2,6 +2,10 @@ ============================= 2008-09-18: olly + [PHP5] Fix extra code added to proxy class constructors in the case + where the only constructor takes no arguments. + +2008-09-18: olly [PHP5] Fix wrapping of a renamed enumerated value of an enum class member (SF#2095273). Modified: trunk/Source/Modules/php.cxx =================================================================== --- trunk/Source/Modules/php.cxx 2008-09-18 09:54:18 UTC (rev 10862) +++ trunk/Source/Modules/php.cxx 2008-09-18 13:01:52 UTC (rev 10863) @@ -1358,16 +1358,26 @@ Printf(output, "\n"); // If it's a member function or a class constructor... if (wrapperType == memberfn || (newobject && current_class)) { - Printf(output, "\tfunction %s(%s) {\n", methodname, args); // We don't need this code if the wrapped class has a copy ctor // since the flat function new_CLASSNAME will handle it for us. if (newobject && !Getattr(current_class, "allocate:copy_constructor")) { + const char * arg0; + if (max_num_of_arguments > 0) { + arg0 = Char(arg_names[0]); + } else { + arg0 = "res"; + Delete(args); + args = NewString("$res=null"); + } SwigType *t = Getattr(current_class, "classtype"); String *mangled_type = SwigType_manglestr(SwigType_ltype(t)); - Printf(s_oowrappers, "\t\tif (is_resource($%s) && get_resource_type($%s) == \"_p%s\") {\n", arg_names[0], arg_names[0], mangled_type); - Printf(s_oowrappers, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg_names[0]); - Printf(s_oowrappers, "\t\t\treturn;\n"); - Printf(s_oowrappers, "\t\t}\n"); + Printf(output, "\tfunction %s(%s) {\n", methodname, args); + Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) == \"_p%s\") {\n", arg0, arg0, mangled_type); + Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); + Printf(output, "\t\t\treturn;\n"); + Printf(output, "\t\t}\n"); + } else { + Printf(output, "\tfunction %s(%s) {\n", methodname, args); } } else { Printf(output, "\tstatic function %s(%s) {\n", methodname, args); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-09-18 07:02:18
|
Revision: 10864 http://swig.svn.sourceforge.net/swig/?rev=10864&view=rev Author: olly Date: 2008-09-18 14:02:15 +0000 (Thu, 18 Sep 2008) Log Message: ----------- [PHP5] Change the default input typemap for char * to turn PHP Null into C NULL (previously it was converted to an empty string). The new behaviour is consistent with how the corresponding output typemap works. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/php/utils.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-18 13:01:52 UTC (rev 10863) +++ trunk/CHANGES.current 2008-09-18 14:02:15 UTC (rev 10864) @@ -2,6 +2,21 @@ ============================= 2008-09-18: olly + [PHP5] Change the default input typemap for char * to turn PHP + Null into C NULL (previously it was converted to an empty string). + The new behaviour is consistent with how the corresponding output + typemap works. + + If you want to keep the old behaviour, add the following typemap + to your interface file (PHP's convert_to_string_ex() function does + the converting from PHP Null to an empty string): + + %typemap(in) char * { + convert_to_string_ex($input); + $1 = Z_STRVAL_PP($input); + } + +2008-09-18: olly [PHP5] Fix extra code added to proxy class constructors in the case where the only constructor takes no arguments. Modified: trunk/Lib/php/utils.i =================================================================== --- trunk/Lib/php/utils.i 2008-09-18 13:01:52 UTC (rev 10863) +++ trunk/Lib/php/utils.i 2008-09-18 14:02:15 UTC (rev 10864) @@ -24,8 +24,12 @@ %enddef %define CONVERT_STRING_IN(lvar,t,invar) - convert_to_string_ex(invar); - lvar = (t) Z_STRVAL_PP(invar); + if ((*invar)->type==IS_NULL) { + lvar = (t) 0; + } else { + convert_to_string_ex(invar); + lvar = (t) Z_STRVAL_PP(invar); + } %enddef %define %pass_by_val( TYPE, CONVERT_IN ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-09-18 13:32:36
|
Revision: 10872 http://swig.svn.sourceforge.net/swig/?rev=10872&view=rev Author: wsfulton Date: 2008-09-18 20:32:28 +0000 (Thu, 18 Sep 2008) Log Message: ----------- Add C# array typemaps provided by Antti Karanta. Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/CSharp.html trunk/Examples/csharp/check.list trunk/Examples/test-suite/csharp/Makefile.in Added Paths: ----------- trunk/Examples/csharp/arrays/ trunk/Examples/csharp/arrays/Makefile trunk/Examples/csharp/arrays/example.c trunk/Examples/csharp/arrays/example.h trunk/Examples/csharp/arrays/example.i trunk/Examples/csharp/arrays/runme.cs trunk/Examples/test-suite/csharp/csharp_lib_arrays_runme.cs trunk/Examples/test-suite/csharp_lib_arrays.i trunk/Lib/csharp/arrays_csharp.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-18 20:28:40 UTC (rev 10871) +++ trunk/CHANGES.current 2008-09-18 20:32:28 UTC (rev 10872) @@ -1,6 +1,12 @@ Version 1.3.37 (in progress) ============================= +2008-09-17: wsfulton + [C#] Added C# array typemaps provided by Antti Karanta. + The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) + and pinning the array using 'fixed'. See arrays_csharp.i library file + for details. + 2008-09-18: wsfulton Document the optional module attribute in the %import directive, see Modules.html. Add a warning for Python wrappers when the @@ -49,10 +55,10 @@ - some minor aesthetic changes. 2008-09-12: bhy - [Python] Python 3.0 support branch merged into SWIG trunk. Thanks - Google Summer of Code 2008 for support this project! By default + [Python] Python 3.0 support branch merged into SWIG trunk. Thanks to + Google Summer of Code 2008 for supporting this project! By default SWIG will generate interface files compatible with both Python 2.x - and 3.0. And there's also some Python 3 new features could be + and 3.0. And there's also some Python 3 new features that can be enabled by passing a "-py3" command line option to SWIG. These features are: @@ -64,7 +70,7 @@ - Abstract base class support For details of Python 3 support and these features, please see the - "Python 3 Support" section in the "SWIG and Python" chapter of SWIG + "Python 3 Support" section in the "SWIG and Python" chapter of the SWIG documentation. The "-apply" command line option and support of generating codes Modified: trunk/Doc/Manual/CSharp.html =================================================================== --- trunk/Doc/Manual/CSharp.html 2008-09-18 20:28:40 UTC (rev 10871) +++ trunk/Doc/Manual/CSharp.html 2008-09-18 20:32:28 UTC (rev 10872) @@ -201,7 +201,12 @@ <li> <p> -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. Note that 'pre', 'post' and 'cshin' attributes are not used for marshalling the property set. Please see the <a href="#csharp_date_marshalling">Date marshalling example</a> and <a href="#CSharp.html#csharp_date_properties">Date marshalling of properties example</a> for further understanding. +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 additional optional attributes called 'cshin' and 'terminator'. +The 'cshin' attribute 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. +The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# <tt>using</tt> or <tt>fixed</tt> block is started. +Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. +Please see the <a href="#csharp_date_marshalling">Date marshalling example</a> and <a href="#CSharp.html#csharp_date_properties">Date marshalling of properties example</a> for further understanding of these "csin" applicable attributes. </p> </li> Added: trunk/Examples/csharp/arrays/Makefile =================================================================== --- trunk/Examples/csharp/arrays/Makefile (rev 0) +++ trunk/Examples/csharp/arrays/Makefile 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,20 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +SRCS = example.c +TARGET = example +INTERFACE = example.i +SWIGOPT = +CSHARPSRCS = *.cs +CSHARPFLAGS= -nologo -unsafe -out:runme.exe + +all:: csharp + +csharp:: + $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' csharp + $(MAKE) -f $(TOP)/Makefile CSHARPSRCS='$(CSHARPSRCS)' CSHARPFLAGS='$(CSHARPFLAGS)' csharp_compile + +clean:: + $(MAKE) -f $(TOP)/Makefile csharp_clean + +check: all Added: trunk/Examples/csharp/arrays/example.c =================================================================== --- trunk/Examples/csharp/arrays/example.c (rev 0) +++ trunk/Examples/csharp/arrays/example.c 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,22 @@ +/* File : example.c */ + +#include "example.h" + +/* copy the contents of the first array to the second */ +void myArrayCopy( int* sourceArray, int* targetArray, int nitems ) { + int i; + for ( i = 0; i < nitems; i++ ) { + targetArray[ i ] = sourceArray[ i ]; + } +} + +/* swap the contents of the two arrays */ +void myArraySwap( int* array1, int* array2, int nitems ) { + int i, temp; + for ( i = 0; i < nitems; i++ ) { + temp = array1[ i ]; + array1[ i ] = array2[ i ]; + array2[ i ] = temp; + } +} + Added: trunk/Examples/csharp/arrays/example.h =================================================================== --- trunk/Examples/csharp/arrays/example.h (rev 0) +++ trunk/Examples/csharp/arrays/example.h 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,4 @@ + +void myArrayCopy( int *sourceArray, int* targetArray, int nitems ); +void myArraySwap( int* array1, int* array2, int nitems ); + Added: trunk/Examples/csharp/arrays/example.i =================================================================== --- trunk/Examples/csharp/arrays/example.i (rev 0) +++ trunk/Examples/csharp/arrays/example.i 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,42 @@ +/* File : example.i */ +%module example + +%include "arrays_csharp.i" + +%apply int INPUT[] { int* sourceArray } +%apply int OUTPUT[] { int* targetArray } + +%apply int INOUT[] { int* array1 } +%apply int INOUT[] { int* array2 } + +%include "example.h" + +%clear int* sourceArray; +%clear int* targetArray; + +%clear int* array1; +%clear int* array2; + + +// Below replicates the above array handling but this time using the pinned (fixed) array typemaps +%csmethodmodifiers "public unsafe"; + +%apply int FIXED[] { int* sourceArray } +%apply int FIXED[] { int* targetArray } + +%inline %{ +void myArrayCopyUsingFixedArrays( int *sourceArray, int* targetArray, int nitems ) { + myArrayCopy(sourceArray, targetArray, nitems); +} +%} + +%apply int FIXED[] { int* array1 } +%apply int FIXED[] { int* array2 } + +%inline %{ +void myArraySwapUsingFixedArrays( int* array1, int* array2, int nitems ) { + myArraySwap(array1, array2, nitems); +} +%} + + Added: trunk/Examples/csharp/arrays/runme.cs =================================================================== --- trunk/Examples/csharp/arrays/runme.cs (rev 0) +++ trunk/Examples/csharp/arrays/runme.cs 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,43 @@ +using System; + +public class runme +{ + static void Main() + { + int[] source = { 1, 2, 3 }; + int[] target = new int[ source.Length ]; + + example.myArrayCopy( source, target, target.Length ); + + Console.WriteLine( "Contents of copy target array using default marshaling" ); + PrintArray( target ); + + target = new int[ source.Length ]; + + example.myArrayCopyUsingFixedArrays( source, target, target.Length ); + Console.WriteLine( "Contents of copy target array using fixed arrays" ); + PrintArray( target ); + + target = new int[] { 4, 5, 6 }; + example.myArraySwap( source, target, target.Length ); + Console.WriteLine( "Contents of arrays after swapping using default marshaling" ); + PrintArray( source ); + PrintArray( target ); + + source = new int[] { 1, 2, 3 }; + target = new int[] { 4, 5, 6 }; + + example.myArraySwapUsingFixedArrays( source, target, target.Length ); + Console.WriteLine( "Contents of arrays after swapping using fixed arrays" ); + PrintArray( source ); + PrintArray( target ); + } + + static void PrintArray( int[] a ) + { + foreach ( int i in a ) + Console.Write( "{0} ", i ); + Console.WriteLine(); + } +} + Modified: trunk/Examples/csharp/check.list =================================================================== --- trunk/Examples/csharp/check.list 2008-09-18 20:28:40 UTC (rev 10871) +++ trunk/Examples/csharp/check.list 2008-09-18 20:32:28 UTC (rev 10872) @@ -1,4 +1,5 @@ # see top-level Makefile.in +arrays callback class enum Modified: trunk/Examples/test-suite/csharp/Makefile.in =================================================================== --- trunk/Examples/test-suite/csharp/Makefile.in 2008-09-18 20:28:40 UTC (rev 10871) +++ trunk/Examples/test-suite/csharp/Makefile.in 2008-09-18 20:32:28 UTC (rev 10872) @@ -21,13 +21,17 @@ enum_thorough_typesafe \ exception_partial_info -CUSTOM_TEST_CASES = intermediary_classname +CUSTOM_TEST_CASES = \ + csharp_lib_arrays \ + intermediary_classname include $(srcdir)/../common.mk # Overridden variables here SWIGOPT += -namespace $*Namespace $(SWIGOPTSPECIAL) +CSHARPFLAGSSPECIAL = + # Rules for the different types of tests %.cpptest: $(setup) @@ -47,6 +51,8 @@ # Rules for custom tests intermediary_classname.customtest: $(MAKE) intermediary_classname.cpptest SWIGOPTSPECIAL="-dllimport intermediary_classname" +csharp_lib_arrays.customtest: + $(MAKE) csharp_lib_arrays.cpptest CSHARPFLAGSSPECIAL="-unsafe" # Makes a directory for the testcase if it does not exist setup = \ @@ -65,14 +71,14 @@ run_testcase = \ if [ -f $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then ( \ $(MAKE) -f $*/$(top_builddir)/$(EXAMPLES)/Makefile \ - CSHARPFLAGS='-nologo -out:$*_runme.exe' \ + CSHARPFLAGS='-nologo $(CSHARPFLAGSSPECIAL) -out:$*_runme.exe' \ CSHARPSRCS='`$(CSHARPCYGPATH_W) $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX)` \ $*$(CSHARPPATHSEPARATOR)*.cs' csharp_compile && \ env LD_LIBRARY_PATH="$*:$$LD_LIBRARY_PATH" PATH="$*:$$PATH" SHLIB_PATH="$*:$$SHLIB_PATH" $(RUNTOOL) $(INTERPRETER) $*_runme.exe; ) \ else ( \ cd $* && \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile \ - CSHARPFLAGS='-nologo -t:module -out:$*.netmodule' \ + CSHARPFLAGS='-nologo $(CSHARPFLAGSSPECIAL) -t:module -out:$*.netmodule' \ CSHARPSRCS='*.cs' csharp_compile; ); \ fi; Added: trunk/Examples/test-suite/csharp/csharp_lib_arrays_runme.cs =================================================================== --- trunk/Examples/test-suite/csharp/csharp_lib_arrays_runme.cs (rev 0) +++ trunk/Examples/test-suite/csharp/csharp_lib_arrays_runme.cs 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,70 @@ +using System; +using csharp_lib_arraysNamespace; + +public class runme +{ + static void Main() + { + { + int[] source = { 1, 2, 3, 4, 5 }; + int[] target = new int[ source.Length ]; + + csharp_lib_arrays.myArrayCopy( source, target, target.Length ); + CompareArrays(source, target); + } + + { + int[] source = { 1, 2, 3, 4, 5 }; + int[] target = new int[ source.Length ]; + + csharp_lib_arrays.myArrayCopyUsingFixedArrays( source, target, target.Length ); + CompareArrays(source, target); + } + + { + int[] source = { 1, 2, 3, 4, 5 }; + int[] target = new int[] { 6, 7, 8, 9, 10 }; + + csharp_lib_arrays.myArraySwap( source, target, target.Length ); + + for (int i=0; i<target.Length; ++i) + target[i] += 5; + CompareArrays(source, target); + } + + { + int[] source = { 1, 2, 3, 4, 5 }; + int[] target = new int[] { 6, 7, 8, 9, 10 }; + + csharp_lib_arrays.myArraySwapUsingFixedArrays( source, target, target.Length ); + + for (int i=0; i<target.Length; ++i) + target[i] += 5; + CompareArrays(source, target); + } + } + + static void CompareArrays( int[] a, int[] b ) + { + if (a.Length != b.Length) + throw new Exception("size mismatch"); + + for(int i=0; i<a.Length; ++i) { + if (a[i] != b[i]) { + Console.Error.WriteLine("a:"); + PrintArray(a); + Console.Error.WriteLine("b:"); + PrintArray(b); + throw new Exception("element mismatch"); + } + } + } + + static void PrintArray( int[] a ) + { + foreach ( int i in a ) + Console.Error.Write( "{0} ", i ); + Console.Error.WriteLine(); + } +} + Added: trunk/Examples/test-suite/csharp_lib_arrays.i =================================================================== --- trunk/Examples/test-suite/csharp_lib_arrays.i (rev 0) +++ trunk/Examples/test-suite/csharp_lib_arrays.i 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,61 @@ +%module csharp_lib_arrays + +%include "arrays_csharp.i" + +%apply int INPUT[] { int* sourceArray } +%apply int OUTPUT[] { int* targetArray } + +%apply int INOUT[] { int* array1 } +%apply int INOUT[] { int* array2 } + +%inline %{ +/* copy the contents of the first array to the second */ +void myArrayCopy( int* sourceArray, int* targetArray, int nitems ) { + int i; + for ( i = 0; i < nitems; i++ ) { + targetArray[ i ] = sourceArray[ i ]; + } +} + +/* swap the contents of the two arrays */ +void myArraySwap( int* array1, int* array2, int nitems ) { + int i, temp; + for ( i = 0; i < nitems; i++ ) { + temp = array1[ i ]; + array1[ i ] = array2[ i ]; + array2[ i ] = temp; + } +} +%} + + +%clear int* sourceArray; +%clear int* targetArray; + +%clear int* array1; +%clear int* array2; + + +// Below replicates the above array handling but this time using the pinned (fixed) array typemaps +%csmethodmodifiers myArrayCopyUsingFixedArrays "public unsafe"; +%csmethodmodifiers myArraySwapUsingFixedArrays "public unsafe"; + +%apply int FIXED[] { int* sourceArray } +%apply int FIXED[] { int* targetArray } + +%inline %{ +void myArrayCopyUsingFixedArrays( int *sourceArray, int* targetArray, int nitems ) { + myArrayCopy(sourceArray, targetArray, nitems); +} +%} + +%apply int FIXED[] { int* array1 } +%apply int FIXED[] { int* array2 } + +%inline %{ +void myArraySwapUsingFixedArrays( int* array1, int* array2, int nitems ) { + myArraySwap(array1, array2, nitems); +} +%} + + Added: trunk/Lib/csharp/arrays_csharp.i =================================================================== --- trunk/Lib/csharp/arrays_csharp.i (rev 0) +++ trunk/Lib/csharp/arrays_csharp.i 2008-09-18 20:32:28 UTC (rev 10872) @@ -0,0 +1,140 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * arrays_csharp.i + * + * This file contains a two approaches to marshaling arrays. The first uses + * default p/invoke marshaling and the second uses pinning of the arrays. + * + * Default marshalling approach + * ---------------------------- + * Array typemaps using default p/invoke marshaling. The data is copied to a separately + * allocated buffer when passing over the managed-native boundary. + * + * There are separate typemaps for in, out and inout arrays to enable avoiding + * unnecessary copying. + * + * Example usage: + * + * %include "arrays_csharp.i" + * %apply int INPUT[] { int* sourceArray } + * %apply int OUTPUT[] { int* targetArray } + * void myArrayCopy( int* sourceArray, int* targetArray, int nitems ); + * + * %apply int INOUT[] { int* array1, int *array2 } + * void myArraySwap( int* array1, int* array2, int nitems ); + * + * If handling large arrays you should consider using the pinning array typemaps + * described next. + * + * Pinning approach + * ---------------- + * Array typemaps using pinning. These typemaps pin the managed array given + * as parameter and pass a pointer to it to the c/c++ side. This is very + * efficient as no copying is done (unlike in the default array marshalling), + * but it makes garbage collection more difficult. When considering using + * these typemaps, think carefully whether you have callbacks that may cause + * the control to re-enter the managed side from within the call (and produce + * garbage for the gc) or whether other threads may produce enough garbage to + * trigger gc while the call is being executed. In those cases it may be + * wiser to use. + * + * Please note that when using fixed arrays, you have to mark your corresponding + * module class method unsafe using + * %csmethodmodifiers "public unsafe" + * (the visibility of the method is up to you). + * + * Example usage: + * + * %include "arrays_csharp.i" + * %apply int FIXED[] { int* sourceArray, int *targetArray } + * %csmethodmodifiers myArrayCopy "public unsafe"; + * void myArrayCopy( int *sourceArray, int* targetArray, int nitems ); + * + * ----------------------------------------------------------------------------- */ + +%define CSHARP_ARRAYS( CTYPE, CSTYPE ) + +// input only arrays + +%typemap(ctype) CTYPE INPUT[] "CTYPE*" +%typemap(cstype) CTYPE INPUT[] "CSTYPE[]" +%typemap(imtype, inattributes="[In, MarshalAs(UnmanagedType.LPArray)]") CTYPE INPUT[] "CSTYPE[]" +%typemap(csin) CTYPE INPUT[] "$csinput" + +%typemap(in) CTYPE INPUT[] "$1 = $input;" +%typemap(freearg) CTYPE INPUT[] "" +%typemap(argout) CTYPE INPUT[] "" + +// output only arrays + +%typemap(ctype) CTYPE OUTPUT[] "CTYPE*" +%typemap(cstype) CTYPE OUTPUT[] "CSTYPE[]" +%typemap(imtype, inattributes="[Out, MarshalAs(UnmanagedType.LPArray)]") CTYPE OUTPUT[] "CSTYPE[]" +%typemap(csin) CTYPE OUTPUT[] "$csinput" + +%typemap(in) CTYPE OUTPUT[] "$1 = $input;" +%typemap(freearg) CTYPE OUTPUT[] "" +%typemap(argout) CTYPE OUTPUT[] "" + +// inout arrays + +%typemap(ctype) CTYPE INOUT[] "CTYPE*" +%typemap(cstype) CTYPE INOUT[] "CSTYPE[]" +%typemap(imtype, inattributes="[In, Out, MarshalAs(UnmanagedType.LPArray)]") CTYPE INOUT[] "CSTYPE[]" +%typemap(csin) CTYPE INOUT[] "$csinput" + +%typemap(in) CTYPE INOUT[] "$1 = $input;" +%typemap(freearg) CTYPE INOUT[] "" +%typemap(argout) CTYPE INOUT[] "" + +%enddef // CSHARP_ARRAYS + +CSHARP_ARRAYS(signed char, sbyte) +CSHARP_ARRAYS(unsigned char, byte) +CSHARP_ARRAYS(short, short) +CSHARP_ARRAYS(unsigned short, ushort) +CSHARP_ARRAYS(int, int) +CSHARP_ARRAYS(unsigned int, uint) +// FIXME - on Unix 64 bit, long is 8 bytes but is 4 bytes on Windows 64 bit. +// How can this be handled sensibly? +// See e.g. http://www.xml.com/ldd/chapter/book/ch10.html +CSHARP_ARRAYS(long, int) +CSHARP_ARRAYS(unsigned long, uint) +CSHARP_ARRAYS(long long, long) +CSHARP_ARRAYS(unsigned long long, ulong) +CSHARP_ARRAYS(float, float) +CSHARP_ARRAYS(double, double) + + +%define CSHARP_ARRAYS_FIXED( CTYPE, CSTYPE ) + +%typemap(ctype) CTYPE FIXED[] "CTYPE*" +%typemap(imtype) CTYPE FIXED[] "IntPtr" +%typemap(cstype) CTYPE FIXED[] "CSTYPE[]" +%typemap(csin, + pre= " fixed ( CSTYPE* swig_ptrTo_$csinput = $csinput ) {", + terminator=" }") + CTYPE FIXED[] "(IntPtr)swig_ptrTo_$csinput" + +%typemap(in) CTYPE FIXED[] "$1 = $input;" +%typemap(freearg) CTYPE FIXED[] "" +%typemap(argout) CTYPE FIXED[] "" + + +%enddef // CSHARP_ARRAYS_FIXED + +CSHARP_ARRAYS_FIXED(signed char, sbyte) +CSHARP_ARRAYS_FIXED(unsigned char, byte) +CSHARP_ARRAYS_FIXED(short, short) +CSHARP_ARRAYS_FIXED(unsigned short, ushort) +CSHARP_ARRAYS_FIXED(int, int) +CSHARP_ARRAYS_FIXED(unsigned int, uint) +CSHARP_ARRAYS_FIXED(long, int) +CSHARP_ARRAYS_FIXED(unsigned long, uint) +CSHARP_ARRAYS_FIXED(long long, long) +CSHARP_ARRAYS_FIXED(unsigned long long, ulong) +CSHARP_ARRAYS_FIXED(float, float) +CSHARP_ARRAYS_FIXED(double, double) + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-09-18 16:17:54
|
Revision: 10875 http://swig.svn.sourceforge.net/swig/?rev=10875&view=rev Author: wsfulton Date: 2008-09-18 23:17:52 +0000 (Thu, 18 Sep 2008) Log Message: ----------- revert entry 2008-09-01 - C# Insert and InsertRange bounds checking Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/csharp/std_vector.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-18 20:39:15 UTC (rev 10874) +++ trunk/CHANGES.current 2008-09-18 23:17:52 UTC (rev 10875) @@ -1,7 +1,7 @@ Version 1.3.37 (in progress) ============================= -2008-09-17: wsfulton +2008-09-18: wsfulton [C#] Added C# array typemaps provided by Antti Karanta. The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) and pinning the array using 'fixed'. See arrays_csharp.i library file @@ -110,10 +110,6 @@ [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM -2008-09-01: wsfulton - [C#] Correct array bounds checking in std::vector typemaps - Insert and InsertRange - methods. - 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors Modified: trunk/Lib/csharp/std_vector.i =================================================================== --- trunk/Lib/csharp/std_vector.i 2008-09-18 20:39:15 UTC (rev 10874) +++ trunk/Lib/csharp/std_vector.i 2008-09-18 23:17:52 UTC (rev 10875) @@ -231,14 +231,14 @@ return new std::vector<CTYPE >(self->begin()+index, self->begin()+index+count); } void Insert(int index, const value_type& x) throw (std::out_of_range) { - if (index>=0 && index<(int)self->size()) + if (index>=0 && index<(int)self->size()+1) self->insert(self->begin()+index, x); else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.InsertRange void InsertRange(int index, const std::vector<CTYPE >& values) throw (std::out_of_range) { - if (index>=0 && index<(int)self->size()) + if (index>=0 && index<(int)self->size()+1) self->insert(self->begin()+index, values.begin(), values.end()); else throw std::out_of_range("index"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-09-18 20:21:01
|
Revision: 10876 http://swig.svn.sourceforge.net/swig/?rev=10876&view=rev Author: olly Date: 2008-09-19 03:20:59 +0000 (Fri, 19 Sep 2008) Log Message: ----------- [PHP5] Add typemaps for long long and unsigned long long. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/php/typemaps.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-18 23:17:52 UTC (rev 10875) +++ trunk/CHANGES.current 2008-09-19 03:20:59 UTC (rev 10876) @@ -1,6 +1,9 @@ Version 1.3.37 (in progress) ============================= +2008-09-19: olly + [PHP5] Add typemaps for long long and unsigned long long. + 2008-09-18: wsfulton [C#] Added C# array typemaps provided by Antti Karanta. The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) Modified: trunk/Lib/php/typemaps.i =================================================================== --- trunk/Lib/php/typemaps.i 2008-09-18 23:17:52 UTC (rev 10875) +++ trunk/Lib/php/typemaps.i 2008-09-19 03:20:59 UTC (rev 10876) @@ -96,16 +96,83 @@ int_typemap(unsigned long); int_typemap(unsigned char); +int_typemap(long long); +%typemap(argout,fragment="t_output_helper") long long *OUTPUT +{ + zval *o; + MAKE_STD_ZVAL(o); + if ((long long)LONG_MIN <= temp$argnum && temp$argnum <= (long long)LONG_MAX) { + ZVAL_LONG(o, temp$argnum); + } else { + char temp[256]; + sprintf(temp, "%lld", temp$argnum); + ZVAL_STRING(o, temp, 1); + } + t_output_helper( &$result, o ); +} +%typemap(in) TYPE *REFERENCE (long long lvalue) +%{ + // FIXME won't work for values which don't fit in a long... + convert_to_long_ex($input); + lvalue = (long long) (*$input)->value.lval; + $1 = &lvalue; +%} +%typemap(argout) long long *REFERENCE +%{ + if ((long long)LONG_MIN <= lvalue$argnum && lvalue$argnum <= (long long)LONG_MAX) { + (*$arg)->value.lval = (long)(lvalue$argnum); + (*$arg)->type = IS_LONG; + } else { + char temp[256]; + sprintf(temp, "%lld", lvalue$argnum); + ZVAL_STRING((*$arg), temp, 1); + } +%} +int_typemap(unsigned long long); +%typemap(argout,fragment="t_output_helper") unsigned long long *OUTPUT +{ + zval *o; + MAKE_STD_ZVAL(o); + if (temp$argnum <= (unsigned long long)LONG_MAX) { + ZVAL_LONG(o, temp$argnum); + } else { + char temp[256]; + sprintf(temp, "%llu", temp$argnum); + ZVAL_STRING(o, temp, 1); + } + t_output_helper( &$result, o ); +} +%typemap(in) TYPE *REFERENCE (unsigned long long lvalue) +%{ + // FIXME won't work for values which don't fit in a long... + convert_to_long_ex($input); + lvalue = (unsigned long long) (*$input)->value.lval; + $1 = &lvalue; +%} +%typemap(argout) unsigned long long *REFERENCE +%{ + if (lvalue$argnum <= (unsigned long long)LONG_MAX) { + (*$arg)->value.lval = (long)(lvalue$argnum); + (*$arg)->type = IS_LONG; + } else { + char temp[256]; + sprintf(temp, "%llu", lvalue$argnum); + ZVAL_STRING((*$arg), temp, 1); + } +%} + %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; +%typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; +%typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) float &INOUT = float *INPUT; %typemap(in) double &INOUT = double *INPUT; @@ -113,10 +180,12 @@ %typemap(in) int &INOUT = int *INPUT; %typemap(in) short &INOUT = short *INPUT; %typemap(in) long &INOUT = long *INPUT; +%typemap(in) long long &INOUT = long long *INPUT; %typemap(in) unsigned &INOUT = unsigned *INPUT; %typemap(in) unsigned short &INOUT = unsigned short *INPUT; %typemap(in) unsigned long &INOUT = unsigned long *INPUT; %typemap(in) unsigned char &INOUT = unsigned char *INPUT; +%typemap(in) unsigned long long &INOUT = unsigned long long *INPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT= double *OUTPUT; @@ -124,9 +193,11 @@ %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT= long *OUTPUT; +%typemap(argout) long long *INOUT= long long *OUTPUT; %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; +%typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) float &INOUT = float *OUTPUT; %typemap(argout) double &INOUT= double *OUTPUT; @@ -134,9 +205,11 @@ %typemap(argout) int &INOUT = int *OUTPUT; %typemap(argout) short &INOUT = short *OUTPUT; %typemap(argout) long &INOUT= long *OUTPUT; +%typemap(argout) long long &INOUT= long long *OUTPUT; %typemap(argout) unsigned short &INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char *OUTPUT; +%typemap(argout) unsigned long long &INOUT = unsigned long long *OUTPUT; %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) %{ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mut...@us...> - 2008-09-22 18:41:22
|
Revision: 10878 http://swig.svn.sourceforge.net/swig/?rev=10878&view=rev Author: mutandiz Date: 2008-09-22 18:41:10 +0000 (Mon, 22 Sep 2008) Log Message: ----------- [allegrocl] Make type and namespace wrapping more compatible with other modules. cpp test-suite work. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/allegrocl/Makefile.in trunk/Examples/test-suite/char_strings.i trunk/Lib/allegrocl/allegrocl.swg trunk/Source/Modules/allegrocl.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-19 06:40:39 UTC (rev 10877) +++ trunk/CHANGES.current 2008-09-22 18:41:10 UTC (rev 10878) @@ -1,6 +1,17 @@ +2008-09-22 Mikel Bancroft <mi...@fr...> + Version 1.3.37 (in progress) ============================= +2008-09-22: mutandiz (Mikel Bancroft) + [allegrocl] + - Support wrapping of types whose definitions are not seen by + SWIG. They are treated as forward-referenced classes and if a + definition is not seen are treated as (* :void). + - Don't wrap the contents of unnamed namespaces. + - More code cleanup. Removed some extraneous warnings. + - start work on having the allegrocl mod pass the cpp test-suite. + 2008-09-19: olly [PHP5] Add typemaps for long long and unsigned long long. Modified: trunk/Examples/test-suite/allegrocl/Makefile.in =================================================================== --- trunk/Examples/test-suite/allegrocl/Makefile.in 2008-09-19 06:40:39 UTC (rev 10877) +++ trunk/Examples/test-suite/allegrocl/Makefile.in 2008-09-22 18:41:10 UTC (rev 10878) @@ -9,21 +9,40 @@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ + +# these cpp tests generate warnings/errors when compiling +# the wrapper .cxx file. +CPP_TEST_BROKEN_CXX = \ +# might be a problem in our cxx wrapping. not sure. \ + class_scope_weird \ +# works as expected. must muffle warnings if you want none. \ +# 'struct A' is not seen by SWIG, so it's type cannot be \ +# derived \ +# Look into cxx problems, though. + constant_pointers + + # these cpp tests aren't working. Fix 'em # need to further separate these into tests requiring # std libraries, or the $ldestructor problem. CPP_TEST_BROKEN_ACL = \ array_member \ +# seems like a problem with the .i file. not enough includes. \ char_strings \ +# not sure what this one is supposed to do. needs investigation. \ class_ignore \ - constant_pointers \ contract \ +# 'throws' typemap entries. \ cplusplus_throw \ +# not sure. \ cpp_basic \ +# redefinition of enum_members. Looks like a namespace problem. \ cpp_enum \ +# works as expected. Bar is not seen by swig. muffle warning. \ cpp_typedef \ +# 'throws' typemap entries. \ + default_args \ default_constructor \ - default_args \ dynamic_cast \ enum_thorough \ extend_variable \ @@ -91,7 +110,13 @@ # These are currently unsupported. CPP_TEST_CASES_ACL_UNSUPPORTED = \ +# contract support \ aggregate \ +# directors and allprotected support \ + allprotected \ +# directors support \ + apply_signed_char \ +# contract support \ contract \ director_abstract \ director_basic \ @@ -130,7 +155,7 @@ C_TEST_CASES = -CPP_TEST_CASES = +CPP_TEST_CASES = include $(srcdir)/../common.mk Modified: trunk/Examples/test-suite/char_strings.i =================================================================== --- trunk/Examples/test-suite/char_strings.i 2008-09-19 06:40:39 UTC (rev 10877) +++ trunk/Examples/test-suite/char_strings.i 2008-09-22 18:41:10 UTC (rev 10878) @@ -9,7 +9,13 @@ %warnfilter(SWIGWARN_TYPEMAP_VARIN_UNDEF) global_char_array1; // Unable to set variable of type char[] %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) global_const_char; // Setting a const char * variable may leak memory. +#ifdef SWIG_ALLEGRO_CL %{ +#include <stdio.h> +%} +#endif + +%{ #define OTHERLAND_MSG "Little message from the safe world." #define CPLUSPLUS_MSG "A message from the deep dark world of C++, where anything is possible." static char *global_str = NULL; Modified: trunk/Lib/allegrocl/allegrocl.swg =================================================================== --- trunk/Lib/allegrocl/allegrocl.swg 2008-09-19 06:40:39 UTC (rev 10877) +++ trunk/Lib/allegrocl/allegrocl.swg 2008-09-22 18:41:10 UTC (rev 10878) @@ -55,7 +55,7 @@ int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, - enum SWIGTYPE, SWIGTYPE *, + enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE & "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; @@ -65,7 +65,7 @@ int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, - enum SWIGTYPE, SWIGTYPE *, + enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE & "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; Modified: trunk/Source/Modules/allegrocl.cxx =================================================================== --- trunk/Source/Modules/allegrocl.cxx 2008-09-19 06:40:39 UTC (rev 10877) +++ trunk/Source/Modules/allegrocl.cxx 2008-09-22 18:41:10 UTC (rev 10878) @@ -170,6 +170,7 @@ void add_linked_type(Node *n) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding linked node of type: %s(%s) %s(%x)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); + Swig_print_node(n); #endif if (!first_linked_type) { first_linked_type = n; @@ -299,7 +300,8 @@ } } -void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, String *name = 0, String *ns = current_namespace) { +void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, + String *name = 0, String *ns = current_namespace) { String *val; String *ns_list = listify_namespace(ns); @@ -323,22 +325,34 @@ /* For typedefs of the form: - typedef __xxx { ... } xxx; + typedef struct __xxx { ... } xxx; + behavior differs between C mode and C++ mode. + + C Mode: add_defined_foreign_type will be called once via classHandler - to define the type for 'struct __xxx', and once via typedefHandler - to associate xxx with 'struct __xxx'. + to define the type for 'struct __xxx' and add the mapping from + 'struct __xxx' -> 'xxx' - We create the following type to identifier mappings: + It will also be called once via typedefHandler to add the + mapping 'xxx' -> 'xxx' - struct __xxx -> (swig-insert-id "xxx") via classHand - xxx -> (swig-insert-id "xxx") via typedefHand + C++ Mode: + add_defined_foreign_type will be called once via classHandler + to define the type for 'xxx'. it also adds the mapping from + 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx' - and all references to this typedef'd struct will appear in - generated code as 'xxx'. For non-typedef'd structs, the - classHand mapping will be + In typedefHandler, we again try to add the mapping from + 'xxx' -> 'xxx', which already exists. This second mapping + is ignored. - struct __xxx -> (swig-insert-id "__xxx") + Both modes: + + All references to this typedef'd struct will appear in + generated lisp code as an objectd of type 'xxx'. For + non-typedef'd structs, the classHand mapping will be + + struct __xxx -> (swig-insert-id "__xxx") */ // Swig_print_node(n); String *unnamed = Getattr(n, "unnamed"); @@ -587,7 +601,11 @@ Delete(mangled_name_gen); Delete(mangled_lname_gen); } else { - Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Attempting to store a foreign type that exists: %s (%s)\n", k, val); + if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) { + Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), + "Attempting to store a foreign type that exists: %s (%s)\n", + k, val); + } } Delete(ns_list); @@ -622,7 +640,8 @@ #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "found_type '%s'\n", found_type); #endif - return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : NewString(":void")); + return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : + get_ffi_type(fwdref_ffi_type, "")); } else { Hash *typemap = Swig_typemap_search("ffitype", ty, name, 0); @@ -709,25 +728,39 @@ if (res) Printf(ffiType, "%s", res); } -// while(resolved_type) { -// // the resolved_type may expand into something like p.NS1::NS2::SomeType -// // for which get_ffi_type will not find any match (due to the p.). -// // Printf(stderr, "\n in resolved type loop on '%s'\n", resolved_type); -// res = get_ffi_type(resolved_type, ""); -// if (res) { -// Printf(ffiType, "%s", res); -// break; -// } else { -// resolved_type = SwigType_typedef_resolve(resolved_type); -// } -// } + if (!res) { - if (Strstr(tok, "struct ")) { - Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); - } else { - Printf(stderr, "Unable to compose foreign type of: '%s'\n", tok); + String *is_struct = 0; + String *tok_remove_text = 0; + String *tok_name = Copy(tok); + String *tok_key = SwigType_str(tok,0); + if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) { + tok_remove_text = NewString(is_struct ? "struct " : "union "); } - Printf(ffiType, "%s", get_ffi_type(fwdref_ffi_type, "")); + + /* be more permissive of opaque types. This is the swig way. + compiles will notice if these types are ultimately not + present. */ + + if(tok_remove_text) { + Replaceall(tok_name,tok_remove_text,""); + } + tok_name = strip_namespaces(tok_name); + Delete(tok_remove_text); + // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); + +#ifdef ALLEGROCL_TYPE_DEBUG + Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name); +#endif + Node *nn = NewHash(); + Setattr(nn,"nodeType","classforward"); + Setattr(nn,"kind","class"); + Setattr(nn,"sym:name",tok_name); + Setattr(nn,"name",tok_key); + Setattr(nn,"allegrocl:package","current_namespace"); + + add_forward_referenced_type(nn, 0); + Printf(ffiType, "%s", get_ffi_type(tok, ""), tok_name); } } } @@ -841,6 +874,10 @@ } int ALLEGROCL::validIdentifier(String *s) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "validIdentifier %s\n", s); +#endif + char *c = Char(s); bool got_dot = false; @@ -967,6 +1004,7 @@ Delete(num); num = 0; } + Delete(lisp_exp); } else { String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); @@ -2354,41 +2392,24 @@ for (p = pl; p; p = nextSibling(p), argnum++, largnum++) { // SwigType *argtype=Getattr(p, "type"); SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype")); + SwigType *parmtype = Getattr(p,"type"); if (!first) { Printf(fcl, "\n "); } - if (SwigType_isvarargs(argtype)) { - Printf(stderr, "Function %s (line %d) contains varargs, which is not directly supported. Use %%varargs instead.\n", Getattr(n, "name"), Getline(n)); - } else { + /* by default, skip varargs */ + if (!SwigType_isvarargs(parmtype)) { String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); - // Swig_print_node(p); // Printf(stderr,"%s\n", Getattr(p,"tmap:lin")); String *ffitype = compose_foreign_type(argtype, Getattr(p,"name")); - String *deref_ffitype; + String *deref_ffitype = dereference_ffitype(ffitype); + String *lisptype = get_lisp_type(parmtype, Getattr(p, "name")); - deref_ffitype = dereference_ffitype(ffitype); - -/* - String *temp = Copy(argtype); - - if (SwigType_ispointer(temp)) { - SwigType_pop(temp); - deref_ffitype = compose_foreign_type(temp); - } else { - deref_ffitype = Copy(ffitype); - } - - Delete(temp); -*/ - // String *lisptype=get_lisp_type(argtype, argname); - String *lisptype = get_lisp_type(Getattr(p, "type"), Getattr(p, "name")); - #ifdef ALLEGROCL_DEBUG - Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", - Getattr(p, "type"), Getattr(p, "name"), lisptype); + Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype, + Getattr(p, "name"), lisptype); #endif // while we're walking the parameters, generating LIN @@ -2419,7 +2440,9 @@ first = 0; } + Delete(argname); Delete(ffitype); + Delete(deref_ffitype); Delete(lisptype); } } @@ -2457,11 +2480,6 @@ lclass = lookup_defined_foreign_ltype(cl_t); isPtrReturn = 1; } - // if (SwigType_ispointer(cl_t)) { - // isPtrReturn = 1; - // SwigType_pop(cl_t); - // lclass = lookup_defined_foreign_ltype(cl_t); - // } int ff_foreign_ptr = 0; if (!lclass) { @@ -2534,7 +2552,11 @@ } int ALLEGROCL::functionWrapper(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); +#endif + ParmList *parms = CopyParmList(Getattr(n, "parms")); Wrapper *f = NewWrapper(); SwigType *t = Getattr(n, "type"); @@ -2694,13 +2716,15 @@ } int ALLEGROCL::namespaceDeclaration(Node *n) { - // Empty namespaces are not worth DEFPACKAGEing. - // Swig_print_node(n); #ifdef ALLEGROCL_DEBUG Printf(stderr, "namespaceDecl: '%s'(0x%x) (fc=0x%x)\n", Getattr(n, "sym:name"), n, firstChild(n)); #endif - if (!firstChild(n)) + /* don't wrap a namespace with no contents. package bloat. + also, test-suite/namespace_class.i claims an unnamed namespace + is 'private' and should not be wrapped. Complying... + */ + if (Getattr(n,"unnamed") || !firstChild(n)) return SWIG_OK; String *name = Getattr(n, "sym:name"); @@ -2727,7 +2751,7 @@ int ALLEGROCL::constructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "constructor %s\n", Getattr(n, "name")); + Printf(stderr, "constructorHandler %s\n", Getattr(n, "name")); #endif // Swig_print_node(n); Setattr(n, "allegrocl:kind", "constructor"); @@ -2739,7 +2763,7 @@ int ALLEGROCL::destructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "destructor %s\n", Getattr(n, "name")); + Printf(stderr, "destructorHandler %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "destructor"); @@ -2750,9 +2774,8 @@ } int ALLEGROCL::constantWrapper(Node *n) { - #ifdef ALLEGROCL_DEBUG - Printf(stderr, "constant %s\n", Getattr(n, "name")); + Printf(stderr, "constantWrapper %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) { @@ -2808,6 +2831,10 @@ } int ALLEGROCL::globalvariableHandler(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name")); +#endif + if (Generate_Wrapper) return Language::globalvariableHandler(n); @@ -2838,7 +2865,7 @@ int ALLEGROCL::variableWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "variable %s\n", Getattr(n, "name")); + Printf(stderr, "variableWrapper %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); @@ -2863,6 +2890,7 @@ } ctype = SwigType_str(type, 0); + // EXPORT <SwigType_str> <mangled_name>; // <SwigType_str> <mangled_name> = <name>; Printf(f_cxx, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name); @@ -2873,14 +2901,19 @@ Printf(f_cxx, "// vwrap: %s\n", compose_foreign_type(SwigType_strip_qualifiers(Copy(rtype)))); */ + Printf(stderr,"***\n"); Delete(mangled_name); +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "DONE variable %s\n", Getattr(n, "name")); +#endif + return SWIG_OK; } int ALLEGROCL::memberfunctionHandler(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "member function %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); + Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "member function"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); @@ -2891,7 +2924,7 @@ int ALLEGROCL::membervariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "member variable %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); + Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "member variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); @@ -2901,9 +2934,8 @@ } int ALLEGROCL::typedefHandler(Node *n) { - #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "In typedefHAND\n"); + Printf(stderr, "In typedefHandler\n"); // Swig_print_node(n); #endif @@ -2945,7 +2977,7 @@ else add_forward_referenced_type(n); #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Out typedefHAND\n"); + Printf(stderr, "Out typedefHandler\n"); #endif Delete(ff_type); @@ -2955,13 +2987,17 @@ // forward referenced classes are added specially to defined_foreign_types int ALLEGROCL::classforwardDeclaration(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name")); +#endif + add_forward_referenced_type(n); return SWIG_OK; } int ALLEGROCL::classHandler(Node *n) { #ifdef ALLEGROCL_DEBUG - Printf(stderr, "class %s::%s\n", current_namespace, Getattr(n, "sym:name")); + Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); #endif if (Generate_Wrapper) @@ -2971,6 +3007,9 @@ } int ALLEGROCL::cClassHandler(Node *n) { +#ifdef ALLEGROCL_TYPE_DEBUG + Printf(stderr, "In cClassHandler\n"); +#endif // String *cDeclName = Getattr(n,"classDeclaration:name"); // String *name= Getattr(n, "sym:name"); // String *kind = Getattr(n,"kind"); @@ -2980,22 +3019,21 @@ // Printf(stderr, "Adding %s foreign type\n", name); String *ns = listify_namespace(current_namespace); -#ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "In cClassHAND\n"); -#endif - add_defined_foreign_type(n); Delete(ns); #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "Out cClassHAND\n"); + Printf(stderr, "Out cClassHandler\n"); #endif return SWIG_OK; } int ALLEGROCL::cppClassHandler(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name")); +#endif // String *name=Getattr(n, "sym:name"); // String *kind = Getattr(n,"kind"); @@ -3054,6 +3092,10 @@ // so their types can be added to the linked_type_list. SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); +#ifdef ALLEGROCL_CLASS_DEBUG + Printf(stderr, "looking at child '%x' of type '%s'\n", c, childType); + Swig_print_node(c); +#endif if (!SwigType_isfunction(childType)) Delete(compose_foreign_type(childType)); @@ -3094,6 +3136,9 @@ } int ALLEGROCL::enumDeclaration(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name")); +#endif if (Getattr(n, "sym:name")) { add_defined_foreign_type(n); @@ -3110,21 +3155,24 @@ int ALLEGROCL::enumvalueDeclaration(Node *n) { - +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name")); +#endif /* print this when in C mode? make this a command-line arg? */ - if (Generate_Wrapper) { String *mangled_name = mangle_name(n, "ACL_ENUM"); + Printf(f_cxx, "EXPORT const %s %s = %s;\n", Getattr(n, "type"), + mangled_name, Getattr(n, "value")); - Printf(f_cxx, "EXPORT const %s %s = %s;\n", Getattr(n, "type"), mangled_name, Getattr(n, "value")); - Delete(mangled_name); } - return SWIG_OK; } int ALLEGROCL::templateDeclaration(Node *n) { +#ifdef ALLEGROCL_DEBUG + Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name")); +#endif String *type = Getattr(n, "templatetype"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-09-25 07:11:41
|
Revision: 10881 http://swig.svn.sourceforge.net/swig/?rev=10881&view=rev Author: olly Date: 2008-09-25 07:11:36 +0000 (Thu, 25 Sep 2008) Log Message: ----------- [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/php/php.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-24 19:28:15 UTC (rev 10880) +++ trunk/CHANGES.current 2008-09-25 07:11:36 UTC (rev 10881) @@ -1,6 +1,9 @@ Version 1.3.37 (in progress) -============================= +============================ +2008-09-25: olly + [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). + 2008-09-22: mutandiz (Mikel Bancroft) [allegrocl] - Support wrapping of types whose definitions are not seen by Modified: trunk/Lib/php/php.swg =================================================================== --- trunk/Lib/php/php.swg 2008-09-24 19:28:15 UTC (rev 10880) +++ trunk/Lib/php/php.swg 2008-09-25 07:11:36 UTC (rev 10881) @@ -110,6 +110,7 @@ SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } } + %typemap(argout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE&; @@ -264,20 +265,25 @@ %php_typecheck(double,SWIG_TYPECHECK_BOOL,IS_DOUBLE) %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE - " /* typecheck SWIGTYPE */ " +{ + void *tmp; + _v = (SWIG_ConvertPtr(*$input, (void **)&tmp, $&1_descriptor, 0) >= 0); +} %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [], SWIGTYPE & { void *tmp; - _v = (SWIG_ConvertPtr( *$input, (void**)&tmp, $1_descriptor, 0) >= 0); + _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, $1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * - " /* typecheck void * */ " +{ + void *tmp; + _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, 0, 0) >= 0); +} - /* Exception handling */ %typemap(throws) int, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mut...@us...> - 2008-09-30 19:45:38
|
Revision: 10885 http://swig.svn.sourceforge.net/swig/?rev=10885&view=rev Author: mutandiz Date: 2008-09-30 19:45:13 +0000 (Tue, 30 Sep 2008) Log Message: ----------- [allegrocl] Various fixes to the generated C wrapper code (enums, constants, function declarations), as I progress through the test-suite. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/allegrocl/Makefile.in trunk/Examples/test-suite/operator_overload.i trunk/Lib/allegrocl/allegrocl.swg trunk/Source/Modules/allegrocl.cxx trunk/TODO Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/CHANGES.current 2008-09-30 19:45:13 UTC (rev 10885) @@ -1,6 +1,18 @@ +2008-09-26 Mikel Bancroft <mi...@fr...> + Version 1.3.37 (in progress) ============================ +2008-09-26: mutandiz + [allegrocl] + Lots of test-suite work. + - Fix ordering of wrapper output and %{ %} header output. + - Fix declarations of local vars in C wrappers. + - Fix declaration of defined constants in C wrappers. + - Fix declaration of EnumValues in C wrappers. + - add some const typemaps to allegrocl.swg + - add rename for operator bool() overloads. + 2008-09-25: olly [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). Modified: trunk/Examples/test-suite/allegrocl/Makefile.in =================================================================== --- trunk/Examples/test-suite/allegrocl/Makefile.in 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/Examples/test-suite/allegrocl/Makefile.in 2008-09-30 19:45:13 UTC (rev 10885) @@ -12,98 +12,46 @@ # these cpp tests generate warnings/errors when compiling # the wrapper .cxx file. -CPP_TEST_BROKEN_CXX = \ -# might be a problem in our cxx wrapping. not sure. \ - class_scope_weird \ -# works as expected. must muffle warnings if you want none. \ -# 'struct A' is not seen by SWIG, so it's type cannot be \ -# derived \ -# Look into cxx problems, though. - constant_pointers +CPP_TEST_BROKEN_CXX = +# the error is wrap:action code generated by swig. \ +# error: can't convert [std::string] 'b' to 'bool' \ +# might just need a bool overload op for std::string. \ + global_vars \ +# same as w/ global_vars but with more errors in cxx file \ + naturalvar \ - # these cpp tests aren't working. Fix 'em # need to further separate these into tests requiring # std libraries, or the $ldestructor problem. CPP_TEST_BROKEN_ACL = \ - array_member \ -# seems like a problem with the .i file. not enough includes. \ - char_strings \ -# not sure what this one is supposed to do. needs investigation. \ - class_ignore \ contract \ + allprotected \ # 'throws' typemap entries. \ cplusplus_throw \ -# not sure. \ - cpp_basic \ -# redefinition of enum_members. Looks like a namespace problem. \ - cpp_enum \ -# works as expected. Bar is not seen by swig. muffle warning. \ - cpp_typedef \ # 'throws' typemap entries. \ default_args \ - default_constructor \ +# missing typemaps. suspect module support needed \ dynamic_cast \ - enum_thorough \ extend_variable \ - global_vars \ - import_nomodule \ - kind \ - li_carrays \ +# cdata.i support needed \ li_cdata \ - li_windows \ - namespace_class \ - namespace_spaces \ - naturalvar \ +# warning generated. otherwise all good. \ operator_overload \ - overload_simple \ - register_par \ +# std_common.i support \ sizet \ - smart_pointer_extend \ - smart_pointer_namespace \ - template \ - template_classes \ +# std_vector.i support. \ template_default \ - template_default_inherit \ - template_enum \ - template_explicit \ - template_extend_overload \ - template_ns \ - template_ns4 \ - template_ns_enum \ - template_rename \ - template_retvalue \ - template_static \ - template_tbase_template \ - template_typedef \ - template_typedef_cplx \ - template_typedef_cplx2 \ - template_typedef_cplx3 \ - template_typedef_cplx4 \ - template_typedef_cplx5 \ - template_typedef_ns \ - template_typedef_rec \ - threads \ - typedef_array_member \ - typedef_sizet \ +# *** line 31. can't copy typemap?? \ typemap_namespace \ - union_scope \ - using_pointers \ - valuewrapper_opaque \ - varargs \ - virtual_poly \ - voidtest \ - wrapmacro # these aren't working due to longlong support. (low hanging fruit) CPP_TEST_BROKEN_LONGLONG = \ arrays_dimensionless \ arrays_global \ arrays_global_twodim \ - li_stdint \ li_typemaps \ + li_windows \ long_long_apply \ - mixed_types \ primitive_ref \ reference_global_vars \ template_default_arg @@ -112,38 +60,24 @@ CPP_TEST_CASES_ACL_UNSUPPORTED = \ # contract support \ aggregate \ -# directors and allprotected support \ - allprotected \ # directors support \ apply_signed_char \ # contract support \ contract \ - director_abstract \ - director_basic \ - director_constructor \ - director_detect \ - director_default \ - director_enum \ director_exception \ - director_frob \ - director_finalizer \ - director_nested \ director_protected \ - director_redefined \ - director_unroll \ - director_using \ - director_wombat \ exception_order \ +# 'throws' typemap support \ extern_throws \ - throw_exception + throw_exception \ + using_pointers \ C_TEST_CASES_ACL_BROKEN = \ - arrays \ - enums \ - extern_declaration \ - immutable \ - integers \ +# 'cdate.i' module support \ li_cdata \ +# adding an existing type defnition... \ + typedef_struct \ +# swigrun.swg support. \ typemap_subst C_TEST_BROKEN_LONGLONG = \ @@ -153,12 +87,10 @@ # std lib support hasn't been done yet. SKIP_CPP_STD_CASES = Yes -C_TEST_CASES = - -CPP_TEST_CASES = - include $(srcdir)/../common.mk +# SWIGOPT += -debug-module 4 + # Rules for the different types of tests %.cpptest: $(setup) Modified: trunk/Examples/test-suite/operator_overload.i =================================================================== --- trunk/Examples/test-suite/operator_overload.i 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/Examples/test-suite/operator_overload.i 2008-09-30 19:45:13 UTC (rev 10885) @@ -71,6 +71,12 @@ %rename(OrOperator) operator ||; #endif +#ifdef SWIG_ALLEGRO_CL +%{ +#include <stdio.h> +%} +#endif + %rename(IntCast) operator int(); %rename(DoubleCast) operator double(); Modified: trunk/Lib/allegrocl/allegrocl.swg =================================================================== --- trunk/Lib/allegrocl/allegrocl.swg 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/Lib/allegrocl/allegrocl.swg 2008-09-30 19:45:13 UTC (rev 10885) @@ -26,37 +26,76 @@ %typemap(lout) SWIGTYPE "(cl::let* ((address $body)\n (new-inst (cl::make-instance '$lclass :foreign-address address)))\n (cl::unless (cl::zerop address)\n (excl:schedule-finalization new-inst #'$ldestructor))\n (cl::setq ACL_ffresult new-inst))"; -%typemap(lisptype) bool "cl:boolean"; -%typemap(lisptype) char "cl:character"; -%typemap(lisptype) unsigned char "cl:integer"; -%typemap(lisptype) signed char "cl:integer"; +%typemap(lisptype) bool, const bool "cl:boolean"; +%typemap(lisptype) char, const char "cl:character"; +%typemap(lisptype) unsigned char, const unsigned char "cl:integer"; +%typemap(lisptype) signed char, const signed char "cl:integer"; -%typemap(ffitype) bool ":int"; -%typemap(ffitype) char ":char"; -%typemap(ffitype) unsigned char ":unsigned-char"; -%typemap(ffitype) signed char ":char"; -%typemap(ffitype) short, signed short ":short"; -%typemap(ffitype) unsigned short ":unsigned-short"; -%typemap(ffitype) int, signed int ":int"; -%typemap(ffitype) unsigned int ":unsigned-int"; -%typemap(ffitype) long, signed long ":long"; -%typemap(ffitype) unsigned long ":unsigned-long"; -%typemap(ffitype) float ":float"; -%typemap(ffitype) double ":double"; -%typemap(ffitype) char * "(* :char)"; +%typemap(ffitype) bool, const bool ":int"; +%typemap(ffitype) char, const char, + signed char, const signed char ":char"; +%typemap(ffitype) unsigned char, const unsigned char ":unsigned-char"; +%typemap(ffitype) short, const short, + signed short, const signed short ":short"; +%typemap(ffitype) unsigned short, const unsigned short ":unsigned-short"; +%typemap(ffitype) int, const int, signed int, const signed int ":int"; +%typemap(ffitype) unsigned int, const unsigned int ":unsigned-int"; +%typemap(ffitype) long, const long, signed long, const signed long ":long"; +%typemap(ffitype) unsigned long, const unsigned long ":unsigned-long"; +%typemap(ffitype) float, const float ":float"; +%typemap(ffitype) double, const double ":double"; +%typemap(ffitype) char *, const char *, signed char *, + const signed char *, signed char &, + const signed char & "(* :char)"; +%typemap(ffitype) unsigned char *, const unsigned char *, + unsigned char &, const unsigned char & "(* :unsigned-char)"; +%typemap(ffitype) short *, const short *, short &, + const short & "(* :short)"; +%typemap(ffitype) unsigned short *, const unsigned short *, + unsigned short &, const unsigned short & "(* :unsigned-short)"; +%typemap(ffitype) int *, const int *, int &, const int & "(* :int)"; +%typemap(ffitype) unsigned int *, const unsigned int *, + unsigned int &, const unsigned int & "(* :unsigned-int)"; %typemap(ffitype) void * "(* :void)"; %typemap(ffitype) void ":void"; %typemap(ffitype) enum SWIGTYPE ":int"; %typemap(ffitype) SWIGTYPE & "(* :void)"; -%typemap(ctype) bool "int"; +/* const typemaps +idea: marshall all primitive c types to their respective lisp types +to maintain const corretness. For pointers/references, all bets +are off if you try to modify them. + +idea: add a constant-p slot to the base foreign-pointer class. For +constant pointer/references check this value when setting (around method?) +and error if a setf operation is performed on the address of this object. + +*/ + +/* +%exception %{ + try { + $action + } catch (...) { + return $null; + } +%} + +*/ + +// %typemap(throws) SWIGTYPE { +// (void)$1; +// SWIG_fail; +// } + +%typemap(ctype) bool, const bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], - SWIGTYPE[ANY], SWIGTYPE & "$1_ltype"; + SWIGTYPE[ANY], SWIGTYPE &, const SWIGTYPE "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; @@ -122,7 +161,8 @@ long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, - SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; + SWIGTYPE[], SWIGTYPE[ANY], + SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ @@ -147,7 +187,7 @@ enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE & "$result = $1;"; #ifdef __cplusplus -%typemap(out) SWIGTYPE "$result = new $1_type($1);"; +%typemap(out) SWIGTYPE "$result = new $1_ltype($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); @@ -243,6 +283,9 @@ %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; + +%rename(__bool__) *::operator bool(); +%rename(__bool__) *::operator bool() const; #endif %insert("lisphead") %{ Modified: trunk/Source/Modules/allegrocl.cxx =================================================================== --- trunk/Source/Modules/allegrocl.cxx 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/Source/Modules/allegrocl.cxx 2008-09-30 19:45:13 UTC (rev 10885) @@ -170,7 +170,7 @@ void add_linked_type(Node *n) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding linked node of type: %s(%s) %s(%x)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); - Swig_print_node(n); + // Swig_print_node(n); #endif if (!first_linked_type) { first_linked_type = n; @@ -757,7 +757,7 @@ Setattr(nn,"kind","class"); Setattr(nn,"sym:name",tok_name); Setattr(nn,"name",tok_key); - Setattr(nn,"allegrocl:package","current_namespace"); + Setattr(nn,"allegrocl:package",current_namespace); add_forward_referenced_type(nn, 0); Printf(ffiType, "%s", get_ffi_type(tok, ""), tok_name); @@ -773,7 +773,8 @@ /* Hash *lookup_res = Swig_typemap_search("ffitype", ty, id, 0); */ #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); + Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); + // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); /* String *id_ref = SwigType_str(ty, id); Printf(stderr, "looking up typemap for %s, found '%s'(%x)\n", id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); @@ -1336,7 +1337,6 @@ // leave these in for now. might want to change these to def-foreign-class at some point. // Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type)); - // Swig_print_node(n); Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n %s)\n", name, lisp_type); Delete(name); @@ -1659,6 +1659,8 @@ Delete(f_clhead); Delete(f_clwrap); + Printf(f_cxx, "%s\n", f_cxx_wrapper); + Close(f_cxx); Delete(f_cxx); Delete(f_cxx_wrapper); @@ -2554,6 +2556,7 @@ int ALLEGROCL::functionWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); + Swig_print_node(n); #endif @@ -2570,11 +2573,13 @@ Delete(resolved); if (!is_void_return) { - String *lresult_init = NewStringf("= (%s)0", raw_return_type); - Wrapper_add_localv(f, "lresult", - SwigType_lstr(SwigType_ltype(return_type), "lresult"), - lresult_init, NIL); - Delete(lresult_init); + String *lresult_init = + NewStringf("= (%s)0", + SwigType_str(SwigType_strip_qualifiers(return_type),0)); + Wrapper_add_localv(f, "lresult", + SwigType_lstr(SwigType_ltype(return_type), "lresult"), + lresult_init, NIL); + Delete(lresult_init); } // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); @@ -2687,14 +2692,15 @@ if (CPlusPlus) { Printf(f->code, " } catch (...) {\n"); if (!is_void_return) - Printf(f->code, " return (%s)0;\n", raw_return_type); + Printf(f->code, " return (%s)0;\n", + SwigType_str(SwigType_strip_qualifiers(return_type),0)); Printf(f->code, " }\n"); } Printf(f->code, "}\n"); /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) - Wrapper_print(f, f_cxx); + Wrapper_print(f, f_cxx_wrapper); String *f_buffer = NewString(""); @@ -2796,8 +2802,9 @@ SwigType_add_qualifier(const_type, "const"); SwigType_add_qualifier(const_type, "static"); - String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "name")); - Printf(f_cxx, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); + String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name")); + // Printf(f_cxx, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); + Printf(f_cxx, "%s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Setattr(n, "name", ppcname); SetFlag(n, "feature:immutable"); @@ -2936,7 +2943,6 @@ int ALLEGROCL::typedefHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In typedefHandler\n"); - // Swig_print_node(n); #endif SwigType *typedef_type = Getattr(n,"type"); @@ -2969,12 +2975,15 @@ String *lookup = lookup_defined_foreign_type(typedef_type); #ifdef ALLEGROCL_TYPE_DEBUG - Printf(stderr, "** lookup='%s'(%x), ff_type='%s', !strstr = '%d'\n", lookup, lookup, ff_type, !Strstr(ff_type,"void")); + Printf(stderr, "** lookup='%s'(%x), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference")); #endif - if(lookup || (!lookup && !Strstr(ff_type,"__SWIGACL_FwdReference"))) + if(lookup || (!lookup && Strcmp(typedef_type,"void")) || + (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) { add_defined_foreign_type(n, 0, type_ref, name); - else add_forward_referenced_type(n); + } else { + add_forward_referenced_type(n); + } #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out typedefHandler\n"); @@ -3000,10 +3009,14 @@ Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); #endif + int result; + if (Generate_Wrapper) - return cppClassHandler(n); + result = cppClassHandler(n); else - return cClassHandler(n); + result = cClassHandler(n); + + return result; } int ALLEGROCL::cClassHandler(Node *n) { @@ -3094,7 +3107,6 @@ Getattr(c, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking at child '%x' of type '%s'\n", c, childType); - Swig_print_node(c); #endif if (!SwigType_isfunction(childType)) Delete(compose_foreign_type(childType)); @@ -3160,11 +3172,21 @@ #endif /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) { - String *mangled_name = mangle_name(n, "ACL_ENUM"); - Printf(f_cxx, "EXPORT const %s %s = %s;\n", Getattr(n, "type"), - mangled_name, Getattr(n, "value")); + SwigType *enum_type = Copy(Getattr(n,"type")); + String *mangled_name = + mangle_name(n, "ACL_ENUM", + in_class ? Getattr(in_class,"name") : + current_namespace); + + SwigType_add_qualifier(enum_type,"const"); + String *enum_decl = SwigType_str(enum_type, mangled_name); + Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl); + Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value")); + Delete(mangled_name); + Delete(enum_type); + Delete(enum_decl); } return SWIG_OK; } Modified: trunk/TODO =================================================================== --- trunk/TODO 2008-09-28 09:36:06 UTC (rev 10884) +++ trunk/TODO 2008-09-30 19:45:13 UTC (rev 10885) @@ -339,6 +339,14 @@ typemaps would be written as Lisp programs that generate Lisp code. +ALLEGROCL +----- +These first three will remove most of the warnings from most of the +remaining checkpartial tests that are failing. +**** Throws typemap support +**** const typemaps +**** long long typemaps + Ocaml ----- ** I've been working with my camlp4 module and type information This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-01 22:52:29
|
Revision: 10896 http://swig.svn.sourceforge.net/swig/?rev=10896&view=rev Author: wsfulton Date: 2008-11-01 22:52:26 +0000 (Sat, 01 Nov 2008) Log Message: ----------- Add the strip encoder patch from Anatoly Techtonik #2130016 Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Source/Swig/misc.c Added Paths: ----------- trunk/Examples/test-suite/python/rename_strip_encoder_runme.py trunk/Examples/test-suite/rename_strip_encoder.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-01 21:48:20 UTC (rev 10895) +++ trunk/CHANGES.current 2008-11-01 22:52:26 UTC (rev 10896) @@ -3,6 +3,20 @@ Version 1.3.37 (in progress) ============================ +2008-11-01: wsfulton + Add the strip encoder patch from Anatoly Techtonik #2130016. This enables an + easy way to rename symbols by stripping a commonly used prefix in all the + function/struct names. It works in the same way as the other encoders, such as + title, lower, command etc outlined in CHANGES file dated 12/30/2005. Example + below will rename wxAnotherWidget to AnotherWidget and wxDoSomething to + DoSomething: + + %rename("%(strip:[wx])s") ""; + + struct wxAnotherWidget { + void wxDoSomething(); + }; + 2008-09-26: mutandiz [allegrocl] Lots of test-suite work. Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2008-11-01 21:48:20 UTC (rev 10895) +++ trunk/Examples/test-suite/common.mk 2008-11-01 22:52:26 UTC (rev 10896) @@ -260,6 +260,7 @@ rename3 \ rename4 \ rename_scope \ + rename_strip_encoder \ restrict_cplusplus \ return_const_value \ return_value_scope \ Added: trunk/Examples/test-suite/python/rename_strip_encoder_runme.py =================================================================== --- trunk/Examples/test-suite/python/rename_strip_encoder_runme.py (rev 0) +++ trunk/Examples/test-suite/python/rename_strip_encoder_runme.py 2008-11-01 22:52:26 UTC (rev 10896) @@ -0,0 +1,6 @@ +from rename_strip_encoder import * + +s = SomeWidget() +a = AnotherWidget() +a.DoSomething() + Added: trunk/Examples/test-suite/rename_strip_encoder.i =================================================================== --- trunk/Examples/test-suite/rename_strip_encoder.i (rev 0) +++ trunk/Examples/test-suite/rename_strip_encoder.i 2008-11-01 22:52:26 UTC (rev 10896) @@ -0,0 +1,16 @@ +%module rename_strip_encoder + +// strip the wx prefix from all identifiers +%rename("%(strip:[wx])s") ""; + +%inline %{ + +class wxSomeWidget { +}; + +struct wxAnotherWidget { + void wxDoSomething() {} +}; + + +%} Modified: trunk/Source/Swig/misc.c =================================================================== --- trunk/Source/Swig/misc.c 2008-11-01 21:48:20 UTC (rev 10895) +++ trunk/Source/Swig/misc.c 2008-11-01 22:52:26 UTC (rev 10896) @@ -927,6 +927,37 @@ /* ----------------------------------------------------------------------------- + * Swig_string_strip() + * + * Strip given prefix from identifiers + * + * Printf(stderr,"%(strip:[wx])s","wxHello") -> Hello + * ----------------------------------------------------------------------------- */ + +String *Swig_string_strip(String *s) { + String *ns; + if (!Len(s)) { + ns = NewString(s); + } else { + const char *cs = Char(s); + const char *ce = Strchr(cs, ']'); + if (*cs != '[' || ce == NULL) { + ns = NewString(s); + } else { + String *fmt = NewStringf("%%.%ds", ce-cs-1); + String *prefix = NewStringf(fmt, cs+1); + if (0 == Strncmp(ce+1, prefix, Len(prefix))) { + ns = NewString(ce+1+Len(prefix)); + } else { + ns = NewString(ce+1); + } + } + } + return ns; +} + + +/* ----------------------------------------------------------------------------- * Swig_string_rxspencer() * * Executes a regexp substitution via the RxSpencer library. For example: @@ -1053,6 +1084,7 @@ DohEncoding("command", Swig_string_command); DohEncoding("rxspencer", Swig_string_rxspencer); DohEncoding("schemify", Swig_string_schemify); + DohEncoding("strip", Swig_string_strip); /* aliases for the case encoders */ DohEncoding("uppercase", Swig_string_upper); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-01 23:09:30
|
Revision: 10897 http://swig.svn.sourceforge.net/swig/?rev=10897&view=rev Author: wsfulton Date: 2008-11-01 23:09:26 +0000 (Sat, 01 Nov 2008) Log Message: ----------- Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy class being reported for Python docstrings when %rename is used Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/python.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-01 22:52:26 UTC (rev 10896) +++ trunk/CHANGES.current 2008-11-01 23:09:26 UTC (rev 10897) @@ -4,6 +4,10 @@ ============================ 2008-11-01: wsfulton + Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy + class being reported for Python docstrings when %rename is used. + +2008-11-01: wsfulton Add the strip encoder patch from Anatoly Techtonik #2130016. This enables an easy way to rename symbols by stripping a commonly used prefix in all the function/struct names. It works in the same way as the other encoders, such as Modified: trunk/Source/Modules/python.cxx =================================================================== --- trunk/Source/Modules/python.cxx 2008-11-01 22:52:26 UTC (rev 10896) +++ trunk/Source/Modules/python.cxx 2008-11-01 23:09:26 UTC (rev 10897) @@ -1341,9 +1341,9 @@ String *str = Getattr(n, "feature:docstring"); if (str == NULL || Len(str) == 0) { if (CPlusPlus) { - Printf(doc, "Proxy of C++ %s class", class_name); + Printf(doc, "Proxy of C++ %s class", real_classname); } else { - Printf(doc, "Proxy of C %s struct", class_name); + Printf(doc, "Proxy of C %s struct", real_classname); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |