From: Marcelo M. <mar...@us...> - 2004-09-26 01:00:50
|
Update of /cvsroot/swig/SWIG/Lib/python In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16307 Modified Files: pyrun.swg pyswigtype.swg python.swg Added Files: pyinit.swg pyruntime.swg pyuserdir.swg Log Message: cleaning + comments, and add the nondynamic feature handlers --- NEW FILE: pyruntime.swg --- /* Python.h has to appear first */ %insert(runtime) %{ #include <Python.h> %} %insert(runtime) "precommon.swg"; %insert(runtime) "common.swg"; /* Common type-checking code */ %insert(runtime) "pyrun.swg"; /* Python run-time code */ Index: python.swg =================================================================== RCS file: /cvsroot/swig/SWIG/Lib/python/python.swg,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** python.swg 17 Sep 2004 06:17:35 -0000 1.52 --- python.swg 26 Sep 2004 01:00:28 -0000 1.53 *************** *** 5,43 **** * ----------------------------------------------------------------------------- */ ! /* Python.h has to appear first */ ! ! %insert(runtime) %{ ! #include <Python.h> ! %} ! ! %insert(runtime) "precommon.swg"; ! %insert(runtime) "common.swg"; /* Common type-checking code */ ! %insert(runtime) "pyrun.swg"; /* Python run-time code */ ! ! /* Special directive for shadow code */ ! #define %shadow %insert("shadow") ! #define %pythoncode %insert("python") %include <pymacros.swg> - /* ----------------------------------------------------------------------------- * Look for user fragments file. If not found, include empty system one. * ----------------------------------------------------------------------------- */ - %include "pyfragments.swg" - - /* ----------------------------------------------------------------------------- - * SWIGTYPE typemaps - * ----------------------------------------------------------------------------- */ - - %include <pyswigtype.swg> - /* ----------------------------------------------------------------------------- * Typemap specializations * ----------------------------------------------------------------------------- */ ! %include <pyinout.swg> %include <pyvoid.swg> --- 5,32 ---- * ----------------------------------------------------------------------------- */ ! /* ----------------------------------------------------------------------------- ! * The runtime part ! * ----------------------------------------------------------------------------- */ ! %include <pyruntime.swg> ! /* ----------------------------------------------------------------------------- ! * Special user directives ! * ----------------------------------------------------------------------------- */ ! %include <pyuserdir.swg> + /* ----------------------------------------------------------------------------- + * Inner macros (ugly ones) + * ----------------------------------------------------------------------------- */ %include <pymacros.swg> /* ----------------------------------------------------------------------------- * Look for user fragments file. If not found, include empty system one. * ----------------------------------------------------------------------------- */ %include "pyfragments.swg" /* ----------------------------------------------------------------------------- * Typemap specializations * ----------------------------------------------------------------------------- */ ! %include <pyswigtype.swg> %include <pyinout.swg> %include <pyvoid.swg> *************** *** 62,88 **** /* ------------------------------------------------------------ ! * The start of the Python initialization function * ------------------------------------------------------------ */ ! ! %init %{ ! #ifdef __cplusplus ! extern "C" ! #endif ! SWIGEXPORT(void) SWIG_init(void) { ! static PyObject *SWIG_globals = 0; ! static int typeinit = 0; ! PyObject *m, *d; ! int i; ! if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); ! m = Py_InitModule((char *) SWIG_name, SwigMethods); ! d = PyModule_GetDict(m); ! ! if (!typeinit) { ! for (i = 0; swig_types_initial[i]; i++) { ! swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); ! } ! typeinit = 1; ! } ! SWIG_InstallConstants(d,swig_const_table); ! %} ! --- 51,55 ---- /* ------------------------------------------------------------ ! * The Python initialization function * ------------------------------------------------------------ */ ! %include <pyinit.swg> Index: pyswigtype.swg =================================================================== RCS file: /cvsroot/swig/SWIG/Lib/python/pyswigtype.swg,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** pyswigtype.swg 1 Sep 2004 08:42:37 -0000 1.7 --- pyswigtype.swg 26 Sep 2004 01:00:28 -0000 1.8 *************** *** 5,21 **** /* Pointers, references, and arrays */ ! %typemap(in) SWIGTYPE *, SWIGTYPE [] ! "if ((SWIG_ConvertPtr($input,(void **)(&$1),$1_descriptor, ! SWIG_POINTER_EXCEPTION | $disown)) == -1) SWIG_fail;"; %typemap(in) SWIGTYPE *DISOWN ! "if ((SWIG_ConvertPtr($input,(void **)(&$1),$1_descriptor, ! SWIG_POINTER_EXCEPTION | SWIG_POINTER_DISOWN)) == -1) SWIG_fail;"; /* Additional check for null references */ %typemap(in) SWIGTYPE & ! "if ((SWIG_ConvertPtr($input,(void **)(&$1),$1_descriptor, ! SWIG_POINTER_EXCEPTION | $disown)) == -1) ! SWIG_fail; if ($1 == NULL) { PyErr_SetString(PyExc_TypeError,\"null reference\"); --- 5,20 ---- /* Pointers, references, and arrays */ ! %typemap(in) SWIGTYPE *, SWIGTYPE [] ! "$1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_EXCEPTION | $disown); ! if (PyErr_Occurred()) SWIG_fail;"; %typemap(in) SWIGTYPE *DISOWN ! "$1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_EXCEPTION | SWIG_POINTER_DISOWN); ! if (PyErr_Occurred()) SWIG_fail;"; /* Additional check for null references */ %typemap(in) SWIGTYPE & ! "$1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_EXCEPTION | $disown); ! if (PyErr_Occurred()) SWIG_fail; if ($1 == NULL) { PyErr_SetString(PyExc_TypeError,\"null reference\"); Index: pyrun.swg =================================================================== RCS file: /cvsroot/swig/SWIG/Lib/python/pyrun.swg,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** pyrun.swg 26 Aug 2004 21:17:18 -0000 1.31 --- pyrun.swg 26 Sep 2004 01:00:28 -0000 1.32 *************** *** 27,30 **** --- 27,34 ---- #define SWIG_fail goto fail + #ifndef SWIG_NO_COBJECT_TYPES + #define SWIG_COBJECT_TYPES + #endif + /* Constant information structure */ typedef struct swig_const_info { *************** *** 66,71 **** SWIGIMPORT(PyObject *) SWIG_Python_newvarlink(void); SWIGIMPORT(void) SWIG_Python_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *)); ! SWIGIMPORT(int) SWIG_Python_ConvertPacked(PyObject *, void *, int sz, swig_type_info *, int); ! SWIGIMPORT(PyObject *) SWIG_Python_NewPackedObj(void *, int sz, swig_type_info *); SWIGIMPORT(void) SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]); --- 70,75 ---- SWIGIMPORT(PyObject *) SWIG_Python_newvarlink(void); SWIGIMPORT(void) SWIG_Python_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *)); ! SWIGIMPORT(int) SWIG_Python_ConvertPacked(PyObject *, void *, size_t sz, swig_type_info *, int); ! SWIGIMPORT(PyObject *) SWIG_Python_NewPackedObj(void *, size_t sz, swig_type_info *); SWIGIMPORT(void) SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]); *************** *** 304,309 **** if (ty && c) { PyErr_Format(PyExc_TypeError, ! "Type error. Got %s, expected %s", ! c, ty->name); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); --- 308,313 ---- if (ty && c) { PyErr_Format(PyExc_TypeError, ! "Type error. Got '%s', expected '%s'", ! c, SWIG_TypePrettyName(ty)); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); *************** *** 317,321 **** SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; ! SWIG_Python_ConvertPtr(obj, &result, ty, flags | SWIG_POINTER_EXCEPTION); return result; } --- 321,332 ---- SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; ! if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { ! if (flags & SWIG_POINTER_EXCEPTION) { ! PyErr_Clear(); ! PyErr_Format(PyExc_TypeError, ! "Type error in argument %i: expected a pointer of type '%s'.", ! argnum, SWIG_TypePrettyName(ty)); ! } ! } return result; } *************** *** 323,327 **** /* Convert a packed value value */ SWIGRUNTIME(int) ! SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, int sz, swig_type_info *ty, int flags) { swig_type_info *tc; char *c = 0; --- 334,338 ---- /* Convert a packed value value */ SWIGRUNTIME(int) ! SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; char *c = 0; *************** *** 344,349 **** if (ty && c) { PyErr_Format(PyExc_TypeError, ! "Type error. Got %s, expected %s", ! c, ty->name); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); --- 355,360 ---- if (ty && c) { PyErr_Format(PyExc_TypeError, ! "Type error. Got '%s', expected '%s'", ! c, SWIG_TypePrettyName(ty)); } else { PyErr_SetString(PyExc_TypeError,"Expected a pointer"); *************** *** 391,395 **** SWIGRUNTIME(PyObject *) ! SWIG_Python_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; --- 402,406 ---- SWIGRUNTIME(PyObject *) ! SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { char result[1024]; char *r = result; --- NEW FILE: pyinit.swg --- /* ------------------------------------------------------------ * The start of the Python initialization function * ------------------------------------------------------------ */ %init %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); %} --- NEW FILE: pyuserdir.swg --- /* ----------------------------------------------------------------------------- * Special user directives * ----------------------------------------------------------------------------- */ /* shadow code */ #define %shadow %insert("shadow") #define %pythoncode %insert("python") /* Use the "nondynamic" feature to make a wrapped class behaves as a "nondynamic" one, ie, a python class that doesn't dynamically add new attributes. For example, for the class %pythonnondynamic(1) A; struct A { int a; int b; }; you will get: aa = A() aa.a = 1 # Ok aa.b = 1 # Ok aa.c = 3 # error Since "nondynamic" is a feature, if you use it like %pythonnondynamic(1); it will make all the wrapped classes nondynamic ones. The implementation is based on the recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 and works for modern (-modern) and plain python. We don't use __slots__, so, it works with old python versions. You can also use the raw %feature form %feature("pythonnondynamic") A; or the inverse form %pythondynamic(0) A; */ #define %pythonnondynamic(FLAG) %feature("python:nondynamic", #FLAG) #define %pythondynamic(FLAG) %pythonnondynamic(!FLAG) |