From: <ol...@us...> - 2006-12-14 02:16:01
|
Revision: 9613 http://swig.svn.sourceforge.net/swig/?rev=9613&view=rev Author: olly Date: 2006-12-13 18:15:58 -0800 (Wed, 13 Dec 2006) Log Message: ----------- Fix bug #1613673 (bad PHP5 code generated for getters and setters). Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2006-12-09 08:39:22 UTC (rev 9612) +++ trunk/CHANGES.current 2006-12-14 02:15:58 UTC (rev 9613) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +12/14/2006: olly + [php] Fix bug #1613673 (bad PHP5 code generated for getters and + setters). + 12/02/2006: wsfulton, John Lenz, Dave Beazley Move from cvs to Subversion for source control Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2006-12-09 08:39:22 UTC (rev 9612) +++ trunk/Source/Modules/php4.cxx 2006-12-14 02:15:58 UTC (rev 9613) @@ -2325,7 +2325,7 @@ } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); - Printf(s_phpclasses, "\t\tif (function_exists($func) call_user_func($func,$this->%s,$value);\n", SWIG_PTR); + Printf(s_phpclasses, "\t\tif (function_exists($func)) call_user_func($func,$this->%s,$value);\n", SWIG_PTR); } Printf(s_phpclasses, "\t}\n"); /* FIXME: also create __isset for PHP 5.1 and later? */ @@ -2346,7 +2346,7 @@ } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); - Printf(s_phpclasses, "\t\tif (function_exists($func) return call_user_func($func,$this->%s);\n", SWIG_PTR); + Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); } // Reading an unknown property name gives null in PHP. Printf(s_phpclasses, "\t\treturn null;\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2006-12-15 23:50:45
|
Revision: 9621 http://swig.svn.sourceforge.net/swig/?rev=9621&view=rev Author: wsfulton Date: 2006-12-15 15:50:39 -0800 (Fri, 15 Dec 2006) Log Message: ----------- add C# std::string and wchar typemaps Modified Paths: -------------- trunk/CHANGES.current Added Paths: ----------- trunk/Examples/test-suite/csharp/li_std_wstring_runme.cs trunk/Lib/csharp/std_wstring.i trunk/Lib/csharp/wchar.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2006-12-15 23:44:23 UTC (rev 9620) +++ trunk/CHANGES.current 2006-12-15 23:50:39 UTC (rev 9621) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +12/14/2006: wsfulton + [C#] Add std::wstring and wchar_t typemaps + 12/14/2006: olly [php] Fix bug #1613673 (bad PHP5 code generated for getters and setters). Added: trunk/Examples/test-suite/csharp/li_std_wstring_runme.cs =================================================================== --- trunk/Examples/test-suite/csharp/li_std_wstring_runme.cs (rev 0) +++ trunk/Examples/test-suite/csharp/li_std_wstring_runme.cs 2006-12-15 23:50:39 UTC (rev 9621) @@ -0,0 +1,76 @@ +using System; +using li_std_wstringNamespace; + +public class runme +{ + static void Main() + { + char y='h'; + + if (li_std_wstring.test_wcvalue(y) != y) + throw new Exception("bad string mapping:" + li_std_wstring.test_wcvalue(y)); + + if (li_std_wstring.test_wcvalue_w() != 'W') + throw new Exception("bad string mapping:" + li_std_wstring.test_wcvalue_w()); + + string x="hello"; + + if (li_std_wstring.test_ccvalue(x) != x) + throw new Exception("bad string mapping"); + + if (li_std_wstring.test_cvalue(x) != x) + throw new Exception("bad string mapping"); + + + if (li_std_wstring.test_value(x) != x) + throw new Exception("bad string mapping: " + x + li_std_wstring.test_value(x)); + + if (li_std_wstring.test_const_reference(x) != x) + throw new Exception("bad string mapping"); + + + string s = "he"; + s = s + "llo"; + + if (s != x) + throw new Exception("bad string mapping: " + s + x); + + if (li_std_wstring.test_value(s) != x) + throw new Exception("bad string mapping"); + + if (li_std_wstring.test_const_reference(s) != x) + throw new Exception("bad string mapping"); + + string a = s; + + if (li_std_wstring.test_value(a) != x) + throw new Exception("bad string mapping"); + + if (li_std_wstring.test_const_reference(a) != x) + throw new Exception("bad string mapping"); + + string b = " world"; + + if (a + b != "hello world") + throw new Exception("bad string mapping"); + + if (a + " world" != "hello world") + throw new Exception("bad string mapping"); + + if ("hello" + b != "hello world") + throw new Exception("bad string mapping"); + + s = "hello world"; + + B myB = new B("hi"); + + myB.name = "hello"; + if (myB.name != "hello") + throw new Exception("bad string mapping"); + + myB.a = "hello"; + if (myB.a != "hello") + throw new Exception("bad string mapping"); + } +} + Property changes on: trunk/Examples/test-suite/csharp/li_std_wstring_runme.cs ___________________________________________________________________ Name: svn:executable + * Added: trunk/Lib/csharp/std_wstring.i =================================================================== --- trunk/Lib/csharp/std_wstring.i (rev 0) +++ trunk/Lib/csharp/std_wstring.i 2006-12-15 23:50:39 UTC (rev 9621) @@ -0,0 +1,117 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * std_wstring.i + * + * Typemaps for std::wstring and const std::wstring& + * These are mapped to a C# String and are passed around by value. + * + * To use non-const std::wstring references use the following %apply. Note + * that they are passed by value. + * %apply const std::wstring & {std::wstring &}; + * ----------------------------------------------------------------------------- */ + +%include <wchar.i> + +%{ +#include <string> +%} + +namespace std { + +%naturalvar wstring; + +class wstring; + +// wstring +%typemap(ctype, out="void *") wstring "wchar_t *" +%typemap(imtype, inattributes="[MarshalAs(UnmanagedType.LPWStr)]") wstring "string" +%typemap(cstype) wstring "string" +%typemap(csdirectorin) wstring "$iminput" +%typemap(csdirectorout) wstring "$cscall" + +%typemap(in, canthrow=1) wstring +%{ if (!$input) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); + return $null; + } + $1 = std::wstring($input); %} +%typemap(out) wstring %{ $result = SWIG_csharp_wstring_callback($1.c_str()); %} + +%typemap(directorout, canthrow=1) wstring +%{ if (!$input) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); + return $null; + } + $result = std::wstring($input); %} + +%typemap(directorin) wstring %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} + +%typemap(csin) wstring "$csinput" +%typemap(csout, excode=SWIGEXCODE) wstring { + string ret = $imcall;$excode + return ret; + } + +%typemap(typecheck) wstring = wchar_t *; + +%typemap(throws, canthrow=1) wstring +%{ (void)$1; + SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "wstring exception"); + return $null; %} + +// const wstring & +%typemap(ctype, out="void *") const wstring & "wchar_t *" +%typemap(imtype, inattributes="[MarshalAs(UnmanagedType.LPWStr)]") const wstring & "string" +%typemap(cstype) const wstring & "string" + +%typemap(csdirectorin) const wstring & "$iminput" +%typemap(csdirectorout) const wstring & "$cscall" + +%typemap(in, canthrow=1) const wstring & +%{ if (!$input) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); + return $null; + } + std::wstring $1_str($input); + $1 = &$1_str; %} +%typemap(out) const wstring & %{ $result = SWIG_csharp_wstring_callback($1->c_str()); %} + +%typemap(csin) const wstring & "$csinput" +%typemap(csout, excode=SWIGEXCODE) const wstring & { + string ret = $imcall;$excode + return ret; + } + +%typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & +%{ if (!$input) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); + return $null; + } + /* possible thread/reentrant code problem */ + static std::wstring $1_str; + $1_str = $input; + $result = &$1_str; %} + +%typemap(directorin) const wstring & %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} + +%typemap(csvarin, excode=SWIGEXCODE2) const wstring & %{ + set { + $imcall;$excode + } %} +%typemap(csvarout, excode=SWIGEXCODE2) const wstring & %{ + get { + string ret = $imcall;$excode + return ret; + } %} + +%typemap(typecheck) const wstring & = wchar_t *; + +%typemap(throws, canthrow=1) const wstring & +%{ (void)$1; + SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "wstring exception"); + return $null; %} + +} + Property changes on: trunk/Lib/csharp/std_wstring.i ___________________________________________________________________ Name: svn:executable + * Added: trunk/Lib/csharp/wchar.i =================================================================== --- trunk/Lib/csharp/wchar.i (rev 0) +++ trunk/Lib/csharp/wchar.i 2006-12-15 23:50:39 UTC (rev 9621) @@ -0,0 +1,105 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * wchar.i + * + * Typemaps for the wchar_t type + * These are mapped to a C# String and are passed around by value. + * + * Support code for wide strings can be turned off by defining SWIG_CSHARP_NO_WSTRING_HELPER + * + * ----------------------------------------------------------------------------- */ + +#if !defined(SWIG_CSHARP_NO_WSTRING_HELPER) +#if !defined(SWIG_CSHARP_WSTRING_HELPER_) +#define SWIG_CSHARP_WSTRING_HELPER_ +%insert(runtime) %{ +/* Callback for returning strings to C# without leaking memory */ +typedef void * (SWIGSTDCALL* SWIG_CSharpWStringHelperCallback)(const wchar_t *); +static SWIG_CSharpWStringHelperCallback SWIG_csharp_wstring_callback = NULL; +%} + +%pragma(csharp) imclasscode=%{ + protected class SWIGWStringHelper { + + public delegate string SWIGWStringDelegate(IntPtr message); + static SWIGWStringDelegate wstringDelegate = new SWIGWStringDelegate(CreateWString); + + [DllImport("$dllimport", EntryPoint="SWIGRegisterWStringCallback_$module")] + public static extern void SWIGRegisterWStringCallback_$module(SWIGWStringDelegate wstringDelegate); + + static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString) { + return System.Runtime.InteropServices.Marshal.PtrToStringUni(cString); + } + + static SWIGWStringHelper() { + SWIGRegisterWStringCallback_$module(wstringDelegate); + } + } + + static protected SWIGWStringHelper swigWStringHelper = new SWIGWStringHelper(); +%} + +%insert(runtime) %{ +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStringHelperCallback callback) { + SWIG_csharp_wstring_callback = callback; +} +%} +#endif // SWIG_CSHARP_WSTRING_HELPER_ +#endif // SWIG_CSHARP_NO_WSTRING_HELPER + + +// wchar_t +%typemap(ctype) wchar_t "wchar_t" +%typemap(imtype) wchar_t "char" +%typemap(cstype) wchar_t "char" + +%typemap(csin) wchar_t "$csinput" +%typemap(csout, excode=SWIGEXCODE) wchar_t { + char ret = $imcall;$excode + return ret; + } +%typemap(csvarin, excode=SWIGEXCODE2) wchar_t %{ + set { + $imcall;$excode + } %} +%typemap(csvarout, excode=SWIGEXCODE2) wchar_t %{ + get { + char ret = $imcall;$excode + return ret; + } %} + +%typemap(in) wchar_t %{ $1 = ($1_ltype)$input; %} +%typemap(out) wchar_t %{ $result = (wchar_t)$1; %} + +%typemap(typecheck) wchar_t = char; + +// wchar_t * +%typemap(ctype) wchar_t * "wchar_t *" +%typemap(imtype, inattributes="[MarshalAs(UnmanagedType.LPWStr)]", out="IntPtr" ) wchar_t * "string" +%typemap(cstype) wchar_t * "string" + +%typemap(csin) wchar_t * "$csinput" +%typemap(csout, excode=SWIGEXCODE) wchar_t * { + string ret = System.Runtime.InteropServices.Marshal.PtrToStringUni($imcall);$excode + return ret; + } +%typemap(csvarin, excode=SWIGEXCODE2) wchar_t * %{ + set { + $imcall;$excode + } %} +%typemap(csvarout, excode=SWIGEXCODE2) wchar_t * %{ + get { + string ret = $imcall;$excode + return ret; + } %} + +%typemap(in) wchar_t * %{ $1 = ($1_ltype)$input; %} +%typemap(out) wchar_t * %{ $result = (wchar_t *)$1; %} + +%typemap(typecheck) wchar_t * = char *; + Property changes on: trunk/Lib/csharp/wchar.i ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <be...@us...> - 2006-12-19 03:49:19
|
Revision: 9622 http://swig.svn.sourceforge.net/swig/?rev=9622&view=rev Author: beazley Date: 2006-12-18 19:49:17 -0800 (Mon, 18 Dec 2006) Log Message: ----------- File management cleanup. Split API into separate header. Removed unused functions. Added documentation Modified Paths: -------------- trunk/Source/Swig/include.c trunk/Source/Swig/swig.h Added Paths: ----------- trunk/Doc/Devel/file.html trunk/Source/Swig/swigfile.h Added: trunk/Doc/Devel/file.html =================================================================== --- trunk/Doc/Devel/file.html (rev 0) +++ trunk/Doc/Devel/file.html 2006-12-19 03:49:17 UTC (rev 9622) @@ -0,0 +1,185 @@ +<html> +<head> +<title>SWIG File Handling</title> +</head> + +<body> +<center> +<h1>SWIG File Handling</h1> + +<p> +David M. Beazley <br> +da...@da...<br> + +</b> +</center> + +<h2>Introduction</h2> + +This document describes the functions related to file and filename handling in the SWIG core. These functions are +defined in the header file <tt>Source/Swig/swigfile.h</tt>. This API is considered to be stable. + +<h2>File Search Path</h2> + +These functions manipulate the search path for locating files. + +<p> +<b><tt>List *Swig_add_directory(const String_or_char *dirname)</tt></b> + +<blockquote> +Adds a new directory to the system search path. The directory is appended to +the end of the search path. Returns a list containing the current +system search path. +</blockquote> + +<p> +<b><tt>void Swig_push_directory(const String_or_char *dirname)</tt></b> +<blockquote> +Pushs a temporary directory onto the search path. This directory is searched before +directories added with <tt>Swig_add_directory()</tt> except when including a system +file explicitly (either using #include <file> or calling <tt>Swig_include_sys()</tt>). +This function is normally used by the preprocessor to add temporary directories when +processing #include statements. +</blockquote> + +<p> +<b><tt>void Swig_pop_directory()</tt></b> +<blockquote> +Pops off the last pushed directory with <tt>Swig_push_directory()</tt> +</blockquote> + +<p> +<b><tt>int Swig_get_push_dir()</tt></b> + +<blockquote> +Returns a flag that indicates whether directory pushing is enabled or not. +</blockquote> + +<p> +<b><tt>void Swig_set_push_dir(int dopush)</tt></b> +<blockquote> +Enables or disables directory pushing. By default, it is turned on. However, the <tt>-I-</tt> command line +option to SWIG disables it. +</blockquote> + +<p> +<b><tt>List *Swig_search_path()</tt></b> +<blockquote> +Returns the current search path. +</blockquote> + + +<h2>File access functions</h2> + +<p> +<b><tt>FILE *Swig_open(const String_or_char *name)</tt></b> + +<blockquote> +Opens a file, using the applicable search paths, and returns an open <tt>FILE *</tt> object if found. Returns NULL if the file is not found. +</blockquote> + +<p> +<b><tt>String *Swig_read_file(FILE *f)</tt></b> + +<blockquote> +Reads all of the data from an open file into a string which is returned. +</blockquote> + +<p> +<b><tt>String *Swig_include(const String_or_char *name)</tt></b> + +<blockquote> +Searches for an include file <tt>name</tt> and returns its contents as +a string if found. Returns NULL if not found. All of the applicable +search paths are searched when trying to locate the file. +</blockquote> + +<p> +<b><tt>String *Swig_include_sys(const String_or_char *name)</tt></b> + +<blockquote> +Searches for an include file <tt>name</tt> and returns its contents as +a string if found. Returns NULL if not found. All of the applicable +search paths are searched when trying to locate the file, but +preference is given to system paths first. This mimics the behavior +of <tt>#include <file></tt> in the preprocessor. +</blockquote> + +<p> +<b><tt>int Swig_insert_file(const String_or_char *name, File *outfile)</tt></b> + +<blockquote> +Searches for a file <tt>name</tt> and dumps its contents to <tt>outfile</tt> if found. +Returns 0 on sucesss, -1 if the file couldn't be found. +</blockquote> + +<h2>Query functions</h2> + +<p> +<b><tt>String *Swig_last_file()</tt></b> + +<blockquote> +Returns the full pathname of the file last opened or included. +</blockquote> + +<h2>Named files</h2> + +<p> +<b><tt>void *Swig_register_filebyname(const String_or_char *filename, File *outfile)</tt></b> + +<blockquote> +Registers a file object <tt>outfile</tt> with a specific name <tt>filename</tt>. This function is +used to implement the SWIG %insert directive and to manage different sections of the output +file such as "runtime","header","wrapper","init", etc. Different language modules may add their own +sections for generating Python code, Perl code, etc. +</blockquote> + +<p> +<b><tt>File *Swig_filebyname(const String_or_char *filename)</tt></b> +<blockquote> +This looks up a file object previously registered using <tt>Swig_register_filebyname()</tt>. This +is used to implement the %insert directive. +</blockquote> + +<h2>Filename utilities</h2> + +<p> +<b><tt>char *Swig_file_suffix(const String_or_char *filename)</tt></b> +<blockquote> +Returns the suffix of a filename. For instance, if the filename is "foo.txt", it returns ".txt". +</blockquote> + +<p> +<b><tt>char *Swig_file_basename(const String_or_char *filename)</tt></b> +<blockquote> +Returns the filename without the suffix attached to it. For instance, if the filename is "foo.txt", it returns +"foo". The result is stored in a static variable. If you need to save it, make your own copy. +</blockquote> + +<p> +<b><tt>char *Swig_file_filename(const String_or_char *filename)</tt></b> +<blockquote> +Returns the filename without any leading directories. For instance, if the filename is "/bar/spam/foo.txt", it +returns "foo.txt". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy. +</blockquote> + +<p> +<b><tt>char *Swig_file_dirname(const String_or_char *filename)</tt></b> +<blockquote> +Returns the directory name (if any). For instance, if the filename is "/bar/spam/foo.txt", it +returns "/bar/spam/". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy. +</blockquote> + +<p> +<b><tt>SWIG_FILE_DELIMETER</tt></b> +<blockquote> +This macro contains the file delimeter string for the local machine. On unix it is "/", on Windows it is "\\". +</blockquote> + +</body> +</html> + + + + + Modified: trunk/Source/Swig/include.c =================================================================== --- trunk/Source/Swig/include.c 2006-12-15 23:50:39 UTC (rev 9621) +++ trunk/Source/Swig/include.c 2006-12-19 03:49:17 UTC (rev 9622) @@ -12,15 +12,13 @@ char cvsroot_include_c[] = "$Id$"; #include "swig.h" -#include "swigkeys.h" /* Delimeter used in accessing files and directories */ -static List *directories = 0; /* List of include directories */ -static String *lastpath = 0; /* Last file that was included */ -static String *swiglib = 0; /* Location of SWIG library */ -static String *lang_config = 0; /* Language configuration file */ -static int dopush = 1; /* Whether to push directories */ +static List *directories = 0; /* List of include directories */ +static String *lastpath = 0; /* Last file that was included */ +static List *pdirectories = 0; /* List of pushed directories */ +static int dopush = 1; /* Whether to push directories */ /* This functions determine whether to push/pop dirs in the preprocessor */ void Swig_set_push_dir(int push) { @@ -31,59 +29,25 @@ return dopush; } - -/* This function sets the name of the configuration file */ - -void Swig_set_config_file(const String_or_char *filename) { - lang_config = NewString(filename); -} - -String *Swig_get_config_file() { - return lang_config; -} - - /* ----------------------------------------------------------------------------- - * Swig_swiglib_set() - * Swig_swiglib_get() - * - * Set the location of the SWIG library. This isn't really used, by the - * include mechanism, but rather as a query interface for language modules. - * ----------------------------------------------------------------------------- */ - -void Swig_swiglib_set(const String_or_char *sl) { - swiglib = NewString(sl); -} - -String *Swig_swiglib_get() { - return swiglib; -} - -/* ----------------------------------------------------------------------------- * Swig_add_directory() * * Adds a directory to the SWIG search path. * ----------------------------------------------------------------------------- */ List *Swig_add_directory(const String_or_char *dirname) { + String *adirname; if (!directories) directories = NewList(); assert(directories); if (dirname) { - String *sdir = NewString(dirname); - Hash *dir = NewHash(); - assert(dir); - SetFlag(dir, k_sysdir); - Setattr(dir, k_name, sdir); - Append(directories, dir); - Delete(dir); - Delete(sdir); + adirname = NewString(dirname); + Append(directories,adirname); + Delete(adirname); } return directories; } - - /* ----------------------------------------------------------------------------- * Swig_push_directory() * @@ -92,23 +56,16 @@ * ----------------------------------------------------------------------------- */ void Swig_push_directory(const String_or_char *dirname) { - String *tmp = 0; + String *pdirname; if (!Swig_get_push_dir()) return; - if (!directories) - directories = NewList(); - assert(directories); - if (!DohIsString(dirname)) { - dirname = tmp = NewString(dirname); - assert(dirname); - } - if (dirname) { - Hash *dir = NewHash(); - Setattr(dir, k_name, dirname); - Insert(directories, 0, dir); - if (tmp) - Delete(tmp); - } + if (!pdirectories) + pdirectories = NewList(); + assert(pdirectories); + pdirname = NewString(dirname); + assert(pdirname); + Insert(pdirectories,0,pdirname); + Delete(pdirname); } /* ----------------------------------------------------------------------------- @@ -121,9 +78,9 @@ void Swig_pop_directory() { if (!Swig_get_push_dir()) return; - if (!directories) + if (!pdirectories) return; - Delitem(directories, 0); + Delitem(pdirectories, 0); } /* ----------------------------------------------------------------------------- @@ -145,11 +102,9 @@ static List *Swig_search_path_any(int syspath) { String *filename; - String *dirname; - List *slist, *llist; - int i, ilen; + List *slist; + int i, ilen; - llist = 0; slist = NewList(); assert(slist); filename = NewStringEmpty(); @@ -159,43 +114,33 @@ #else Printf(filename, ".%s", SWIG_FILE_DELIMETER); #endif - if (syspath) { - llist = NewList(); - assert(llist); - Append(llist, filename); - } else { - Append(slist, filename); + Append(slist, filename); + Delete(filename); + + /* If there are any pushed directories. Add them first */ + if (pdirectories) { + ilen = Len(pdirectories); + for (i = 0; i < ilen; i++) { + filename = NewString(Getitem(pdirectories,i)); + StringAppend(filename,SWIG_FILE_DELIMETER); + Append(slist,filename); + Delete(filename); + } } + /* Add system directories next */ ilen = Len(directories); for (i = 0; i < ilen; i++) { - int issimple = 0; - dirname = Getitem(directories, i); - filename = NewStringEmpty(); - assert(filename); - if (DohIsString(dirname)) { - filename = Copy(dirname); - issimple = 1; + filename = NewString(Getitem(directories,i)); + StringAppend(filename,SWIG_FILE_DELIMETER); + if (syspath) { + /* If doing a system include, put the system directories first */ + Insert(slist,i,filename); } else { - filename = Copy(Getattr(dirname, k_name)); + /* Otherwise, just put the system directories after the pushed directories (if any) */ + Append(slist,filename); } - StringAppend(filename, SWIG_FILE_DELIMETER); - - if (syspath && (issimple || !GetFlag(dirname, k_sysdir))) { - Append(llist, filename); - } else { - Append(slist, filename); - /* Insert(slist,0,filename); */ - } Delete(filename); } - if (syspath) { - int ilen = Len(llist); - for (i = 0; i < ilen; i++) { - Append(slist, Getitem(llist, i)); - } - Delete(llist); - } - return slist; } @@ -278,7 +223,6 @@ StringAppend(str, "\n"); } } - return str; } @@ -314,7 +258,6 @@ return Swig_include_any(name, 1); } - /* ----------------------------------------------------------------------------- * Swig_insert_file() * Modified: trunk/Source/Swig/swig.h =================================================================== --- trunk/Source/Swig/swig.h 2006-12-15 23:50:39 UTC (rev 9621) +++ trunk/Source/Swig/swig.h 2006-12-19 03:49:17 UTC (rev 9622) @@ -92,39 +92,11 @@ #define T_SYMBOL 98 #define T_ERROR 99 + /* --- File interface --- */ - extern List *Swig_add_directory(const String_or_char *dirname); - extern void Swig_push_directory(const String_or_char *dirname); - extern void Swig_pop_directory(); - extern String *Swig_last_file(); - extern List *Swig_search_path(); - extern FILE *Swig_open(const String_or_char *name); - extern String *Swig_read_file(FILE *f); - extern String *Swig_include(const String_or_char *name); - extern String *Swig_include_sys(const String_or_char *name); - extern int Swig_insert_file(const String_or_char *name, File *outfile); - extern void Swig_set_config_file(const String_or_char *filename); - extern String *Swig_get_config_file(void); - extern void Swig_set_push_dir(int dopush); - extern int Swig_get_push_dir(void); - extern void Swig_swiglib_set(const String_or_char *); - extern String *Swig_swiglib_get(); - extern void Swig_register_filebyname(const String_or_char *filename, File *outfile); - extern File *Swig_filebyname(const String_or_char *filename); - extern char *Swig_file_suffix(const String_or_char *filename); - extern char *Swig_file_basename(const String_or_char *filename); - extern char *Swig_file_filename(const String_or_char *filename); - extern char *Swig_file_dirname(const String_or_char *filename); +#include "swigfile.h" -#if defined(MACSWIG) -# define SWIG_FILE_DELIMETER ":" -#elif defined(_WIN32) -# define SWIG_FILE_DELIMETER "\\" -#else -# define SWIG_FILE_DELIMETER "/" -#endif - /* --- Command line parsing --- */ extern void Swig_init_args(int argc, char **argv); Added: trunk/Source/Swig/swigfile.h =================================================================== --- trunk/Source/Swig/swigfile.h (rev 0) +++ trunk/Source/Swig/swigfile.h 2006-12-19 03:49:17 UTC (rev 9622) @@ -0,0 +1,37 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * swigfile.h + * + * File handling functions in the SWIG core + * ----------------------------------------------------------------------------- */ + +/* $Id: swig.h 9603 2006-12-05 21:47:01Z beazley $ */ + +extern List *Swig_add_directory(const String_or_char *dirname); +extern void Swig_push_directory(const String_or_char *dirname); +extern void Swig_pop_directory(); +extern String *Swig_last_file(); +extern List *Swig_search_path(); +extern FILE *Swig_open(const String_or_char *name); +extern String *Swig_read_file(FILE *f); +extern String *Swig_include(const String_or_char *name); +extern String *Swig_include_sys(const String_or_char *name); +extern int Swig_insert_file(const String_or_char *name, File *outfile); +extern void Swig_set_push_dir(int dopush); +extern int Swig_get_push_dir(void); +extern void Swig_register_filebyname(const String_or_char *filename, File *outfile); +extern File *Swig_filebyname(const String_or_char *filename); +extern char *Swig_file_suffix(const String_or_char *filename); +extern char *Swig_file_basename(const String_or_char *filename); +extern char *Swig_file_filename(const String_or_char *filename); +extern char *Swig_file_dirname(const String_or_char *filename); + +#if defined(MACSWIG) +# define SWIG_FILE_DELIMETER ":" +#elif defined(_WIN32) +# define SWIG_FILE_DELIMETER "\\" +#else +# define SWIG_FILE_DELIMETER "/" +#endif Property changes on: trunk/Source/Swig/swigfile.h ___________________________________________________________________ Name: svn:needs-lock + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2006-12-20 23:09:04
|
Revision: 9624 http://swig.svn.sourceforge.net/swig/?rev=9624&view=rev Author: wsfulton Date: 2006-12-20 15:09:01 -0800 (Wed, 20 Dec 2006) Log Message: ----------- Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/lang.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2006-12-19 21:27:34 UTC (rev 9623) +++ trunk/CHANGES.current 2006-12-20 23:09:01 UTC (rev 9624) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +12/20/2006: wsfulton + Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. + 12/14/2006: wsfulton [C#] Add std::wstring and wchar_t typemaps Modified: trunk/Source/Modules/lang.cxx =================================================================== --- trunk/Source/Modules/lang.cxx 2006-12-19 21:27:34 UTC (rev 9623) +++ trunk/Source/Modules/lang.cxx 2006-12-20 23:09:01 UTC (rev 9624) @@ -435,14 +435,16 @@ if (!nvar) { /* look for feature in the class */ SwigType *ty = Getattr(n, "type"); - if (SwigType_isclass(ty)) { + SwigType *fullty = SwigType_typedef_resolve_all(ty); + if (SwigType_isclass(fullty)) { Node *m = Copy(n); - SwigType *tys = SwigType_strip_qualifiers(ty); + SwigType *tys = SwigType_strip_qualifiers(fullty); Swig_features_get(Swig_cparse_features(), 0, tys, 0, m); nvar = GetFlag(m, "feature:naturalvar"); Delete(tys); Delete(m); } + Delete(fullty); } return nvar ? CWRAP_NATURAL_VAR : 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2006-12-21 04:53:15
|
Revision: 9626 http://swig.svn.sourceforge.net/swig/?rev=9626&view=rev Author: mgossage Date: 2006-12-20 20:53:12 -0800 (Wed, 20 Dec 2006) Log Message: ----------- making setting immutables an error Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Lua.html trunk/Examples/lua/variables/runme.lua trunk/Examples/test-suite/lua/li_std_string_runme.lua trunk/Lib/lua/luarun.swg trunk/Source/Modules/lua.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/CHANGES.current 2006-12-21 04:53:12 UTC (rev 9626) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +12/21/2006: mgossage + [Lua] Update to throw errors when setting immutables, + and allowing user addition of module variables. + 12/20/2006: wsfulton Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. Modified: trunk/Doc/Manual/Lua.html =================================================================== --- trunk/Doc/Manual/Lua.html 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/Doc/Manual/Lua.html 2006-12-21 04:53:12 UTC (rev 9626) @@ -311,21 +311,40 @@ 4 </pre></div> <p> -If a variable is marked with the immutable directive then any attempts to set this variable are silently ignored. +If a variable is marked with the %immutable directive then any attempts to set this variable will cause an lua error. Given a global variable: </p> + +<div class="code"><pre>%module example +%immutable; +extern double Foo; +%mutable; +</pre></div> <p> -Another interesting feature is that it is not possible to add new values into the module from within the interpreter, this is because of the metatable to deal with global variables. It is possible (though not recommended) to use rawset() to add a new value. +SWIG will generate the <tt>example.Foo_get()</tt> but instead of a set function an error function will be called instead. </p> <div class="targetlang"><pre> +> print(e.Foo) -- reading works ok +4 +> example.Foo=40 -- but writing does not +This variable is immutable +stack traceback: + [C]: ? + [C]: ? + stdin:1: in main chunk + [C]: ? +</pre></div> +<p> +For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the lua bindings did), adding a <tt>-DSWIGLUA_IGNORE_SET_IMMUTABLE</tt> compile option will remove this. +</p> +<p> +Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This does allow the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so. +</p> +<div class="targetlang"><pre> > -- example.PI does not exist > print(example.PI) nil -> example.PI=3.142 -- assign failed, example.PI does still not exist +> example.PI=3.142 -- new value added > print(example.PI) -nil -> -- a rawset will work, after this the value is added -> rawset(example,"PI",3.142) -> print(example.PI) 3.142 </pre></div> @@ -426,7 +445,7 @@ Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG creates some accessor/mutator functions <tt>Point_set_x()</tt> and <tt>Point_get_x()</tt>. These will be wrappered, and then added to the metatable added to the userdata. This provides the natural access to the member variables that were shown above (see end of the document for full details). </p> <p> -<tt>const</tt> members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutable's, setting attempts will be silently ignored. For example: +<tt>const</tt> members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutable's, setting attempts will be cause an error. For example: </p> <div class="code"><pre>struct Foo { ... @@ -999,7 +1018,8 @@ if not s then return end local f=s[name] -- looks for the function -- calls it to set the value - if type(f)=="function" then f(value) end + if type(f)=="function" then f(value) + else rawset(mod,name,value) end end </pre></div> <p> Modified: trunk/Examples/lua/variables/runme.lua =================================================================== --- trunk/Examples/lua/variables/runme.lua 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/Examples/lua/variables/runme.lua 2006-12-21 04:53:12 UTC (rev 9626) @@ -55,15 +55,20 @@ print "\nNow I'm going to try and modify some read only variables"; print " Tring to set 'path' to 'Whoa!'"; -example.path = "Whoa!" -print " This request was silently ignored by Lua. " -print " But the data has not been changed" -print("path =", example.path) +if pcall(function() example.path = "Whoa!" end)==true then + print " Thats funny, it didn't give an error!" +else + print " It gave an error, as it should" +end +print(" Just checking the value: path =", example.path) print " Trying to set 'status' to '0'"; - example.status = 0 -print " Again silently ignored" -print("status =", example.status) +if pcall(function() example.status = 0 end)==true then + print " Thats funny, it didn't give an error!" +else + print " It gave an error, as it should" +end +print(" Just checking the value: status =", example.status) print "\nI'm going to try and update a structure variable.\n" Modified: trunk/Examples/test-suite/lua/li_std_string_runme.lua =================================================================== --- trunk/Examples/test-suite/lua/li_std_string_runme.lua 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/Examples/test-suite/lua/li_std_string_runme.lua 2006-12-21 04:53:12 UTC (rev 9626) @@ -85,8 +85,8 @@ assert(type(struc.MemberString2)=="string") -- typemaps make this a string assert(type(struc.ConstMemberString)=="string") --- set them -struc.ConstMemberString="c" -- silently ignored +-- set a const (should fail with error) +assert(pcall(function () struc.ConstMemberString="c" end)==false) --print(struc.MemberString:data(),struc.MemberString2,struc.ConstMemberString:data()) --check type again @@ -100,9 +100,9 @@ assert(type(li_std_string.Structure_StaticMemberString2)=="string") assert(type(li_std_string.Structure_ConstStaticMemberString)=="string") --- try setting +-- try setting (should fail with error) --li_std_string.Structure_StaticMemberString2='e' -li_std_string.Structure_ConstStaticMemberString='f' -- silently ignored +assert(pcall(function () li_std_string.Structure_ConstStaticMemberString='f' end)==false) --[[print(li_std_string.Structure_StaticMemberString:data(), li_std_string.Structure_StaticMemberString2, li_std_string.Structure_ConstStaticMemberString:data())]] @@ -111,4 +111,3 @@ assert(type(li_std_string.Structure_StaticMemberString)=="string") assert(type(li_std_string.Structure_StaticMemberString2)=="string") assert(type(li_std_string.Structure_ConstStaticMemberString)=="string") - Modified: trunk/Lib/lua/luarun.swg =================================================================== --- trunk/Lib/lua/luarun.swg 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/Lib/lua/luarun.swg 2006-12-21 04:53:12 UTC (rev 9626) @@ -125,13 +125,27 @@ #ifdef __cplusplus /* Special helper for member function pointers it gets the address, casts it, then dereferences it */ -#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) +//#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) #endif /* ----------------------------------------------------------------------------- * global variable support code: modules * ----------------------------------------------------------------------------- */ +/* this function is called when trying to set an immutable. +default value is to print an error. +This can removed with a compile flag SWIGLUA_IGNORE_SET_IMMUTABLE */ +SWIGINTERN int SWIG_Lua_set_immutable(lua_State* L) +{ +/* there should be 1 param passed in: the new value */ +#ifndef SWIGLUA_IGNORE_SET_IMMUTABLE + lua_pop(L,1); /* remove it */ + lua_pushstring(L,"This variable is immutable"); + lua_error(L); +#endif + return 0; /* should not return anything */ +} + /* the module.get method used for getting linked data */ SWIGINTERN int SWIG_Lua_module_get(lua_State* L) { @@ -192,10 +206,11 @@ lua_call(L,1,0); return 0; } - lua_pop(L,1); /* remove the top */ } - lua_pop(L,1); /* remove the .set */ - return 0; + lua_settop(L,3); /* reset back to start */ + /* we now have the table, key & new value, so just set directly */ + lua_rawset(L,1); /* add direct */ + return 0; } /* registering a module in lua */ Modified: trunk/Source/Modules/lua.cxx =================================================================== --- trunk/Source/Modules/lua.cxx 2006-12-20 23:11:09 UTC (rev 9625) +++ trunk/Source/Modules/lua.cxx 2006-12-21 04:53:12 UTC (rev 9626) @@ -678,18 +678,27 @@ NEW LANGUAGE NOTE:END ************************************************/ REPORT("variableWrapper", n); String *iname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); // let SWIG generate the wrappers int result = Language::variableWrapper(n); // normally SWIG will generate 2 wrappers, a get and a set // but in certain scenarios (immutable, or if its arrays), it will not String *getName = Swig_name_wrapper(Swig_name_get(iname)); String *setName = 0; - if (is_assignable(n) == false || SwigType_isarray(type)) { + // checking whether it can be set to or not appears to be a very error prone issue + // I refered to the Language::variableWrapper() to find this out + bool assignable=is_assignable(n); + SwigType *type = Getattr(n, "type"); + String *tm = Swig_typemap_lookup_new("globalin", n, iname, 0); + if (!tm && SwigType_isarray(type)) + assignable=false; + Delete(tm); + + if (assignable) { + setName = Swig_name_wrapper(Swig_name_set(iname)); + } else { // TODO: how about calling a 'this is not settable' error message? - setName = NewString("0"); - } else { - setName = Swig_name_wrapper(Swig_name_set(iname)); + setName = NewString("SWIG_Lua_set_immutable"); // error message + //setName = NewString("0"); } // register the variable Printf(s_var_tab, "%s{ \"%s\", %s, %s },\n", tab4, iname, getName, setName); @@ -960,20 +969,19 @@ virtual int membervariableHandler(Node *n) { // REPORT("membervariableHandler",n); String *symname = Getattr(n, "sym:name"); - String *rname; + String *gname, *sname; Language::membervariableHandler(n); - Printv(s_attr_tab, tab4, "{ \"", symname, "\",", NIL); - rname = Swig_name_wrapper(Swig_name_get(Swig_name_member(class_name, symname))); - Printv(s_attr_tab, rname, ", ", NIL); - Delete(rname); + gname = Swig_name_wrapper(Swig_name_get(Swig_name_member(class_name, symname))); if (!GetFlag(n, "feature:immutable")) { - rname = Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name, symname))); - Printv(s_attr_tab, rname, "},\n", NIL); - Delete(rname); + sname = Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name, symname))); } else { - Printf(s_attr_tab, "0 },\n"); + //sname = NewString("0"); + sname = NewString("SWIG_Lua_set_immutable"); // error message } + Printf(s_attr_tab,"%s{ \"%s\", %s, %s},\n",tab4,symname,gname,sname); + Delete(gname); + Delete(sname); return SWIG_OK; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2006-12-26 10:15:45
|
Revision: 9628 http://swig.svn.sourceforge.net/swig/?rev=9628&view=rev Author: mgossage Date: 2006-12-26 02:15:35 -0800 (Tue, 26 Dec 2006) Log Message: ----------- Added more STL (more exceptions, map, size_t), fixed test case: conversion_ns_template. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/lua/luatypemaps.swg trunk/Lib/lua/std_except.i trunk/Source/Modules/lua.cxx Added Paths: ----------- trunk/Lib/lua/std_common.i trunk/Lib/lua/std_map.i trunk/Lib/lua/stl.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2006-12-24 00:09:06 UTC (rev 9627) +++ trunk/CHANGES.current 2006-12-26 10:15:35 UTC (rev 9628) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +12/26/2006: mgossage + [Lua] Added more STL (more exceptions, map, size_t), + fixed test case: conversion_ns_template. + 12/21/2006: mgossage [Lua] Update to throw errors when setting immutables, and allowing user addition of module variables. Modified: trunk/Lib/lua/luatypemaps.swg =================================================================== --- trunk/Lib/lua/luatypemaps.swg 2006-12-24 00:09:06 UTC (rev 9627) +++ trunk/Lib/lua/luatypemaps.swg 2006-12-26 10:15:35 UTC (rev 9628) @@ -43,6 +43,9 @@ %typemap(out) enum SWIGTYPE %{ lua_pushnumber(L, (lua_Number)(int)($1)); SWIG_arg++;%} +// size_t (which is just a unsigned long +%apply unsigned long { size_t }; + // boolean (which is a special type in lua) // note: 1 & 0 are not booleans in lua, only true & false %typemap(in,checkfn="lua_isboolean") bool @@ -209,7 +212,8 @@ const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE, float, double, - const float &, const double & + const float &, const double&, + size_t,const size_t& { $1 = lua_isnumber(L,$input); } @@ -301,7 +305,9 @@ SWIG_NUMBER_BY_CONST_REF(signed long long); SWIG_NUMBER_BY_CONST_REF(unsigned long long); +%apply const unsigned long & { const size_t & }; + // Also needed for object ptrs by const ref // eg const A* ref_pointer(A* const& a); // found in mixed_types.i Added: trunk/Lib/lua/std_common.i =================================================================== --- trunk/Lib/lua/std_common.i (rev 0) +++ trunk/Lib/lua/std_common.i 2006-12-26 10:15:35 UTC (rev 9628) @@ -0,0 +1,5 @@ +%include <std_except.i> + +%apply size_t { std::size_t }; +%apply const size_t& { const std::size_t& }; + Modified: trunk/Lib/lua/std_except.i =================================================================== --- trunk/Lib/lua/std_except.i 2006-12-24 00:09:06 UTC (rev 9627) +++ trunk/Lib/lua/std_except.i 2006-12-26 10:15:35 UTC (rev 9628) @@ -15,11 +15,29 @@ %} %include <exception.i> -%typemap(throws) std::out_of_range %{ -SWIG_exception(SWIG_IndexError, $1.what()); %} +namespace std +{ + %ignore exception; // not sure if I should ignore this... + class exception + { + public: + exception() throw() { } + virtual ~exception() throw(); + virtual const char* what() const throw(); + }; +} -%typemap(throws) std::exception %{ -SWIG_exception(SWIG_SystemError, $1.what()); %} - -%typemap(throws) std::exception& %{ -SWIG_exception(SWIG_SystemError, ($1)->what()); %} +// normally object whihc are thrown are returned to interpreter as errors +// (which potentally may have problems if they are not copied) +// therefore all classes based upon std::exception are converted to their strings & returned as errors +%typemap(throws) std::bad_exception "SWIG_exception(SWIG_RuntimeError, $1.what());" +%typemap(throws) std::domain_error "SWIG_exception(SWIG_ValueError, $1.what());" +%typemap(throws) std::exception "SWIG_exception(SWIG_SystemError, $1.what());" +%typemap(throws) std::invalid_argument "SWIG_exception(SWIG_ValueError, $1.what());" +%typemap(throws) std::length_error "SWIG_exception(SWIG_IndexError, $1.what());" +%typemap(throws) std::logic_error "SWIG_exception(SWIG_RuntimeError, $1.what());" +%typemap(throws) std::out_of_range "SWIG_exception(SWIG_IndexError, $1.what());" +%typemap(throws) std::overflow_error "SWIG_exception(SWIG_OverflowError, $1.what());" +%typemap(throws) std::range_error "SWIG_exception(SWIG_IndexError, $1.what());" +%typemap(throws) std::runtime_error "SWIG_exception(SWIG_RuntimeError, $1.what());" +%typemap(throws) std::underflow_error "SWIG_exception(SWIG_RuntimeError, $1.what());" Added: trunk/Lib/lua/std_map.i =================================================================== --- trunk/Lib/lua/std_map.i (rev 0) +++ trunk/Lib/lua/std_map.i 2006-12-26 10:15:35 UTC (rev 9628) @@ -0,0 +1,63 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * std_map.i + * + * SWIG typemaps for std::map + * ----------------------------------------------------------------------------- */ + +%include <std_common.i> + +// ------------------------------------------------------------------------ +// std::map +// ------------------------------------------------------------------------ + +%{ +#include <map> +#include <algorithm> +#include <stdexcept> +%} + +// exported class + +namespace std { + + template<class K, class T> class map { + // add typemaps here + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef K key_type; + typedef T mapped_type; + map(); + map(const map<K,T> &); + + unsigned int size() const; + bool empty() const; + void clear(); + %extend { + const T& get(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + return i->second; + else + throw std::out_of_range("key not found"); + } + void set(const K& key, const T& x) { + (*self)[key] = x; + } + void del(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + self->erase(i); + else + throw std::out_of_range("key not found"); + } + bool has_key(const K& key) { + std::map<K,T >::iterator i = self->find(key); + return i != self->end(); + } + } + }; +} Added: trunk/Lib/lua/stl.i =================================================================== --- trunk/Lib/lua/stl.i (rev 0) +++ trunk/Lib/lua/stl.i 2006-12-26 10:15:35 UTC (rev 9628) @@ -0,0 +1,13 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * stl.i + * ----------------------------------------------------------------------------- */ + +%include <std_common.i> +%include <std_string.i> +%include <std_vector.i> +%include <std_map.i> +%include <std_pair.i> + Modified: trunk/Source/Modules/lua.cxx =================================================================== --- trunk/Source/Modules/lua.cxx 2006-12-24 00:09:06 UTC (rev 9627) +++ trunk/Source/Modules/lua.cxx 2006-12-26 10:15:35 UTC (rev 9628) @@ -52,7 +52,7 @@ #define REPORT(T,D) // no info: //#define REPORT(T,D) {Printf(stdout,T"\n");} // only title //#define REPORT(T,D) {Printf(stdout,T"\n");display_mapping(D);} // the works -//#define REPORT(T,D) {Printf(stdout,T"\n");Swig_print_node(D);} // the works +//#define REPORT(T,D) {Printf(stdout,T"\n");if(D)Swig_print_node(D);} // the works void display_mapping(DOH *d) { if (d == 0 || !DohIsMapping(d)) @@ -107,6 +107,7 @@ int have_destructor; String *destructor_action; String *class_name; + String *constructor_name; public: @@ -126,7 +127,6 @@ PrefixPlusUnderscore = 0; s_cmd_tab = s_var_tab = s_const_tab = 0; - } /* NEW LANGUAGE NOTE:*********************************************** @@ -321,7 +321,7 @@ String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); - +//Printf(stdout,"functionWrapper %s %s\n",name,iname); Parm *p; String *tm; int i; @@ -332,7 +332,10 @@ overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) + { + Printf(stderr,"addSymbol(%s) failed\n",iname); return SWIG_ERROR; + } } /* NEW LANGUAGE NOTE:*********************************************** @@ -676,7 +679,7 @@ ideally we should not have registered these as functions, only WRT this variable will look into this later. NEW LANGUAGE NOTE:END ************************************************/ - REPORT("variableWrapper", n); +// REPORT("variableWrapper", n); String *iname = Getattr(n, "sym:name"); // let SWIG generate the wrappers int result = Language::variableWrapper(n); @@ -696,7 +699,7 @@ if (assignable) { setName = Swig_name_wrapper(Swig_name_set(iname)); } else { - // TODO: how about calling a 'this is not settable' error message? + // how about calling a 'this is not settable' error message? setName = NewString("SWIG_Lua_set_immutable"); // error message //setName = NewString("0"); } @@ -711,7 +714,7 @@ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { - REPORT("constantWrapper", n); +// REPORT("constantWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); //String *nsname = !nspace ? Copy(iname) : NewStringf("%s::%s",ns_name,iname); @@ -758,7 +761,7 @@ * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { - REPORT("nativeWrapper", n); +// REPORT("nativeWrapper", n); String *symname = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) @@ -803,6 +806,7 @@ String *mangled_classname = 0; String *real_classname = 0; + constructor_name = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; @@ -925,10 +929,13 @@ Printv(f_wrappers, "swig_lua_class _wrap_class_", mangled_classname, " = { \"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { - Printf(f_wrappers, "%s", Swig_name_wrapper(Swig_name_construct(class_name))); + Printf(f_wrappers, "%s", Swig_name_wrapper(Swig_name_construct(constructor_name))); + Delete(constructor_name); + constructor_name = 0; } else { Printf(f_wrappers, "0"); } + if (have_destructor) { Printv(f_wrappers, ", swig_delete_", class_name, NIL); } else { @@ -948,6 +955,7 @@ virtual int memberfunctionHandler(Node *n) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); +//Printf(stdout,"memberfunctionHandler %s %s\n",name,iname); String *realname, *rname; @@ -992,7 +1000,9 @@ * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { + REPORT("constructorHandler", n); Language::constructorHandler(n); + constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <be...@us...> - 2007-01-10 23:43:10
|
Revision: 9633 http://swig.svn.sourceforge.net/swig/?rev=9633&view=rev Author: beazley Date: 2007-01-10 15:43:07 -0800 (Wed, 10 Jan 2007) Log Message: ----------- API cleanup (Parms) Modified Paths: -------------- trunk/Doc/Devel/parm.html trunk/Source/Modules/allegrocl.cxx trunk/Source/Modules/emit.cxx trunk/Source/Modules/overload.cxx trunk/Source/Modules/perl5.cxx trunk/Source/Modules/python.cxx trunk/Source/Modules/r.cxx trunk/Source/Swig/cwrap.c trunk/Source/Swig/deprecate.c trunk/Source/Swig/parms.c trunk/Source/Swig/swig.h trunk/Source/Swig/swigparm.h Modified: trunk/Doc/Devel/parm.html =================================================================== --- trunk/Doc/Devel/parm.html 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Doc/Devel/parm.html 2007-01-10 23:43:07 UTC (rev 9633) @@ -10,7 +10,7 @@ <p> David M. Beazley <br> dav...@da...<br> -January 2, 2007<br> +January 9, 2007<br> </b> </center> @@ -60,12 +60,6 @@ </blockquote> <p> -<b><tt>int ParmList_numarg(ParmList *p)</tt></b> -<blockquote> -Returns the number of non-ignored parameters in a parameter list. Any parameter with an "ignore" attribute is ignored in the count. -</blockquote> - -<p> <b><tt>int ParmList_numrequired(ParmList *p)</tt></b> <blockquote> Returns the number of required parameters in a parameter list. This pertains to invoking a function/method in C/C++. @@ -95,7 +89,7 @@ <p> <b><tt>String *ParmList_protostr(ParmList *p)</tt></b> <blockquote> -Creates a C prototype string of the parameters. Does not include any hidden parameters. +Creates a C prototype string of the parameters. </blockquote> Modified: trunk/Source/Modules/allegrocl.cxx =================================================================== --- trunk/Source/Modules/allegrocl.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/allegrocl.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -1790,13 +1790,13 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -1806,13 +1806,13 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -1827,17 +1827,17 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } nodes[j].error = 1; @@ -1854,7 +1854,7 @@ if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } Modified: trunk/Source/Modules/emit.cxx =================================================================== --- trunk/Source/Modules/emit.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/emit.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -106,7 +106,7 @@ Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { - Setattr(p, "ignore", "1"); + /* Setattr(p,"ignore","1"); Deprecate */ p = nextSibling(p); } } else if (tm) { Modified: trunk/Source/Modules/overload.cxx =================================================================== --- trunk/Source/Modules/overload.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/overload.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -224,13 +224,13 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -240,13 +240,13 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } nodes[j].error = 1; @@ -261,17 +261,17 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n, "name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n, "name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n, "decl")) ? " const" : "", - Getattr(nodes[i].n, "name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n, "name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n, "decl")) ? " const" : "", Getfile(nodes[i].n), Getline(nodes[i].n)); } nodes[j].error = 1; @@ -288,7 +288,7 @@ if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/perl5.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -974,7 +974,7 @@ while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); - if (!Getattr(p, "ignore")) { + if (!checkAttribute(p,"tmap:in:numinputs","0")) { /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { @@ -986,12 +986,12 @@ i++; p = nextSibling(p); if (p) - if (!Getattr(p, "ignore")) + if (!checkAttribute(p,"tmap:in:numinputs","0")) Putc(',', temp); } else { p = nextSibling(p); if (p) - if ((i > 0) && (!Getattr(p, "ignore"))) + if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) Putc(',', temp); } } Modified: trunk/Source/Modules/python.cxx =================================================================== --- trunk/Source/Modules/python.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/python.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -1706,7 +1706,7 @@ if (Len(pn)) { String *tmp = 0; String *name = pn; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { name = tmp = Swig_name_make(p, 0, pn, 0, 0); } Printf(kwargs, "(char *) \"%s\",", name); @@ -1739,7 +1739,7 @@ if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } @@ -1842,7 +1842,7 @@ if (!Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; - if (!Getattr(p, "hidden")) { + if (!Getattr(p,"hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Modified: trunk/Source/Modules/r.cxx =================================================================== --- trunk/Source/Modules/r.cxx 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Modules/r.cxx 2007-01-10 23:43:07 UTC (rev 9633) @@ -1451,14 +1451,14 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) ignored. Method %s(%s) const at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } @@ -1469,14 +1469,14 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s) const ignored. Non-const method at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s) const ignored. Method %s(%s) at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), Getfile(nodes[i].n), Getline(nodes[i].n)); } } @@ -1492,18 +1492,18 @@ if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded %s(%s)%s is shadowed by %s(%s)%s at %s:%d.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n,"decl")) ? " const" : "", - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n,"decl")) ? " const" : "", Getfile(nodes[i].n),Getline(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s(%s)%s ignored. Method %s(%s)%s at %s:%d used.\n", - Getattr(nodes[j].n,"name"), ParmList_protostr(nodes[j].parms), + Getattr(nodes[j].n,"name"), ParmList_errorstr(nodes[j].parms), SwigType_isconst(Getattr(nodes[j].n,"decl")) ? " const" : "", - Getattr(nodes[i].n,"name"), ParmList_protostr(nodes[i].parms), + Getattr(nodes[i].n,"name"), ParmList_errorstr(nodes[i].parms), SwigType_isconst(Getattr(nodes[i].n,"decl")) ? " const" : "", Getfile(nodes[i].n),Getline(nodes[i].n)); } @@ -1521,7 +1521,7 @@ if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result,nodes[i].n); - // Printf(stdout,"[ %d ] %s\n", i, ParmList_protostr(nodes[i].parms)); + // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } Modified: trunk/Source/Swig/cwrap.c =================================================================== --- trunk/Source/Swig/cwrap.c 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Swig/cwrap.c 2007-01-10 23:43:07 UTC (rev 9633) @@ -807,7 +807,7 @@ SwigType_add_pointer(type); p = NewParm(type, "self"); Setattr(p, "self", "1"); - Setattr(p, "hidden", "1"); + Setattr(p, "hidden","1"); /* Disable the 'this' ownership in 'self' to manage inplace operations like: @@ -1239,7 +1239,7 @@ SwigType_add_pointer(t); parms = NewParm(t, "self"); Setattr(parms, "self", "1"); - Setattr(parms, "hidden", "1"); + Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); @@ -1325,7 +1325,7 @@ SwigType_add_pointer(t); parms = NewParm(t, "self"); Setattr(parms, "self", "1"); - Setattr(parms, "hidden", "1"); + Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); Modified: trunk/Source/Swig/deprecate.c =================================================================== --- trunk/Source/Swig/deprecate.c 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Swig/deprecate.c 2007-01-10 23:43:07 UTC (rev 9633) @@ -68,3 +68,38 @@ return compactdefargs; } + +/* --------------------------------------------------------------------- + * ParmList_errorstr() + * + * Generate a prototype string suitable for use in error/warning messages. + * This function is aware of hidden parameters. + * ---------------------------------------------------------------------- */ + +/* Discussion. This function is used to generate error messages, but take + into account that there might be a hidden parameter. Although this involves + parameter lists, it really isn't a core feature of swigparm.h or parms.c. + This is because the "hidden" attribute of parameters is added elsewhere (cwrap.c). + + For now, this function is placed here because it doesn't really seem to fit in + with the parms.c interface. + +*/ + +String *ParmList_errorstr(ParmList *p) { + String *out = NewStringEmpty(); + while (p) { + if (Getattr(p,"hidden")) { + p = nextSibling(p); + } else { + String *pstr = SwigType_str(Getattr(p, "type"), 0); + Append(out, pstr); + p = nextSibling(p); + if (p) { + Append(out, ","); + } + Delete(pstr); + } + } + return out; +} Modified: trunk/Source/Swig/parms.c =================================================================== --- trunk/Source/Swig/parms.c 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Swig/parms.c 2007-01-10 23:43:07 UTC (rev 9633) @@ -81,20 +81,6 @@ return CopyParmListMax(p,-1); } -/* ------------------------------------------------------------------ - * int ParmList_numarg() - * ------------------------------------------------------------------ */ - -int ParmList_numarg(ParmList *p) { - int n = 0; - while (p) { - if (!Getattr(p, "ignore")) - n++; - p = nextSibling(p); - } - return n; -} - /* ----------------------------------------------------------------------------- * int ParmList_numrequired(). Return number of required arguments * ----------------------------------------------------------------------------- */ @@ -181,17 +167,13 @@ String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while (p) { - if (Getattr(p, "hidden")) { - p = nextSibling(p); - } else { - String *pstr = SwigType_str(Getattr(p, "type"), 0); - Append(out, pstr); - p = nextSibling(p); - if (p) { - Append(out, ","); - } - Delete(pstr); + String *pstr = SwigType_str(Getattr(p, "type"), 0); + Append(out, pstr); + p = nextSibling(p); + if (p) { + Append(out, ","); } + Delete(pstr); } return out; } Modified: trunk/Source/Swig/swig.h =================================================================== --- trunk/Source/Swig/swig.h 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Swig/swig.h 2007-01-10 23:43:07 UTC (rev 9633) @@ -297,6 +297,9 @@ #include "swigparm.h" +extern String *ParmList_errorstr(ParmList *); +extern int ParmList_is_compactdefargs(ParmList *p); + /* --- Parse tree support --- */ #include "swigtree.h" Modified: trunk/Source/Swig/swigparm.h =================================================================== --- trunk/Source/Swig/swigparm.h 2007-01-03 20:58:19 UTC (rev 9632) +++ trunk/Source/Swig/swigparm.h 2007-01-10 23:43:07 UTC (rev 9633) @@ -18,10 +18,12 @@ extern ParmList *CopyParmList(ParmList *); extern ParmList *CopyParmListMax(ParmList *, int count); extern int ParmList_len(ParmList *); -extern int ParmList_numarg(ParmList *); extern int ParmList_numrequired(ParmList *); +extern int ParmList_has_defaultargs(ParmList *p); + +/* Output functions */ extern String *ParmList_str(ParmList *); extern String *ParmList_str_defaultargs(ParmList *); extern String *ParmList_protostr(ParmList *); -extern int ParmList_is_compactdefargs(ParmList *p); -extern int ParmList_has_defaultargs(ParmList *p); + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-01-12 23:41:50
|
Revision: 9640 http://swig.svn.sourceforge.net/swig/?rev=9640&view=rev Author: wsfulton Date: 2007-01-12 15:41:49 -0800 (Fri, 12 Jan 2007) Log Message: ----------- add support for newfree typemaps in php module Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-01-12 19:01:40 UTC (rev 9639) +++ trunk/CHANGES.current 2007-01-12 23:41:49 UTC (rev 9640) @@ -1,5 +1,9 @@ Version 1.3.32 (in progress) ============================ + +01/12/2007: wsfulton + [Php] Add support for newfree typemaps (sometimes used by %newobject) + 01/12/2007: beazley New command line option -macroerrors. When supplied, this will force the C scanner/parser to report proper location information for code contained Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2007-01-12 19:01:40 UTC (rev 9639) +++ trunk/Source/Modules/php4.cxx 2007-01-12 23:41:49 UTC (rev 9640) @@ -1254,11 +1254,22 @@ if (cleanup) { Printv(f->code, cleanup, NIL); } - // What's this bit for? + + /* Look to see if there is any newfree cleanup code */ + if (GetFlag(n, "feature:new")) { + if ((tm = Swig_typemap_lookup_new("newfree", n, "result", 0))) { + Printf(f->code, "%s\n", tm); + Delete(tm); + } + } + + /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup_new("ret", n, "result", 0))) { Printf(f->code, "%s\n", tm); + Delete(tm); } + if (mvr) { if (!mvrset) { Printf(f->code, "return _return_value;\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <be...@us...> - 2007-01-16 04:50:50
|
Revision: 9641 http://swig.svn.sourceforge.net/swig/?rev=9641&view=rev Author: beazley Date: 2007-01-15 20:50:43 -0800 (Mon, 15 Jan 2007) Log Message: ----------- API cleanup and documentation (Wrapper objects) Modified Paths: -------------- trunk/Doc/Devel/index.html trunk/Source/Swig/swig.h trunk/Source/Swig/wrapfunc.c Added Paths: ----------- trunk/Doc/Devel/wrapobj.html trunk/Source/Swig/swigwrap.h Modified: trunk/Doc/Devel/index.html =================================================================== --- trunk/Doc/Devel/index.html 2007-01-12 23:41:49 UTC (rev 9640) +++ trunk/Doc/Devel/index.html 2007-01-16 04:50:43 UTC (rev 9641) @@ -20,6 +20,7 @@ <li><a href="tree.html">Parse tree navigation and manipulation</a> <li><a href="parm.html">Parameter and Parameter list handling functions</a> <li><a href="scanner.html">Generic C/C++ Scanner interface</a> +<li><a href="wrapobj.html">Wrapper objects</a>. </ul> <hr> Added: trunk/Doc/Devel/wrapobj.html =================================================================== --- trunk/Doc/Devel/wrapobj.html (rev 0) +++ trunk/Doc/Devel/wrapobj.html 2007-01-16 04:50:43 UTC (rev 9641) @@ -0,0 +1,223 @@ +<html> +<head> +<title>Wrapper Objects</title> +</head> + +<body> +<center> +<h1>Wrapper Objects</h1> + +<p> +David M. Beazley <br> +da...@da...<br> +January 15, 2007<br> + +</b> +</center> + +<h2>Introduction</h2> + +This document describes the functions related to management of +wrapper objects. A wrapper object is a low-level +data structure used to contain the C/C++ code that is emitted during the +wrapping process. It contains not only the emitted code, but information +about local variables. These objects are a critical component of almost all +SWIG target language modules. + +<p> +The functions described here are declared +in <tt>Source/Swig/swigwrap.h</tt>. This API is considered to be +stable. + +<h2>Creating and Destroying Wrappers</h2> + +The following functions create and destroy wrapper objects. + +<p> +<b><tt>Wrapper *NewWrapper()</tt></b> + +<blockquote> +Creates a new wrapper object. +</blockquote> + +<p> +<b><tt>void DelWrapper(Wrapper *w)</tt></b> +<blockquote> +Destroys a wrapper object. +</blockquote> + +<h2>Wrapper Objects</h2> + +The <tt>Wrapper</tt> object returned by <tt>NewWrapper()</tt> has +three public attributes. + +<blockquote><pre> +typedef struct Wrapper { + String *def; + String *locals; + String *code; +} Wrapper; +</pre></blockquote> + +The <tt>def</tt> attribute is a string that holds the function +definition line. This line declares the function name, return type, +and parameters. Language modules create this declaration by simply printing +the appropriate text into this attribute. + +<p> +The <tt>locals</tt> attribute is a string that holds the code +related to any local variables declaration. Normally, language modules +do not emit code to this string directly. They use <tt>Wrapper_add_local()</tt> or <tt>Wrapper_new_local()</tt> to do this. + +<p> +The <tt>code</tt> attribute is a string that holds code related to the body of the function. Almost all code emitted by SWIG language modules is printed into this attribute. + +<h2>Creating Local Variables</h2> + +Perhaps the most useful aspect of <tt>Wrapper</tt> objects is the +management of local variables. When creating a wrapper, it is often +necessary to emit local variables related to the API of the target +language. In addition to this, typemaps and other aspects of SWIG +rely upon their own local variables. The following functions are used +to create local variables, but also provide support for renaming +variables in order to avoid name clashes. + +<p> +<b><tt>int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)</tt></b> +<blockquote> +Adds a new local variable to the wrapper object. <tt>name</tt> is the +name of the local variable. <tt>decl</tt> is a string containing the +actual variable declaration code. For example, if you wanted to +declare a variable "<tt>int x = 42;</tt>", you would set <tt>name</tt> +to <tt>"x"</tt> and +<tt>decl</tt> to <tt>"int x = 42;"</tt>. On success, the text in +<tt>decl</tt> is added to the <tt>locals</tt> attribute of <tt>w</tt> +and 0 is returned. -1 is returned if a variable with the given name +has already been declared. +</blockquote> + +<p> +<b><tt>int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...)</tt></b> +<blockquote> +The same as <tt>Wrapper_add_local()</tt> except that instead of +passing a single string for the declaration, a NULL-terminated list of +strings can be passed. These strings are joined together when +producing the output. This convention turns out to be fairly useful +since language modules often create their output into pieces. +</blockquote> + +<p> +<b><tt>char * Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)</tt></b> +<blockquote> +The same as <tt>Wrapper_add_local()</tt> except that if a local variable +with the given name already exists, this function picks a new name and adds +the declaration using the new name. The actual name used for the variable +is returned. This function is used when generating code originating from +typemaps. For instance, if a typemap declares a local variable, that variable +might have to be renamed if the same typemap is used more than once in the same function. +</blockquote> + +<p> +<b><tt>char * Wrapper_new_localv(Wrapper *w, const String_or_char *name,...)</tt></b> +<blockquote> +The same as <tt>Wrapper_new_localv()</tt>, but accepts a NULL-terminated list +of strings as code output. +</blockquote> + +<p> +<b><tt>int Wrapper_check_local(Wrapper *w, const String_or_char *name)</tt></b> +<blockquote> +Checks to see if a local variable with name <tt>name</tt> has been declared. Returns 1 if the local is defined, 0 otherwise. +</blockquote> + +<h2>Output</h2> + +<p> +<b><tt>void Wrapper_print(Wrapper *w, File *f)</tt></b> +<blockquote> +This function is used to format a wrapper function for output. The +formatted wrapper function is emitted to <tt>f</tt> which may be any +file-like object including a <tt>FILE *</tt> object or a <tt>String +*</tt> object. When emitting the wrapper, the code printed to the +wrapper object is automatically formatted. By default, the formatting +is done according to a "pretty printing" style in which lines are split onto +multiple lines and indented according to reasonable C formatting rules. This produces code that is moderately readable should you want to look at the wrapper +code output. An alternative output mode is "compact printing" in which +lines are collected and compacted. This may result in multiple C statements +appearing on the same line. This mode is sometimes used when the size of +a wrapper file is too large for certain compilers. For example, some compilers +might impose a limit of 65536 lines per source file. +</blockquote> + +<p> +<b><tt>void Wrapper_compact_print_mode_set(int flag)</tt></b> +<blockquote> +Sets the output mode of the <tt>Wrapper_print()</tt> +function. If <tt>flag</tt> is set to 1, then wrapper code is formatted +to be compact. +</blockquote> + +<p> +<b><tt>void Wrapper_pretty_print(String *str, File *f)</tt></b> +<blockquote> +Utility function that reformats a string containing C/C++ code and outputs +it to the file-like object <tt>f</tt>. The formatting process indents the code +and structures it according to reasonable C formatting rules. +</blockquote> + +<p> +<b><tt>void Wrapper_compact_print(String *str, File *f)</tt></b> +<blockquote> +Utility function that reformats a string containing C/C++ code and outputs +it to the file-like object <tt>f</tt>. The formatting process tries to +make the code as compact as possible, without going completely overboard. For +example, multiple C statements may be combined onto a single line and braces may be aligned to not use up extra lines. +</blockquote> + + +<h2>An Example</h2> + +Here is a simple example of how these functions are used. Suppose +you wanted to emit the following C function: + +<blockquote> +<pre> +void foo(int n) { + int i; + for (i = 0; i < n; i++) { + printf("%d\n", i); + } +} +</pre> +</blockquote> + +Here is code that generates the above function: + +<blockquote> +<pre> +Wrapper *w = NewWrapper(); +Printf(w->def,"void foo(int n) {"); +Wrapper_add_local(w,"n",""); /* parameter n */ +Wrapper_add_local(w,"i", "int i;"); /* local i */ +Printv(w->code,"for (i = 0; i < n; i++) {", + "printf(\"%d\n",i);", + "}\n", NIL); +Printf(w->code,"}\n"); + +/* Emit wrapper code */ +Wrapper_print(w,outf); +DelWrapper(w); +</pre> +</blockquote> + +Within different language modules, this process is obviously much more +involved. However, this example shows the basic idea of how C/C++ +code is prepared for output. + +</body> +</html> + + + + + Modified: trunk/Source/Swig/swig.h =================================================================== --- trunk/Source/Swig/swig.h 2007-01-12 23:41:49 UTC (rev 9640) +++ trunk/Source/Swig/swig.h 2007-01-16 04:50:43 UTC (rev 9641) @@ -238,25 +238,8 @@ /* -- Wrapper function Object */ - typedef struct { - Hash *localh; - String *def; - String *locals; - String *code; - } Wrapper; +#include "swigwrap.h" - extern Wrapper *NewWrapper(); - extern void DelWrapper(Wrapper *w); - extern void Wrapper_compact_print_mode_set(int flag); - extern void Wrapper_pretty_print(String *str, File *f); - extern void Wrapper_compact_print(String *str, File *f); - extern void Wrapper_print(Wrapper *w, File *f); - extern int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl); - extern int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...); - extern int Wrapper_check_local(Wrapper *w, const String_or_char *name); - extern char *Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl); - extern char *Wrapper_new_localv(Wrapper *w, const String_or_char *name, ...); - /* --- Naming functions --- */ extern void Swig_name_register(const String_or_char *method, const String_or_char *format); Added: trunk/Source/Swig/swigwrap.h =================================================================== --- trunk/Source/Swig/swigwrap.h (rev 0) +++ trunk/Source/Swig/swigwrap.h 2007-01-16 04:50:43 UTC (rev 9641) @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------------- + * 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. + * + * swigwrap.h + * + * Functions related to wrapper objects. + * ----------------------------------------------------------------------------- */ + +/* $Id: swig.h 9635 2007-01-12 01:44:16Z beazley $ */ + +typedef struct Wrapper { + Hash *localh; + String *def; + String *locals; + String *code; +} Wrapper; + +extern Wrapper *NewWrapper(); +extern void DelWrapper(Wrapper *w); +extern void Wrapper_compact_print_mode_set(int flag); +extern void Wrapper_pretty_print(String *str, File *f); +extern void Wrapper_compact_print(String *str, File *f); +extern void Wrapper_print(Wrapper *w, File *f); +extern int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl); +extern int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...); +extern int Wrapper_check_local(Wrapper *w, const String_or_char *name); +extern char *Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl); +extern char *Wrapper_new_localv(Wrapper *w, const String_or_char *name, ...); Property changes on: trunk/Source/Swig/swigwrap.h ___________________________________________________________________ Name: svn:needs-lock + * Name: svn:keywords + true Modified: trunk/Source/Swig/wrapfunc.c =================================================================== --- trunk/Source/Swig/wrapfunc.c 2007-01-12 23:41:49 UTC (rev 9640) +++ trunk/Source/Swig/wrapfunc.c 2007-01-16 04:50:43 UTC (rev 9641) @@ -489,7 +489,7 @@ /* ----------------------------------------------------------------------------- - * Wrapper_add_localv() + * Wrapper_new_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2007-01-22 04:59:20
|
Revision: 9642 http://swig.svn.sourceforge.net/swig/?rev=9642&view=rev Author: mgossage Date: 2007-01-21 20:59:16 -0800 (Sun, 21 Jan 2007) Log Message: ----------- Added a lua specific carrays.i which adds the operator[] support. modified the main code to make it not emit all the class member functions & accessors Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Lua.html trunk/Examples/lua/functor/runme.lua trunk/Source/Modules/lua.cxx Added Paths: ----------- trunk/Examples/test-suite/lua/li_carrays_runme.lua trunk/Lib/lua/carrays.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-01-16 04:50:43 UTC (rev 9641) +++ trunk/CHANGES.current 2007-01-22 04:59:16 UTC (rev 9642) @@ -1,6 +1,13 @@ Version 1.3.32 (in progress) ============================ +01/22/2007: mgossage + [Lua] Added a lua specific carrays.i which adds the operator[] support. + modified the main code to make it not emit all the class member functions & accessors + Note: C structs are created using new_XXX() while C++ classes use XXX() (should be standardised) + Updated test case: li_carrays + Updated the documentation. + 01/12/2007: wsfulton [Php] Add support for newfree typemaps (sometimes used by %newobject) Modified: trunk/Doc/Manual/Lua.html =================================================================== --- trunk/Doc/Manual/Lua.html 2007-01-16 04:50:43 UTC (rev 9641) +++ trunk/Doc/Manual/Lua.html 2007-01-22 04:59:16 UTC (rev 9642) @@ -285,7 +285,7 @@ extern double Foo; </pre></div> <p> -SWIG will actually generate two functions <tt>example.Foo_set()</tt> and <tt>example.Foo_get()</tt>. It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code. +SWIG will effectively generate two functions <tt>example.Foo_set()</tt> and <tt>example.Foo_get()</tt>. It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code. </p> <div class="targetlang"><pre> @@ -320,7 +320,7 @@ %mutable; </pre></div> <p> -SWIG will generate the <tt>example.Foo_get()</tt> but instead of a set function an error function will be called instead. +SWIG will allow the the reading of <tt>Foo</tt> but when a set attempt is made, an error function will be called. </p> <div class="targetlang"><pre> > print(e.Foo) -- reading works ok @@ -337,7 +337,7 @@ For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the lua bindings did), adding a <tt>-DSWIGLUA_IGNORE_SET_IMMUTABLE</tt> compile option will remove this. </p> <p> -Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This does allow the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so. +Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so. </p> <div class="targetlang"><pre> > -- example.PI does not exist @@ -423,7 +423,7 @@ is used as follows: </p> <div class="targetlang"><pre> -> p=example.Point() +> p=example.new_Point() > p.x=3 > p.y=5 > print(p.x,p.y) @@ -432,7 +432,7 @@ </pre></div> <p> Similar access is provided for unions and the data members of C++ classes.<br> -SWIG will also create a function <tt>new_Point()</tt> which also creates a new Point structure. +C structures are created using a function <tt>new_Point()</tt>, but for C++ classes are created using just the name <tt>Point()</tt>. </p> <p> If you print out the value of p in the above example, you will see something like this: @@ -442,7 +442,7 @@ userdata: 003FA320 </pre></div> <p> -Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG creates some accessor/mutator functions <tt>Point_set_x()</tt> and <tt>Point_get_x()</tt>. These will be wrappered, and then added to the metatable added to the userdata. This provides the natural access to the member variables that were shown above (see end of the document for full details). +Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG effectivly creates some accessor/mutator functions to get and set the data. These functions will be added to the userdata's metatable. This provides the natural access to the member variables that were shown above (see end of the document for full details). </p> <p> <tt>const</tt> members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutable's, setting attempts will be cause an error. For example: @@ -543,11 +543,9 @@ In Lua, the static members can be accessed as follows: </p> <div class="code"><pre> -> example.Spam_foo() -- Spam::foo() the only way currently -> a=example.Spam_bar_get() -- Spam::bar the hard way -> a=example.Spam_bar -- Spam::bar the nicer way -> example.Spam_bar_set(b) -- Spam::bar the hard way -> example.Spam_bar=b -- Spam::bar the nicer way +> example.Spam_foo() -- calling Spam::foo() +> a=example.Spam_bar -- reading Spam::bar +> example.Spam_bar=b -- writing to Spam::bar </pre></div> <p> It is not (currently) possible to access static members of an instance: @@ -981,7 +979,7 @@ double Foo_get(); </pre></div> <p> -At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. But it also adds a metatable to this table, which has two functions (<tt>__index</tt> and <tt>__newindex</tt>) as well as two tables (<tt>.get</tt> and <tt>.set</tt>) The following Lua code will show these hidden features. +At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. (Note: older versions of SWIG actually added the Foo_set() and Foo_get() functions, current implementation does not add these functions and more.) But it also adds a metatable to this table, which has two functions (<tt>__index</tt> and <tt>__newindex</tt>) as well as two tables (<tt>.get</tt> and <tt>.set</tt>) The following Lua code will show these hidden features. </p> <div class="targetlang"><pre> > print(example) Modified: trunk/Examples/lua/functor/runme.lua =================================================================== --- trunk/Examples/lua/functor/runme.lua 2007-01-16 04:50:43 UTC (rev 9641) +++ trunk/Examples/lua/functor/runme.lua 2007-01-22 04:59:16 UTC (rev 9642) @@ -19,6 +19,6 @@ a(i) -- Note: function call b(math.sqrt(i)) -- Note: function call end -print(a:result()) -- should be 5050 -print(b:result()) -- should be ~771.46 +print("int sum 0..100 is",a:result(),"(expected 5050") +print("double sum 0..100 is",b:result(),"(expected ~771.46)") Added: trunk/Examples/test-suite/lua/li_carrays_runme.lua =================================================================== --- trunk/Examples/test-suite/lua/li_carrays_runme.lua (rev 0) +++ trunk/Examples/test-suite/lua/li_carrays_runme.lua 2007-01-22 04:59:16 UTC (rev 9642) @@ -0,0 +1,29 @@ +require("import") -- the import fn +import("li_carrays") -- import code + +-- moving to global +for k,v in pairs(li_carrays) do _G[k]=v end + +-- catch "undefined" global variables +setmetatable(getfenv(),{__index=function (t,i) error("undefined global variable `"..i.."'",2) end}) + +-- Testing for %array_functions(int,intArray) +ary = new_intArray(2) +intArray_setitem(ary, 0, 0) +intArray_setitem(ary, 1, 1) +assert(intArray_getitem(ary, 0)==0) +assert(intArray_getitem(ary, 1)==1) +delete_intArray(ary) + +-- Testing for %array_class(double, doubleArray) +d = doubleArray(10) +d[0] = 7 +d[5] = d[0] + 3 +assert(d[5] + d[0] == 17) +--print(d[5] + d[0]) + +ptr = d:cast() -- to ptr +d2 = doubleArray_frompointer(ptr) -- and back to array +assert(d2[5] + d2[0] == 17) +--print(d2[5] + d2[0]) + Added: trunk/Lib/lua/carrays.i =================================================================== --- trunk/Lib/lua/carrays.i (rev 0) +++ trunk/Lib/lua/carrays.i 2007-01-22 04:59:16 UTC (rev 9642) @@ -0,0 +1,10 @@ +/* Small change to the standard carrays.i +renaming the field to __getitem__ & __setitem__ +for operator[] access + +Thanks to Fabian Franz <Fab...@gm...> for suggesting this +*/ +%rename(__getitem) *::getitem; // the v=X[i] (get operator) +%rename(__setitem) *::setitem; // the X[i]=v (set operator) + +%include <../carrays.i> Modified: trunk/Source/Modules/lua.cxx =================================================================== --- trunk/Source/Modules/lua.cxx 2007-01-16 04:50:43 UTC (rev 9641) +++ trunk/Source/Modules/lua.cxx 2007-01-22 04:59:16 UTC (rev 9642) @@ -109,6 +109,17 @@ String *class_name; String *constructor_name; + enum { + NO_CPP, + VARIABLE, + MEMBER_FUNC, + CONSTRUCTOR, + DESTRUCTOR, + MEMBER_VAR, + CLASS_CONST, + STATIC_FUNC, + STATIC_VAR + }current; public: @@ -127,6 +138,7 @@ PrefixPlusUnderscore = 0; s_cmd_tab = s_var_tab = s_const_tab = 0; + current=NO_CPP; } /* NEW LANGUAGE NOTE:*********************************************** @@ -228,6 +240,7 @@ s_var_tab = NewString(""); // s_methods_tab = NewString(""); s_const_tab = NewString(""); + current=NO_CPP; /* Standard stuff for the SWIG runtime section */ Swig_banner(f_runtime); @@ -325,6 +338,7 @@ Parm *p; String *tm; int i; +//Printf(stdout,"functionWrapper %s %s %d\n",name,iname,current); // int returnval=0; // number of arguments returned String *overname = 0; @@ -593,7 +607,8 @@ /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { // add_method(n, iname, wname, description); - Printv(s_cmd_tab, tab4, "{ \"", iname, "\", ", Swig_name_wrapper(iname), "},\n", NIL); + if (current==NO_CPP || current==STATIC_FUNC) // emit normal fns & static fns + Printv(s_cmd_tab, tab4, "{ \"", iname, "\", ", Swig_name_wrapper(iname), "},\n", NIL); // Printv(s_cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", Swig_name_wrapper(iname), "},\n", NIL); } else { // Setattr(n,"wrap:name", wname); @@ -658,7 +673,8 @@ Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); //add_method(symname,wname,0); - Printv(s_cmd_tab, tab4, "{ \"", symname, "\",", wname, "},\n", NIL); + if (current==NO_CPP || current==STATIC_FUNC) // emit normal fns & static fns + Printv(s_cmd_tab, tab4, "{ \"", symname, "\",", wname, "},\n", NIL); DelWrapper(f); Delete(dispatch); @@ -681,8 +697,10 @@ NEW LANGUAGE NOTE:END ************************************************/ // REPORT("variableWrapper", n); String *iname = Getattr(n, "sym:name"); + current=VARIABLE; // let SWIG generate the wrappers int result = Language::variableWrapper(n); + current=NO_CPP; // normally SWIG will generate 2 wrappers, a get and a set // but in certain scenarios (immutable, or if its arrays), it will not String *getName = Swig_name_wrapper(Swig_name_get(iname)); @@ -959,7 +977,9 @@ String *realname, *rname; + current = MEMBER_FUNC; Language::memberfunctionHandler(n); + current = NO_CPP; realname = iname ? iname : name; rname = Swig_name_wrapper(Swig_name_member(class_name, realname)); @@ -979,7 +999,9 @@ String *symname = Getattr(n, "sym:name"); String *gname, *sname; + current = MEMBER_VAR; Language::membervariableHandler(n); + current = NO_CPP; gname = Swig_name_wrapper(Swig_name_get(Swig_name_member(class_name, symname))); if (!GetFlag(n, "feature:immutable")) { sname = Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name, symname))); @@ -1001,7 +1023,9 @@ virtual int constructorHandler(Node *n) { REPORT("constructorHandler", n); + current = CONSTRUCTOR; Language::constructorHandler(n); + current = NO_CPP; constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; @@ -1012,7 +1036,9 @@ * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { + current = DESTRUCTOR; Language::destructorHandler(n); + current = NO_CPP; have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; @@ -1025,7 +1051,9 @@ * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { + current = STATIC_FUNC; return Language::staticmemberfunctionHandler(n); + current = NO_CPP; } /* ------------------------------------------------------------ @@ -1045,7 +1073,9 @@ virtual int staticmembervariableHandler(Node *n) { // REPORT("staticmembervariableHandler",n); + current = STATIC_VAR; return Language::staticmembervariableHandler(n); + current = NO_CPP; } /* --------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2007-01-23 01:29:02
|
Revision: 9643 http://swig.svn.sourceforge.net/swig/?rev=9643&view=rev Author: mgossage Date: 2007-01-22 17:29:00 -0800 (Mon, 22 Jan 2007) Log Message: ----------- removed reference to contributers Patch #1640862 (malloc.h to stdlib.h) Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/lua/carrays.i trunk/Lib/lua/luarun.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-01-22 04:59:16 UTC (rev 9642) +++ trunk/CHANGES.current 2007-01-23 01:29:00 UTC (rev 9643) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +01/23/2007: mgossage + [Lua] Patch #1640862: <malloc.h> replaced by <stdlib.h> + 01/22/2007: mgossage [Lua] Added a lua specific carrays.i which adds the operator[] support. modified the main code to make it not emit all the class member functions & accessors Modified: trunk/Lib/lua/carrays.i =================================================================== --- trunk/Lib/lua/carrays.i 2007-01-22 04:59:16 UTC (rev 9642) +++ trunk/Lib/lua/carrays.i 2007-01-23 01:29:00 UTC (rev 9643) @@ -1,8 +1,6 @@ /* Small change to the standard carrays.i renaming the field to __getitem__ & __setitem__ for operator[] access - -Thanks to Fabian Franz <Fab...@gm...> for suggesting this */ %rename(__getitem) *::getitem; // the v=X[i] (get operator) %rename(__setitem) *::setitem; // the X[i]=v (set operator) Modified: trunk/Lib/lua/luarun.swg =================================================================== --- trunk/Lib/lua/luarun.swg 2007-01-22 04:59:16 UTC (rev 9642) +++ trunk/Lib/lua/luarun.swg 2007-01-23 01:29:00 UTC (rev 9643) @@ -15,7 +15,7 @@ #include "lua.h" #include "lauxlib.h" -#include <malloc.h> +#include <stdlib.h> /* for malloc */ #include <assert.h> /* for a few sanity tests */ /* ----------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2007-01-23 01:38:57
|
Revision: 9644 http://swig.svn.sourceforge.net/swig/?rev=9644&view=rev Author: mgossage Date: 2007-01-22 17:38:53 -0800 (Mon, 22 Jan 2007) Log Message: ----------- Patch #1598063 Typo in typemaps.i Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/lua/typemaps.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-01-23 01:29:00 UTC (rev 9643) +++ trunk/CHANGES.current 2007-01-23 01:38:53 UTC (rev 9644) @@ -3,6 +3,7 @@ 01/23/2007: mgossage [Lua] Patch #1640862: <malloc.h> replaced by <stdlib.h> + Patch #1598063 Typo in typemaps.i 01/22/2007: mgossage [Lua] Added a lua specific carrays.i which adds the operator[] support. Modified: trunk/Lib/lua/typemaps.i =================================================================== --- trunk/Lib/lua/typemaps.i 2007-01-23 01:29:00 UTC (rev 9643) +++ trunk/Lib/lua/typemaps.i 2007-01-23 01:38:53 UTC (rev 9644) @@ -75,7 +75,6 @@ SWIG_NUMBER_TYPEMAP(float); SWIG_NUMBER_TYPEMAP(double); SWIG_NUMBER_TYPEMAP(enum SWIGTYPE); -SWIG_NUMBER_TYPEMAP(enum SWIGTYPE); // also for long longs's SWIG_NUMBER_TYPEMAP(long long); SWIG_NUMBER_TYPEMAP(unsigned long long); SWIG_NUMBER_TYPEMAP(signed long long); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-01-25 23:50:08
|
Revision: 9645 http://swig.svn.sourceforge.net/swig/?rev=9645&view=rev Author: wsfulton Date: 2007-01-25 15:50:04 -0800 (Thu, 25 Jan 2007) Log Message: ----------- Fix #1538522 and #1338527, forward templated class declarations without a name for the templated class parameters, such as: template <typename, class> class X; Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/template_forward.i trunk/Source/CParse/parser.y Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-01-23 01:38:53 UTC (rev 9644) +++ trunk/CHANGES.current 2007-01-25 23:50:04 UTC (rev 9645) @@ -1,6 +1,12 @@ Version 1.3.32 (in progress) ============================ +01/25/2007: wsfulton + Fix #1538522 and #1338527, forward templated class declarations without a + name for the templated class parameters, such as: + + template <typename, class> class X; + 01/23/2007: mgossage [Lua] Patch #1640862: <malloc.h> replaced by <stdlib.h> Patch #1598063 Typo in typemaps.i Modified: trunk/Examples/test-suite/template_forward.i =================================================================== --- trunk/Examples/test-suite/template_forward.i 2007-01-23 01:38:53 UTC (rev 9644) +++ trunk/Examples/test-suite/template_forward.i 2007-01-25 23:50:04 UTC (rev 9645) @@ -58,3 +58,14 @@ %template (LinearOpBase_int) LinearOpBase<int,int>; %template (VectorBase_int) VectorBase<int>; +// Template forward class declarations mixing class and typename without always naming the templated parameter name +%inline %{ +template <class> class TClass1; +template <typename> class TClass2; +template <class, typename> class TClass3; +template <class, class, class> class TClass4; +template <typename, typename> class TClass5; +template <typename, class K = double> class TClass6; +template<typename, class K, class C = K> class TClass7; +%} + Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2007-01-23 01:38:53 UTC (rev 9644) +++ trunk/Source/CParse/parser.y 2007-01-25 23:50:04 UTC (rev 9645) @@ -1459,9 +1459,11 @@ %type <dtype> initializer cpp_const ; %type <id> storage_class; %type <pl> parms ptail rawparms varargs_parms; +%type <pl> templateparameters templateparameterstail; %type <p> parm valparm rawvalparms valparms valptail ; %type <p> typemap_parm tm_list tm_tail ; -%type <id> cpptype access_specifier; +%type <p> templateparameter ; +%type <id> templcpptype cpptype access_specifier; %type <node> base_specifier %type <type> type rawtype type_right ; %type <bases> base_list inherit raw_inherit; @@ -3769,7 +3771,7 @@ } ; -template_parms : rawparms { +template_parms : templateparameters { /* Rip out the parameter names */ Parm *p = $1; $$ = $1; @@ -3797,8 +3799,30 @@ p = nextSibling(p); } } - ; + ; +templateparameters : templateparameter templateparameterstail { + set_nextSibling($1,$2); + $$ = $1; + } + | empty { $$ = 0; } + ; + +templateparameter : templcpptype { + $$ = NewParm(NewString($1), 0); + } + | parm { + $$ = $1; + } + ; + +templateparameterstail : COMMA templateparameter templateparameterstail { + set_nextSibling($2,$3); + $$ = $2; + } + | empty { $$ = 0; } + ; + /* Namespace support */ cpp_using_decl : USING idcolon SEMI { @@ -5594,10 +5618,19 @@ ; -cpptype : CLASS { +templcpptype : CLASS { $$ = (char*)"class"; if (!inherit_list) last_cpptype = $$; } + | TYPENAME { + $$ = (char *)"typename"; + if (!inherit_list) last_cpptype = $$; + } + ; + +cpptype : templcpptype { + $$ = $1; + } | STRUCT { $$ = (char*)"struct"; if (!inherit_list) last_cpptype = $$; @@ -5606,10 +5639,6 @@ $$ = (char*)"union"; if (!inherit_list) last_cpptype = $$; } - | TYPENAME { - $$ = (char *)"typename"; - if (!inherit_list) last_cpptype = $$; - } ; opt_virtual : VIRTUAL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mgo...@us...> - 2007-02-22 09:21:32
|
Revision: 9648 http://swig.svn.sourceforge.net/swig/?rev=9648&view=rev Author: mgossage Date: 2007-02-22 01:21:23 -0800 (Thu, 22 Feb 2007) Log Message: ----------- Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/derived_byvalue.i trunk/Lib/lua/luatypemaps.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-02-07 10:19:35 UTC (rev 9647) +++ trunk/CHANGES.current 2007-02-22 09:21:23 UTC (rev 9648) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +02/22/2007: mgossage + [Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. + Updated derived_byvalue.i to explain how to find and fix the problem + 01/25/2007: wsfulton Fix #1538522 and #1338527, forward templated class declarations without a name for the templated class parameters, such as: Modified: trunk/Examples/test-suite/derived_byvalue.i =================================================================== --- trunk/Examples/test-suite/derived_byvalue.i 2007-02-07 10:19:35 UTC (rev 9647) +++ trunk/Examples/test-suite/derived_byvalue.i 2007-02-22 09:21:23 UTC (rev 9648) @@ -31,11 +31,61 @@ if the derived class is deleted, it works again - if the previos Foo::method + if the previous Foo::method is deleted, it works again */ struct DerFoo : Foo { }; +/* + The problem is caused by accidentally remembering a object value type + instead of an object pointer type. + During the course of SWIGing a file, several calls to SwigType_remember() + or SwigType_remember_clientdata() will be made. + When the SwigType_emit_type_table() function is called it emits all the + type conversion functions. + + If a object type exists in the SwigType table, you get this error. + + You can view the SwigType table, with a #define DEBUG at the top of + Source/Swig/typesys.c + + When run you get an output like this: + +---r_mangled--- +Hash { + '_p_Bar' : Hash { + 'p.Bar' : _p_Bar, + } +, + '_p_DerFoo' : Hash { + 'p.DerFoo' : _p_DerFoo, + } +, + '_p_Foo' : Hash { + 'r.Foo' : _p_Foo, + 'p.Foo' : _p_Foo, + } +, + '_Foo' : Hash { + 'Foo' : _Foo, + } +, +} +.... + + The last field ('_Foo') is an object type and caused the error. + It can be fixed either by checking all the calls to SwigType_remember() + and by checking the typemaps. + The typemap code also calls SwigType_remember(), if your typemaps + defined an object type, it will be added into the SwigType table. + its normally a + SWIG_ConvertPtr(....$descriptor...) + when it should have been a $&descriptor or $*descriptor + + Commenting out all your object typemaps (and typecheck fns) may help + isolate it. + +*/ # %} Modified: trunk/Lib/lua/luatypemaps.swg =================================================================== --- trunk/Lib/lua/luatypemaps.swg 2007-02-07 10:19:35 UTC (rev 9647) +++ trunk/Lib/lua/luatypemaps.swg 2007-02-22 09:21:23 UTC (rev 9648) @@ -110,17 +110,13 @@ } %} -/*%typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE*,SWIGTYPE[] -%{$1=($1_ltype)SWIG_MustGetPtr(L,$input,$descriptor,0,$argnum,"$symname");%} - -%typemap(in,checkfn="lua_isuserdata") SWIGTYPE& -%{$1=($1_ltype)SWIG_MustGetPtr(L,$input,$descriptor,0,$argnum,"$symname");%} -*/ - +// out is simple %typemap(out) SWIGTYPE*,SWIGTYPE& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} // dynamic casts +// this uses the SWIG_TypeDynamicCast() which relies on RTTI to find out what the pointer really is +// the we return it as the correct type %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { @@ -130,12 +126,12 @@ // passing objects by value -// SWIG expects the object pointer (the $<ype argp) +// SWIG_ConvertPtr wants an object pointer (the $<ype argp) // then dereferences it to get the object %typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp) %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){ - SWIG_fail_ptr("$symname",$argnum,$descriptor); + SWIG_fail_ptr("$symname",$argnum,$&descriptor); } $1 = *argp; %} @@ -143,7 +139,7 @@ // Primitive types--return by value // must make a new object, copy the data & return the new object // Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper -// this is because out tpyemaps do not support local variables, like in typemaps do +// this is because typemap(out) does not support local variables, like in typemap(in) does // and we need the $&1_ltype resultptr; to be declared #ifdef __cplusplus %typemap(out) SWIGTYPE @@ -251,7 +247,7 @@ } } -%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE & { +%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; @@ -260,6 +256,15 @@ } } +%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { + void *ptr; + if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $&1_descriptor, 0)) { + $1 = 0; + } else { + $1 = 1; + } +} + %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) { @@ -314,7 +319,7 @@ SWIG_NUMBER_BY_CONST_REF(signed long long); SWIG_NUMBER_BY_CONST_REF(unsigned long long); -%apply const unsigned long & { const size_t & }; +%apply const unsigned long & { const size_t & }; // size_t is the same as unsigned long // Also needed for object ptrs by const ref This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <efu...@us...> - 2007-02-26 13:16:05
|
Revision: 9649 http://swig.svn.sourceforge.net/swig/?rev=9649&view=rev Author: efuzzyone Date: 2007-02-26 05:16:01 -0800 (Mon, 26 Feb 2007) Log Message: ----------- Patch 1656395 Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/cffi.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-02-22 09:21:23 UTC (rev 9648) +++ trunk/CHANGES.current 2007-02-26 13:16:01 UTC (rev 9649) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +02/26/2007: efuzzyone + [CFFI] Patch #1656395: fixed hex and octal values bug, thanks to Arthur Smyles. + 02/22/2007: mgossage [Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. Updated derived_byvalue.i to explain how to find and fix the problem Modified: trunk/Source/Modules/cffi.cxx =================================================================== --- trunk/Source/Modules/cffi.cxx 2007-02-22 09:21:23 UTC (rev 9648) +++ trunk/Source/Modules/cffi.cxx 2007-02-26 13:16:01 UTC (rev 9649) @@ -970,11 +970,12 @@ } if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */ - Delete(num); - if (s[1] == 'x') - return NewStringf("#x%s", s + 2); - else - return NewStringf("#o%s", s + 1); + if (s[1] == 'x'){ + DohReplace(num,"0","#",DOH_REPLACE_FIRST); + } + else{ + DohReplace(num,"0","#o",DOH_REPLACE_FIRST); + } } return num; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-03-02 19:05:50
|
Revision: 9650 http://swig.svn.sourceforge.net/swig/?rev=9650&view=rev Author: olly Date: 2007-03-02 11:05:45 -0800 (Fri, 02 Mar 2007) Log Message: ----------- [PHP5] Fix PHP wrapper code generated for certain cases of overloaded forms with default arguments. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-02-26 13:16:01 UTC (rev 9649) +++ trunk/CHANGES.current 2007-03-02 19:05:45 UTC (rev 9650) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/02/2007: olly + [PHP5] Fix PHP wrapper code generated for certain cases of + overloaded forms with default arguments. + 02/26/2007: efuzzyone [CFFI] Patch #1656395: fixed hex and octal values bug, thanks to Arthur Smyles. Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2007-02-26 13:16:01 UTC (rev 9649) +++ trunk/Source/Modules/php4.cxx 2007-03-02 19:05:45 UTC (rev 9650) @@ -1643,6 +1643,19 @@ Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } + } else if (arg_values[argno]) { + // This argument already has a default value in another overloaded + // form, but doesn't in this form. So don't try to do anything + // clever, just let the C wrappers resolve the overload and set the + // default values. + // + // This handling is safe, but I'm wondering if it may be overly + // conservative (FIXME) in some cases. It seems it's only bad when + // there's an overloaded form with the appropriate number of + // parameters which doesn't want the default value, but I need to + // think about this more. + Delete(arg_values[argno]); + arg_values[argno] = NewString("?"); } p = nextSibling(p); ++argno; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-03-03 15:38:53
|
Revision: 9651 http://swig.svn.sourceforge.net/swig/?rev=9651&view=rev Author: olly Date: 2007-03-03 07:38:52 -0800 (Sat, 03 Mar 2007) Log Message: ----------- [PHP5] When we know the literal numeric value for a constant, use that to initialise the const member in the PHP wrapper class. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-02 19:05:45 UTC (rev 9650) +++ trunk/CHANGES.current 2007-03-03 15:38:52 UTC (rev 9651) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/03/2007: olly + [PHP5] When we know the literal numeric value for a constant, use + that to initialise the const member in the PHP wrapper class. + 03/02/2007: olly [PHP5] Fix PHP wrapper code generated for certain cases of overloaded forms with default arguments. Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2007-03-02 19:05:45 UTC (rev 9650) +++ trunk/Source/Modules/php4.cxx 2007-03-03 15:38:52 UTC (rev 9651) @@ -1938,14 +1938,36 @@ } if (shadow && php_version == 5) { + String *enumvalue = GetChar(n, "enumvalue"); + String *set_to = iname; + + if (!enumvalue) { + enumvalue = GetChar(n, "enumvalueex"); + } + + if (enumvalue) { + // Check for a simple constant expression which is valid in PHP. + // If we find one, initialise the const member with it; otherwise + // we initialise it using the C/C++ wrapped constant. + const char *p; + for (p = Char(enumvalue); *p; ++p) { + if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { + // FIXME: enhance to handle `<previous_enum> + 1' which is what + // we get for enums that don't have an explicit value set. + break; + } + } + if (!*p) set_to = enumvalue; + } + if (wrapping_member_constant) { if (!s_oowrappers) s_oowrappers = NewStringEmpty(); - Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, iname); + Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); } else { if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); - Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", name, iname); + Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", name, set_to); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-03-18 14:33:47
|
Revision: 9652 http://swig.svn.sourceforge.net/swig/?rev=9652&view=rev Author: wsfulton Date: 2007-03-16 16:37:15 -0700 (Fri, 16 Mar 2007) Log Message: ----------- ARRAYSOFCLASSES and ARRAYSOFENUMS fix so that they can be applied to pointers Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/java/arrays_java.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-03 15:38:52 UTC (rev 9651) +++ trunk/CHANGES.current 2007-03-16 23:37:15 UTC (rev 9652) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/16/2007: wsfulton + [Java] Fixes so that ARRAYSOFCLASSES and ARRAYSOFENUMS in arrays_java.i can be applied + to pointer types. + 03/03/2007: olly [PHP5] When we know the literal numeric value for a constant, use that to initialise the const member in the PHP wrapper class. Modified: trunk/Lib/java/arrays_java.i =================================================================== --- trunk/Lib/java/arrays_java.i 2007-03-03 15:38:52 UTC (rev 9651) +++ trunk/Lib/java/arrays_java.i 2007-03-16 23:37:15 UTC (rev 9652) @@ -235,12 +235,12 @@ * JAVA_ARRAYSOFCLASSES(name) */ %define JAVA_ARRAYSOFCLASSES(ARRAYSOFCLASSES) -%typemap(jni) ARRAYSOFCLASSES[ANY] "jlongArray" -%typemap(jtype) ARRAYSOFCLASSES[ANY] "long[]" -%typemap(jstype) ARRAYSOFCLASSES[ANY] "$javaclassname[]" +%typemap(jni) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] "jlongArray" +%typemap(jtype) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] "long[]" +%typemap(jstype) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] "$javaclassname[]" -%typemap(javain) ARRAYSOFCLASSES[ANY] "$javaclassname.cArrayUnwrap($javainput)" -%typemap(javaout) ARRAYSOFCLASSES[ANY] { +%typemap(javain) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] "$javaclassname.cArrayUnwrap($javainput)" +%typemap(javaout) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] { return $javaclassname.cArrayWrap($jnicall, $owner); } @@ -300,7 +300,7 @@ } } -%typemap(argout) ARRAYSOFCLASSES[ANY] +%typemap(argout) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] { int i; for (i=0; i<sz$argnum; i++) { @@ -329,7 +329,7 @@ JCALL3(ReleaseLongArrayElements, jenv, $result, arr, 0); } -%typemap(freearg) ARRAYSOFCLASSES[ANY] +%typemap(freearg) ARRAYSOFCLASSES[ANY], ARRAYSOFCLASSES[] #ifdef __cplusplus %{ delete [] $1; %} #else @@ -360,12 +360,12 @@ /* Arrays of enums. * Use the following to use these typemaps for an array of enums called name: * %apply ARRAYSOFENUMS[ANY] { name[ANY] }; */ -%typemap(jni) ARRAYSOFENUMS[ANY] "jintArray" -%typemap(jtype) ARRAYSOFENUMS[ANY] "int[]" -%typemap(jstype) ARRAYSOFENUMS[ANY] "int[]" +%typemap(jni) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] "jintArray" +%typemap(jtype) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] "int[]" +%typemap(jstype) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] "int[]" -%typemap(javain) ARRAYSOFENUMS[ANY] "$javainput" -%typemap(javaout) ARRAYSOFENUMS[ANY] { +%typemap(javain) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] "$javainput" +%typemap(javaout) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] { return $jnicall; } @@ -378,11 +378,11 @@ } if (!SWIG_JavaArrayInInt(jenv, &jarr, (int **)&$1, $input)) return $null; } -%typemap(argout) ARRAYSOFENUMS[ANY] +%typemap(argout) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] %{ SWIG_JavaArrayArgoutInt(jenv, jarr$argnum, (int *)$1, $input); %} %typemap(out) ARRAYSOFENUMS[ANY] %{$result = SWIG_JavaArrayOutInt(jenv, (int *)$1, $1_dim0); %} -%typemap(freearg) ARRAYSOFENUMS[ANY] +%typemap(freearg) ARRAYSOFENUMS[ANY], ARRAYSOFENUMS[] #ifdef __cplusplus %{ delete [] $1; %} #else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-03-18 14:38:29
|
Revision: 9653 http://swig.svn.sourceforge.net/swig/?rev=9653&view=rev Author: wsfulton Date: 2007-03-16 16:39:28 -0700 (Fri, 16 Mar 2007) Log Message: ----------- seg fault fix when parsing incorrect C++ namespace code Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/typepass.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-16 23:37:15 UTC (rev 9652) +++ trunk/CHANGES.current 2007-03-16 23:39:28 UTC (rev 9653) @@ -2,6 +2,9 @@ ============================ 03/16/2007: wsfulton + Fix seg fault given dodgy C++ code: namespace abc::def { } + +03/16/2007: wsfulton [Java] Fixes so that ARRAYSOFCLASSES and ARRAYSOFENUMS in arrays_java.i can be applied to pointer types. Modified: trunk/Source/Modules/typepass.cxx =================================================================== --- trunk/Source/Modules/typepass.cxx 2007-03-16 23:37:15 UTC (rev 9652) +++ trunk/Source/Modules/typepass.cxx 2007-03-16 23:39:28 UTC (rev 9653) @@ -520,7 +520,9 @@ } else { if (name) { Node *nn = Swig_symbol_clookup(name, n); - Hash *ts = Getattr(nn, "typescope"); + Hash *ts = 0; + if (nn) + Getattr(nn, "typescope"); if (!ts) { SwigType_new_scope(name); SwigType_attach_symtab(Getattr(n, "symtab")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-03-21 21:00:40
|
Revision: 9656 http://swig.svn.sourceforge.net/swig/?rev=9656&view=rev Author: wsfulton Date: 2007-03-21 14:00:21 -0700 (Wed, 21 Mar 2007) Log Message: ----------- Apply patch 1631987 - Java typemap for bool INOUT fails on big-endian machines Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/java/typemaps.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-19 21:29:48 UTC (rev 9655) +++ trunk/CHANGES.current 2007-03-21 21:00:21 UTC (rev 9656) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/21/2007: wsfulton + [Java] Apply patch #1631987 from Ulrik Peterson - bool INOUT typemaps + fail on big endian machines. + 03/16/2007: wsfulton Fix seg fault given dodgy C++ code: namespace abc::def { } Modified: trunk/Lib/java/typemaps.i =================================================================== --- trunk/Lib/java/typemaps.i 2007-03-19 21:29:48 UTC (rev 9655) +++ trunk/Lib/java/typemaps.i 2007-03-21 21:00:21 UTC (rev 9656) @@ -388,7 +388,28 @@ #undef INOUT_TYPEMAP -/* Override the typemap in the INOUT_TYPEMAP macro */ +/* Override typemaps in the INOUT_TYPEMAP macro for booleans to fix casts + as a jboolean isn't always the same size as a bool */ +%typemap(in) bool *INOUT (bool btemp, jboolean *jbtemp), bool &INOUT (bool btemp, jboolean *jbtemp) { + if (!$input) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); + return $null; + } + if (JCALL1(GetArrayLength, jenv, $input) == 0) { + SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); + return $null; + } + jbtemp = JCALL2(GetBooleanArrayElements, jenv, $input, 0); + btemp = (*jbtemp) ? true : false; + $1 = &btemp; +} + +%typemap(argout) bool *INOUT, bool &INOUT { + *jbtemp$argnum = btemp$argnum ? (jboolean)1 : (jboolean)0; + JCALL3(ReleaseBooleanArrayElements, jenv, $input , (jboolean *)jbtemp$argnum, 0); +} + +/* Override the typemap in the INOUT_TYPEMAP macro for unsigned long long */ %typemap(in) unsigned long long *INOUT ($*1_ltype temp), unsigned long long &INOUT ($*1_ltype temp) { jobject bigint; jclass clazz; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2007-03-23 22:12:12
|
Revision: 9657 http://swig.svn.sourceforge.net/swig/?rev=9657&view=rev Author: wsfulton Date: 2007-03-23 15:12:10 -0700 (Fri, 23 Mar 2007) Log Message: ----------- String copying patch from Josh Cherry reducing memory consumption by about 25%. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/DOH/string.c Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-21 21:00:21 UTC (rev 9656) +++ trunk/CHANGES.current 2007-03-23 22:12:10 UTC (rev 9657) @@ -1,6 +1,9 @@ Version 1.3.32 (in progress) ============================ +03/23/2007: wsfulton + String copying patch from Josh Cherry reducing memory consumption by about 25%. + 03/21/2007: wsfulton [Java] Apply patch #1631987 from Ulrik Peterson - bool INOUT typemaps fail on big endian machines. Modified: trunk/Source/DOH/string.c =================================================================== --- trunk/Source/DOH/string.c 2007-03-21 21:00:21 UTC (rev 9656) +++ trunk/Source/DOH/string.c 2007-03-23 22:12:10 UTC (rev 9657) @@ -64,7 +64,6 @@ * ----------------------------------------------------------------------------- */ static DOH *CopyString(DOH *so) { - int max; String *str; String *s = (String *) ObjData(so); str = (String *) DohMalloc(sizeof(String)); @@ -74,10 +73,9 @@ str->file = s->file; if (str->file) Incref(str->file); - max = s->maxsize; - str->str = (char *) DohMalloc(max + 1); - memmove(str->str, s->str, max); - str->maxsize = max; + str->str = (char *) DohMalloc(s->len + 1); + memcpy(str->str, s->str, s->len); + str->maxsize = s->len; str->len = s->len; str->str[str->len] = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wu...@us...> - 2007-03-25 17:40:58
|
Revision: 9658 http://swig.svn.sourceforge.net/swig/?rev=9658&view=rev Author: wuzzeb Date: 2007-03-25 10:40:56 -0700 (Sun, 25 Mar 2007) Log Message: ----------- add SWIG_fail to SWIG_expcetion macro Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/perl5/exception.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-23 22:12:10 UTC (rev 9657) +++ trunk/CHANGES.current 2007-03-25 17:40:56 UTC (rev 9658) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/25/2007: wuzzeb (John Lenz) + [perl5] Add SWIG_fail to the SWIG_exception macro. Fixes a few problems reported + on the mailing list. + 03/23/2007: wsfulton String copying patch from Josh Cherry reducing memory consumption by about 25%. Modified: trunk/Lib/perl5/exception.i =================================================================== --- trunk/Lib/perl5/exception.i 2007-03-23 22:12:10 UTC (rev 9657) +++ trunk/Lib/perl5/exception.i 2007-03-25 17:40:56 UTC (rev 9658) @@ -1,5 +1,5 @@ %include <typemaps/exception.swg> %insert("runtime") { - %define_as(SWIG_exception(code, msg), %block(%error(code, msg);)) + %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-03-30 02:34:42
|
Revision: 9665 http://swig.svn.sourceforge.net/swig/?rev=9665&view=rev Author: olly Date: 2007-03-29 19:34:38 -0700 (Thu, 29 Mar 2007) Log Message: ----------- Avoid generating '<:' token when using SwigValueWrapper<> on a type which starts with '::' (patch #1690948). Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Swig/typesys.c Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-26 01:26:44 UTC (rev 9664) +++ trunk/CHANGES.current 2007-03-30 02:34:38 UTC (rev 9665) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +03/30/2007: olly + Avoid generating '<:' token when using SwigValueWrapper<> on a type + which starts with '::' (patch #1690948). + 03/25/2007: wuzzeb (John Lenz) [perl5] Add SWIG_fail to the SWIG_exception macro. Fixes a few problems reported on the mailing list. Modified: trunk/Source/Swig/typesys.c =================================================================== --- trunk/Source/Swig/typesys.c 2007-03-26 01:26:44 UTC (rev 9664) +++ trunk/Source/Swig/typesys.c 2007-03-30 02:34:38 UTC (rev 9665) @@ -1291,22 +1291,25 @@ * class MyOpaqueClass; * * Users can also force the use of the value wrapper by using the - * %feature("valuewrapper"). + * %feature("valuewrapper"). * ----------------------------------------------------------------------------- */ SwigType *SwigType_alttype(SwigType *t, int local_tmap) { + Node *n; + SwigType *w = 0; + int use_wrapper = 0; + SwigType *td = 0; + if (!cparse_cplusplus) return 0; + if (value_wrapper_mode == 0) { /* old partial use of SwigValueTypes, it can fail for opaque types */ - Node *n; - SwigType *w = 0; - int use_wrapper = 0; if (local_tmap) return 0; - if (!use_wrapper && SwigType_isclass(t)) { + if (SwigType_isclass(t)) { SwigType *ftd = SwigType_typedef_resolve_all(t); - SwigType *td = SwigType_strip_qualifiers(ftd); + td = SwigType_strip_qualifiers(ftd); Delete(ftd); if ((n = Swig_symbol_clookup(td, 0))) { if (GetFlag(n, "feature:valuewrapper")) { @@ -1323,23 +1326,14 @@ use_wrapper = !n || !GetFlag(n, "feature:novaluewrapper"); } } - if (use_wrapper) { - String *str = SwigType_str(td, 0); - w = NewStringf("SwigValueWrapper<%s >", str); - Delete(str); - } - - Delete(td); } - return w; } else { - /* safe use of SwigValueTypes, it can fail with some typemaps */ - SwigType *w = 0; - Node *n = 0; - int use_wrapper = 1; + /* safe use of SwigValueTypes, it can fail with some typemaps */ SwigType *ftd = SwigType_typedef_resolve_all(t); - SwigType *td = SwigType_strip_qualifiers(ftd); + td = SwigType_strip_qualifiers(ftd); + Delete(ftd); if (SwigType_type(td) == T_USER) { + use_wrapper = 1; if ((n = Swig_symbol_clookup(td, 0))) { if ((Checkattr(n, "nodeType", "class") && !Getattr(n, "allocate:noassign") @@ -1348,16 +1342,18 @@ use_wrapper = GetFlag(n, "feature:valuewrapper"); } } - } else { - use_wrapper = 0; } - if (use_wrapper) { - w = NewStringf("SwigValueWrapper<%s >", td); - } - Delete(ftd); - Delete(td); - return w; } + + if (use_wrapper) { + /* Need a space before the type in case it starts "::" (since the <: + * token is a digraph for [ in C++. Also need a space after the + * type in case it ends with ">" since then we form the token ">>". + */ + w = NewStringf("SwigValueWrapper< %s >", td); + } + Delete(td); + return w; } /* ---------------------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <efu...@us...> - 2007-04-01 13:22:40
|
Revision: 9666 http://swig.svn.sourceforge.net/swig/?rev=9666&view=rev Author: efuzzyone Date: 2007-04-01 06:22:36 -0700 (Sun, 01 Apr 2007) Log Message: ----------- Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Contents.html trunk/Doc/Manual/Lisp.html trunk/Source/Modules/cffi.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-03-30 02:34:38 UTC (rev 9665) +++ trunk/CHANGES.current 2007-04-01 13:22:36 UTC (rev 9666) @@ -1,6 +1,10 @@ Version 1.3.32 (in progress) ============================ +04/01/2007: efuzzyone + [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. + Also, improved documentation. + 03/30/2007: olly Avoid generating '<:' token when using SwigValueWrapper<> on a type which starts with '::' (patch #1690948). Modified: trunk/Doc/Manual/Contents.html =================================================================== --- trunk/Doc/Manual/Contents.html 2007-03-30 02:34:38 UTC (rev 9665) +++ trunk/Doc/Manual/Contents.html 2007-04-01 13:22:36 UTC (rev 9666) @@ -823,13 +823,14 @@ <li><a href="Lisp.html#Lisp_nn4">Additional Commandline Options </a> <li><a href="Lisp.html#Lisp_nn5">Generating CFFI bindings</a> <li><a href="Lisp.html#Lisp_nn6">Generating CFFI bindings for C++ code</a> +<li><a href="Lisp.html#Lisp_nn7">Inserting user code into generated files</a></li> </ul> -<li><a href="Lisp.html#Lisp_nn7">CLISP</a> +<li><a href="Lisp.html#Lisp_nn8">CLISP</a> <ul> -<li><a href="Lisp.html#Lisp_nn8">Additional Commandline Options </a> -<li><a href="Lisp.html#Lisp_nn9">Details on CLISP bindings</a> +<li><a href="Lisp.html#Lisp_nn9">Additional Commandline Options </a> +<li><a href="Lisp.html#Lisp_nn10">Details on CLISP bindings</a> </ul> -<li><a href="Lisp.html#Lisp_nn10">UFFI </a> +<li><a href="Lisp.html#Lisp_nn11">UFFI </a> </ul> </div> <!-- INDEX --> Modified: trunk/Doc/Manual/Lisp.html =================================================================== --- trunk/Doc/Manual/Lisp.html 2007-03-30 02:34:38 UTC (rev 9665) +++ trunk/Doc/Manual/Lisp.html 2007-04-01 13:22:36 UTC (rev 9666) @@ -16,13 +16,14 @@ <li><a href="#Lisp_nn4">Additional Commandline Options </a> <li><a href="#Lisp_nn5">Generating CFFI bindings</a> <li><a href="#Lisp_nn6">Generating CFFI bindings for C++ code</a> +<li><a href="#Lisp_nn7">Inserting user code into generated files</a></li> </ul> -<li><a href="#Lisp_nn7">CLISP</a> +<li><a href="#Lisp_nn8">CLISP</a> <ul> -<li><a href="#Lisp_nn8">Additional Commandline Options </a> -<li><a href="#Lisp_nn9">Details on CLISP bindings</a> +<li><a href="#Lisp_nn9">Additional Commandline Options </a> +<li><a href="#Lisp_nn10">Details on CLISP bindings</a> </ul> -<li><a href="#Lisp_nn10">UFFI </a> +<li><a href="#Lisp_nn11">UFFI </a> </ul> </div> <!-- INDEX --> @@ -567,10 +568,49 @@ module feel free to contact us on the SWIG mailing list, and also please add a "[CFFI]" tag in the subject line. -<H2><a name="Lisp_nn7"></a>21.3 CLISP</H2> +<H3><a name="Lisp_nn7"></a>21.2.4 Inserting user code into generated files</H3> +<p> +It is often necessary to <a href="SWIG.html#SWIG_nn40">include user-defined code</a> +into the automatically generated interface files. For example, when building +a C++ interface, example_wrap.cxx will likely not compile unless +you add a <tt>#include "header.h"</tt> directive. This can be done +using the SWIG <tt>%insert(section) %{ ...code... %}</tt> directive: +</p> +<div class="code"> +<pre> +%module example + +%insert("runtime") %{ +#include "header.h" +%} + +%include "header.h" + +int fact(int n); +</pre> +</div> + <p> +Additional sections have been added for inserting into the +generated lisp interface file: +</p> +<ul> + <li><tt>lisphead</tt> - inserts before type declarations</li> + <li><tt>swiglisp</tt> - inserts after type declarations according to + where it appears in the .i file</li> +</ul> +<p> +Note that the block <tt>%{ ... %}</tt> is effectively a shortcut for +<tt>%insert("runtime") %{ ... %}</tt>. +</p> + + +<H2><a name="Lisp_nn8"></a>21.3 CLISP</H2> + + +<p> <a href="http://clisp.cons.org">CLISP</a> is a feature-loaded implementation of common lisp which is portable across most of the operating system environments and hardware. CLISP includes an @@ -597,7 +637,7 @@ interface file for the CLISP module. The CLISP module tries to produce code which is both human readable and easily modifyable. </p> -<H3><a name="Lisp_nn8"></a>21.3.1 Additional Commandline Options </H3> +<H3><a name="Lisp_nn9"></a>21.3.1 Additional Commandline Options </H3> <p> @@ -630,7 +670,7 @@ </table> -<H3><a name="Lisp_nn9"></a>21.3.2 Details on CLISP bindings</H3> +<H3><a name="Lisp_nn10"></a>21.3.2 Details on CLISP bindings</H3> <p> @@ -754,7 +794,7 @@ </pre></div> -<H2><a name="Lisp_nn10"></a>21.4 UFFI </H2> +<H2><a name="Lisp_nn11"></a>21.4 UFFI </H2> </body> Modified: trunk/Source/Modules/cffi.cxx =================================================================== --- trunk/Source/Modules/cffi.cxx 2007-03-30 02:34:38 UTC (rev 9665) +++ trunk/Source/Modules/cffi.cxx 2007-04-01 13:22:36 UTC (rev 9666) @@ -881,7 +881,7 @@ } /* To be called by code generating the lisp interface - Will return a containing the literal based on type. + Will return a String containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). @@ -953,7 +953,8 @@ /* Use CL syntax for string literals */ Delete(num); return NewStringf("\"%s\"", num_param); - } else if (SwigType_type(type) == T_INT) { + } else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) { + // Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s); Replaceall(num, "u", ""); Replaceall(num, "U", ""); Replaceall(num, "l", ""); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2007-04-03 15:56:40
|
Revision: 9669 http://swig.svn.sourceforge.net/swig/?rev=9669&view=rev Author: olly Date: 2007-04-03 08:56:36 -0700 (Tue, 03 Apr 2007) Log Message: ----------- [PHP4] Add missing ZTS annotations to generated C++ wrapper code to fix compilation failures when using ZTS enabled SWIG (Linux distributions tend to disable ZTS, but notably the Windows build uses it by default). Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php4.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2007-04-02 21:37:13 UTC (rev 9668) +++ trunk/CHANGES.current 2007-04-03 15:56:36 UTC (rev 9669) @@ -1,9 +1,15 @@ Version 1.3.32 (in progress) ============================ +04/03/2007: olly + [PHP4] Add missing ZTS annotations to generated C++ wrapper code + to fix compilation failures when using ZTS enabled SWIG (Linux + distributions tend to disable ZTS, but notably the Windows build + uses it by default). + 04/01/2007: efuzzyone - [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. - Also, improved documentation. + [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. + Also, improved documentation. 03/30/2007: olly Avoid generating '<:' token when using SwigValueWrapper<> on a type Modified: trunk/Source/Modules/php4.cxx =================================================================== --- trunk/Source/Modules/php4.cxx 2007-04-02 21:37:13 UTC (rev 9668) +++ trunk/Source/Modules/php4.cxx 2007-04-03 15:56:36 UTC (rev 9669) @@ -2304,11 +2304,11 @@ if (base.item) { Printf(s_oinit, - "if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,&ce_swig_%s,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", + "if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,&ce_swig_%s,NULL TSRMLS_CC))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", shadow_classname, shadow_classname, GetChar(base.item, "sym:name"), shadow_classname); } else { Printf(s_oinit, - "if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,NULL,NULL))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", + "if (! (ptr_ce_swig_%s=zend_register_internal_class_ex(&ce_swig_%s,NULL,NULL TSRMLS_CC))) zend_error(E_ERROR,\"Error registering wrapper for class %s\");\n", shadow_classname, shadow_classname, shadow_classname); } Printf(s_oinit, "\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |