From: <sz...@us...> - 2010-12-14 00:08:54
|
Revision: 12345 http://swig.svn.sourceforge.net/swig/?rev=12345&view=rev Author: szager Date: 2010-12-14 00:08:45 +0000 (Tue, 14 Dec 2010) Log Message: ----------- Added support for operator overrides (PyNumberMethods) and member variable access. test suite now croaks on inplaceadd. Modified Paths: -------------- branches/szager-python-builtin/Lib/python/builtin.swg branches/szager-python-builtin/Lib/python/pyopers.swg branches/szager-python-builtin/Lib/python/pyrun.swg branches/szager-python-builtin/Source/Modules/python.cxx Modified: branches/szager-python-builtin/Lib/python/builtin.swg =================================================================== --- branches/szager-python-builtin/Lib/python/builtin.swg 2010-12-12 20:02:09 UTC (rev 12344) +++ branches/szager-python-builtin/Lib/python/builtin.swg 2010-12-14 00:08:45 UTC (rev 12345) @@ -1,3 +1,18 @@ +extern int +pyswig_setter_closure (PyObject *obj, PyObject *val, void *closure) +{ + if (!closure) + return -1; + PyObject *tuple = PyTuple_New(1); + assert(tuple); + PyTuple_SET_ITEM(tuple, 0, val); + Py_XINCREF(val); + PyObject *result = ((PyCFunction) closure)(obj, tuple); + Py_DECREF(tuple); + Py_XDECREF(result); + return result ? 0 : -1; +} + #ifdef __cplusplus namespace { @@ -10,6 +25,8 @@ typedef obj_type& reference; static PyMethodDef methods[]; + static PyGetSetDef getset[]; + static PyNumberMethods number_methods; static PyTypeObject pytype; static SwigPyClientData clientdata; }; @@ -23,6 +40,29 @@ (*pyobj->ob_type->tp_free)(pyobj); } +template <PyCFunction func> PyObject* +pyswig_binaryfunc_closure (PyObject *a, PyObject *b) +{ + PyObject *tuple = PyTuple_New(1); + assert(tuple); + PyTuple_SET_ITEM(tuple, 0, b); + PyObject *result = func(a, tuple); + Py_DECREF(tuple); + return result; +} + +template <PyCFunction func> PyObject* +pyswig_ternaryfunc_closure (PyObject *a, PyObject *b, PyObject *c) +{ + PyObject *tuple = PyTuple_New(2); + assert(tuple); + PyTuple_SET_ITEM(tuple, 0, b); + PyTuple_SET_ITEM(tuple, 1, c); + PyObject *result = func(a, tuple); + Py_DECREF(tuple); + return result; +} + } // namespace { #endif Modified: branches/szager-python-builtin/Lib/python/pyopers.swg =================================================================== --- branches/szager-python-builtin/Lib/python/pyopers.swg 2010-12-12 20:02:09 UTC (rev 12344) +++ branches/szager-python-builtin/Lib/python/pyopers.swg 2010-12-14 00:08:45 UTC (rev 12345) @@ -5,41 +5,53 @@ #ifdef __cplusplus -#define %pybinoperator(pyname,oper) %rename(pyname) oper; %pythonmaybecall oper +#if defined(SWIGPYTHON_BUILTIN) +#define %pybinoperator(pyname,oper,functp,slot) %rename(pyname) oper; %pythonmaybecall oper; %feature("pyslot", #slot, functype=#functp) oper; +#define %pycompare(pyname,oper,comptype) %rename(pyname) oper; %pythonmaybecall oper; %feature("pycompare", #comptype) oper; +#else +#define %pybinoperator(pyname,oper,functp,slot) %rename(pyname) oper; %pythonmaybecall oper +#define %pycompare(pyname,oper,comptype) %pybinoperator(pyname,oper,,comptype) +#endif -%pybinoperator(__add__, *::operator+); -%pybinoperator(__pos__, *::operator+()); -%pybinoperator(__pos__, *::operator+() const); -%pybinoperator(__sub__, *::operator-); -%pybinoperator(__neg__, *::operator-()); -%pybinoperator(__neg__, *::operator-() const); -%pybinoperator(__mul__, *::operator*); -%pybinoperator(__div__, *::operator/); -%pybinoperator(__mod__, *::operator%); -%pybinoperator(__lshift__, *::operator<<); -%pybinoperator(__rshift__, *::operator>>); -%pybinoperator(__and__, *::operator&); -%pybinoperator(__or__, *::operator|); -%pybinoperator(__xor__, *::operator^); -%pybinoperator(__lt__, *::operator<); -%pybinoperator(__le__, *::operator<=); -%pybinoperator(__gt__, *::operator>); -%pybinoperator(__ge__, *::operator>=); -%pybinoperator(__eq__, *::operator==); -%pybinoperator(__ne__, *::operator!=); +%pybinoperator(__add__, *::operator+, binary_func, nb_add); +%pybinoperator(__pos__, *::operator+(), unary_func, nb_positive); +%pybinoperator(__pos__, *::operator+() const, unary_func, nb_positive); +%pybinoperator(__sub__, *::operator-, binary_func, nb_subtract); +%pybinoperator(__neg__, *::operator-(), unary_func, nb_negative); +%pybinoperator(__neg__, *::operator-() const, unary_func, nb_negative); +%pybinoperator(__mul__, *::operator*, binary_func, nb_multiply); +%pybinoperator(__div__, *::operator/, binary_func, nb_div); +%pybinoperator(__mod__, *::operator%, binary_func, nb_remainder); +%pybinoperator(__lshift__, *::operator<<, binary_func, nb_lshift); +%pybinoperator(__rshift__, *::operator>>, binary_func, nb_rshift); +%pybinoperator(__and__, *::operator&, binary_func, nb_and); +%pybinoperator(__or__, *::operator|, binary_func, nb_or); +%pybinoperator(__xor__, *::operator^, binary_func, nb_xor); +%pycompare(__lt__, *::operator<, Py_LT); +%pycompare(__le__, *::operator<=, Py_LE); +%pycompare(__gt__, *::operator>, Py_GT); +%pycompare(__ge__, *::operator>=, Py_GE); +%pycompare(__eq__, *::operator==, Py_EQ); +%pycompare(__ne__, *::operator!=, Py_NE); +%feature("pyslot", "nb_truediv", functype="binary_func") *::operator/; - /* Special cases */ %rename(__invert__) *::operator~; +%feature("pyslot", "nb_invert", functype="unary_func") *::operator~; %rename(__call__) *::operator(); +%feature("pyslot", "tp_call", functype="ternary_func") *::operator(); +#if defined(SWIGPYTHON_BUILTIN) +%pybinoperator(__nonzero__, *::operator bool, unary_func, nb_nonzero); +#else %feature("shadow") *::operator bool %{ def __nonzero__(self): return $action(self) __bool__ = __nonzero__ %}; %rename(__nonzero__) *::operator bool; +#endif /* Ignored operators */ %ignoreoperator(LNOT) operator!; @@ -90,18 +102,22 @@ */ -#define %pyinplaceoper(SwigPyOper, Oper) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper +#if defined(SWIGPYTHON_BUILTIN) +#define %pyinplaceoper(SwigPyOper, Oper, functp, slot) %rename(SwigPyOper) Oper; %feature("pyslot", #slot, functype=#functp) Oper; +#else +#define %pyinplaceoper(SwigPyOper, Oper, functp, slot) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper +#endif -%pyinplaceoper(__iadd__ , *::operator +=); -%pyinplaceoper(__isub__ , *::operator -=); -%pyinplaceoper(__imul__ , *::operator *=); -%pyinplaceoper(__idiv__ , *::operator /=); -%pyinplaceoper(__imod__ , *::operator %=); -%pyinplaceoper(__iand__ , *::operator &=); -%pyinplaceoper(__ior__ , *::operator |=); -%pyinplaceoper(__ixor__ , *::operator ^=); -%pyinplaceoper(__ilshift__, *::operator <<=); -%pyinplaceoper(__irshift__, *::operator >>=); +%pyinplaceoper(__iadd__ , *::operator +=, binary_func, nb_inplace_add); +%pyinplaceoper(__isub__ , *::operator -=, binary_func, nb_inplace_subtract); +%pyinplaceoper(__imul__ , *::operator *=, binary_func, nb_inplace_multiply); +%pyinplaceoper(__idiv__ , *::operator /=, binary_func, nb_inplace_divide); +%pyinplaceoper(__imod__ , *::operator %=, binary_func, nb_inplace_remainder); +%pyinplaceoper(__iand__ , *::operator &=, binary_func, nb_inplace_and); +%pyinplaceoper(__ior__ , *::operator |=, binary_func, nb_inplace_or); +%pyinplaceoper(__ixor__ , *::operator ^=, binary_func, nb_inplace_xor); +%pyinplaceoper(__ilshift__, *::operator <<=, binary_func, nb_inplace_lshift); +%pyinplaceoper(__irshift__, *::operator >>=, binary_func, nb_inplace_rshift); /* Finally, in python we need to mark the binary operations to fail as Modified: branches/szager-python-builtin/Lib/python/pyrun.swg =================================================================== --- branches/szager-python-builtin/Lib/python/pyrun.swg 2010-12-12 20:02:09 UTC (rev 12344) +++ branches/szager-python-builtin/Lib/python/pyrun.swg 2010-12-14 00:08:45 UTC (rev 12345) @@ -1076,8 +1076,13 @@ PyTypeObject *obj_tp; for (obj_tp = obj->ob_type; obj_tp; obj_tp = obj_tp->tp_base) { if (obj_tp == target_tp) { + SwigPyObject *sobj = (SwigPyObject*) obj; + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) + sobj->own = 0; if (ptr) - *ptr = ((SwigPyObject*) obj)->ptr; + *ptr = sobj->ptr; return SWIG_OK; } } Modified: branches/szager-python-builtin/Source/Modules/python.cxx =================================================================== --- branches/szager-python-builtin/Source/Modules/python.cxx 2010-12-12 20:02:09 UTC (rev 12344) +++ branches/szager-python-builtin/Source/Modules/python.cxx 2010-12-14 00:08:45 UTC (rev 12345) @@ -1,3 +1,4 @@ +/* mode: c++; c-basic-offset: 2 */ /* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional @@ -46,8 +47,8 @@ static String *f_shadow_imports = 0; static String *f_shadow_import_stmts = 0; static String *f_shadow_stubs = 0; +static Hash *builtin_getset = 0; - static String *methods; static String *class_name; static String *shadow_indent = 0; @@ -166,15 +167,15 @@ static String* getSlot (Node *n, const char *key) { - static String *slot_default = NewString("0"); - String *val = Getattr(n, key); - return val ? val : slot_default; + static String *slot_default = NewString("0"); + String *val = Getattr(n, key); + return val ? val : slot_default; } class PYTHON:public Language { public: - PYTHON() { + PYTHON() { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, @@ -448,20 +449,20 @@ fputs(usage2, stdout); fputs(usage3, stdout); } else if (strcmp(argv[i], "-py3") == 0) { - py3 = 1; - Swig_mark_arg(i); + py3 = 1; + Swig_mark_arg(i); } else if (strcmp(argv[i], "-builtin") == 0) { - builtin = 1; - Preprocessor_define("SWIGPYTHON_BUILTIN", 0); - Swig_mark_arg(i); + builtin = 1; + Preprocessor_define("SWIGPYTHON_BUILTIN", 0); + Swig_mark_arg(i); } } } /* for */ if (py3) { - /* force disable features that not compatible with Python 3.x */ - classic = 0; + /* force disable features that not compatible with Python 3.x */ + classic = 0; } if (cppcast) { @@ -553,10 +554,11 @@ f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); + builtin_getset = NewHash(); if (builtin) { - f_builtins = NewString(""); - Printf(f_builtins, "namespace {\n\n"); + f_builtins = NewString(""); + Printf(f_builtins, "namespace {\n\n"); } if (directorsEnabled()) { @@ -699,159 +701,159 @@ /* If shadow classing is enabled, we're going to change the module name to "_module" */ if (shadow) { - String *filen = NewStringf("%s%s.py", SWIG_output_directory(), Char(module)); - // If we don't have an interface then change the module name X to _X - if (interface) - module = interface; - else - Insert(module, 0, "_"); - if ((f_shadow_py = NewFile(filen, "w", SWIG_output_files())) == 0) { - FileErrorDisplay(filen); - SWIG_exit(EXIT_FAILURE); - } - Delete(filen); - filen = NULL; + String *filen = NewStringf("%s%s.py", SWIG_output_directory(), Char(module)); + // If we don't have an interface then change the module name X to _X + if (interface) + module = interface; + else + Insert(module, 0, "_"); + if ((f_shadow_py = NewFile(filen, "w", SWIG_output_files())) == 0) { + FileErrorDisplay(filen); + SWIG_exit(EXIT_FAILURE); + } + Delete(filen); + filen = NULL; - f_shadow = NewString(""); - f_shadow_imports = NewString(""); - f_shadow_import_stmts = NewString(""); - f_shadow_stubs = NewString(""); + f_shadow = NewString(""); + f_shadow_imports = NewString(""); + f_shadow_import_stmts = NewString(""); + f_shadow_stubs = NewString(""); - Printv(f_shadow_import_stmts, "SWIGINTERN void\n", NIL); - Printv(f_shadow_import_stmts, "SWIG_Python_builtin_imports()\n", NIL); - Printv(f_shadow_import_stmts, "{\n", NIL); - Printv(f_shadow_import_stmts, tab4 "PyObject *import_str = NULL;\n", NIL); + Printv(f_shadow_import_stmts, "SWIGINTERN void\n", NIL); + Printv(f_shadow_import_stmts, "SWIG_Python_builtin_imports()\n", NIL); + Printv(f_shadow_import_stmts, "{\n", NIL); + Printv(f_shadow_import_stmts, tab4 "PyObject *import_str = NULL;\n", NIL); - Swig_register_filebyname("shadow", f_shadow); - Swig_register_filebyname("python", f_shadow); + Swig_register_filebyname("shadow", f_shadow); + Swig_register_filebyname("python", f_shadow); - Swig_banner_target_lang(f_shadow, "#"); + Swig_banner_target_lang(f_shadow, "#"); - if (!modern) { - Printv(f_shadow, "# This file is compatible with both classic and new-style classes.\n", NIL); - } + if (!modern) { + Printv(f_shadow, "# This file is compatible with both classic and new-style classes.\n", NIL); + } - if (mod_docstring && Len(mod_docstring)) { - Printv(f_shadow, "\"\"\"\n", mod_docstring, "\n\"\"\"\n\n", NIL); - Delete(mod_docstring); - mod_docstring = NULL; - } + if (mod_docstring && Len(mod_docstring)) { + Printv(f_shadow, "\"\"\"\n", mod_docstring, "\n\"\"\"\n\n", NIL); + Delete(mod_docstring); + mod_docstring = NULL; + } - Printv(f_shadow, "\nfrom sys import version_info\n", NULL); + Printv(f_shadow, "\nfrom sys import version_info\n", NULL); - if (!builtin && fastproxy) { - Printv(f_shadow, "if version_info >= (3,0,0):\n", NULL); - Printf(f_shadow, tab4 "new_instancemethod = lambda func, inst, cls: %s.SWIG_PyInstanceMethod_New(func)\n", module); - Printv(f_shadow, "else:\n", NULL); - Printv(f_shadow, tab4, "from new import instancemethod as new_instancemethod\n", NULL); - } - - /* Import the C-extension module. This should be a relative import, - * since the shadow module may also have been imported by a relative - * import, and there is thus no guarantee that the C-extension is on - * sys.path. Relative imports must be explicitly specified from 2.6.0 - * onwards (implicit relative imports will raise a DeprecationWarning - * in 2.6, and fail in 2.7 onwards), but the relative import syntax - * isn't available in python 2.4 or earlier, so we have to write some - * code conditional on the python version. - */ - Printv(f_shadow, "if version_info >= (2,6,0):\n", NULL); - Printv(f_shadow, tab4, "def swig_import_helper():\n", NULL); - Printv(f_shadow, tab8, "from os.path import dirname\n", NULL); - Printv(f_shadow, tab8, "import imp\n", NULL); - Printv(f_shadow, tab8, "fp = None\n", NULL); - Printv(f_shadow, tab8, "try:\n", NULL); - Printf(f_shadow, tab4 tab8 "fp, pathname, description = imp.find_module('%s', [dirname(__file__)])\n", module); - Printf(f_shadow, tab8 "except ImportError:\n"); - /* At here, the module may already loaded, so simply import it. */ - Printf(f_shadow, tab4 tab8 "import %s\n", module); - Printf(f_shadow, tab4 tab8 "return %s\n", module); - Printv(f_shadow, tab8 "if fp is not None:\n", NULL); - Printv(f_shadow, tab4 tab8 "try:\n", NULL); - Printf(f_shadow, tab8 tab8 "_mod = imp.load_module('%s', fp, pathname, description)\n", module); - Printv(f_shadow, tab4 tab8, "finally:\n", NULL); - Printv(f_shadow, tab8 tab8, "fp.close()\n", NULL); - Printv(f_shadow, tab4 tab8, "return _mod\n", NULL); - Printf(f_shadow, tab4 "%s = swig_import_helper()\n", module); - Printv(f_shadow, tab4, "del swig_import_helper\n", NULL); + if (!builtin && fastproxy) { + Printv(f_shadow, "if version_info >= (3,0,0):\n", NULL); + Printf(f_shadow, tab4 "new_instancemethod = lambda func, inst, cls: %s.SWIG_PyInstanceMethod_New(func)\n", module); Printv(f_shadow, "else:\n", NULL); - Printf(f_shadow, tab4 "import %s\n", module); + Printv(f_shadow, tab4, "from new import instancemethod as new_instancemethod\n", NULL); + } - /* Delete the version_info symbol since we don't use it elsewhere in the - * module. */ - Printv(f_shadow, "del version_info\n", NULL); + /* Import the C-extension module. This should be a relative import, + * since the shadow module may also have been imported by a relative + * import, and there is thus no guarantee that the C-extension is on + * sys.path. Relative imports must be explicitly specified from 2.6.0 + * onwards (implicit relative imports will raise a DeprecationWarning + * in 2.6, and fail in 2.7 onwards), but the relative import syntax + * isn't available in python 2.4 or earlier, so we have to write some + * code conditional on the python version. + */ + Printv(f_shadow, "if version_info >= (2,6,0):\n", NULL); + Printv(f_shadow, tab4, "def swig_import_helper():\n", NULL); + Printv(f_shadow, tab8, "from os.path import dirname\n", NULL); + Printv(f_shadow, tab8, "import imp\n", NULL); + Printv(f_shadow, tab8, "fp = None\n", NULL); + Printv(f_shadow, tab8, "try:\n", NULL); + Printf(f_shadow, tab4 tab8 "fp, pathname, description = imp.find_module('%s', [dirname(__file__)])\n", module); + Printf(f_shadow, tab8 "except ImportError:\n"); + /* At here, the module may already loaded, so simply import it. */ + Printf(f_shadow, tab4 tab8 "import %s\n", module); + Printf(f_shadow, tab4 tab8 "return %s\n", module); + Printv(f_shadow, tab8 "if fp is not None:\n", NULL); + Printv(f_shadow, tab4 tab8 "try:\n", NULL); + Printf(f_shadow, tab8 tab8 "_mod = imp.load_module('%s', fp, pathname, description)\n", module); + Printv(f_shadow, tab4 tab8, "finally:\n", NULL); + Printv(f_shadow, tab8 tab8, "fp.close()\n", NULL); + Printv(f_shadow, tab4 tab8, "return _mod\n", NULL); + Printf(f_shadow, tab4 "%s = swig_import_helper()\n", module); + Printv(f_shadow, tab4, "del swig_import_helper\n", NULL); + Printv(f_shadow, "else:\n", NULL); + Printf(f_shadow, tab4 "import %s\n", module); - if (builtin) { - Printf(f_shadow, "from %s import *\n", module); - } - if (modern || !classic) { - Printv(f_shadow, "try:\n", tab4, "_swig_property = property\n", "except NameError:\n", tab4, "pass # Python < 2.2 doesn't have 'property'.\n", NULL); - } - /* if (!modern) */ - /* always needed, a class can be forced to be no-modern, such as an exception */ - { - // Python-2.2 object hack - Printv(f_shadow, - "def _swig_setattr_nondynamic(self,class_type,name,value,static=1):\n", - tab4, "if (name == \"thisown\"): return self.this.own(value)\n", - tab4, "if (name == \"this\"):\n", tab4, tab4, "if type(value).__name__ == 'SwigPyObject':\n", tab4, tab8, "self.__dict__[name] = value\n", + /* Delete the version_info symbol since we don't use it elsewhere in the + * module. */ + Printv(f_shadow, "del version_info\n", NULL); + + if (builtin) { + Printf(f_shadow, "from %s import *\n", module); + } + if (modern || !classic) { + Printv(f_shadow, "try:\n", tab4, "_swig_property = property\n", "except NameError:\n", tab4, "pass # Python < 2.2 doesn't have 'property'.\n", NULL); + } + /* if (!modern) */ + /* always needed, a class can be forced to be no-modern, such as an exception */ + { + // Python-2.2 object hack + Printv(f_shadow, + "def _swig_setattr_nondynamic(self,class_type,name,value,static=1):\n", + tab4, "if (name == \"thisown\"): return self.this.own(value)\n", + tab4, "if (name == \"this\"):\n", tab4, tab4, "if type(value).__name__ == 'SwigPyObject':\n", tab4, tab8, "self.__dict__[name] = value\n", #ifdef USE_THISOWN - tab4, tab8, "if hasattr(value,\"thisown\"): self.__dict__[\"thisown\"] = value.thisown\n", tab4, tab8, "del value.thisown\n", + tab4, tab8, "if hasattr(value,\"thisown\"): self.__dict__[\"thisown\"] = value.thisown\n", tab4, tab8, "del value.thisown\n", #endif - tab4, tab8, "return\n", tab4, "method = class_type.__swig_setmethods__.get(name,None)\n", tab4, "if method: return method(self,value)\n", + tab4, tab8, "return\n", tab4, "method = class_type.__swig_setmethods__.get(name,None)\n", tab4, "if method: return method(self,value)\n", #ifdef USE_THISOWN - tab4, "if (not static) or hasattr(self,name) or (name == \"thisown\"):\n", + tab4, "if (not static) or hasattr(self,name) or (name == \"thisown\"):\n", #else - tab4, "if (not static) or hasattr(self,name):\n", + tab4, "if (not static) or hasattr(self,name):\n", #endif - tab4, tab4, "self.__dict__[name] = value\n", - tab4, "else:\n", - tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n\n", - "def _swig_setattr(self,class_type,name,value):\n", tab4, "return _swig_setattr_nondynamic(self,class_type,name,value,0)\n\n", NIL); + tab4, tab4, "self.__dict__[name] = value\n", + tab4, "else:\n", + tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n\n", + "def _swig_setattr(self,class_type,name,value):\n", tab4, "return _swig_setattr_nondynamic(self,class_type,name,value,0)\n\n", NIL); - Printv(f_shadow, - "def _swig_getattr(self,class_type,name):\n", - tab4, "if (name == \"thisown\"): return self.this.own()\n", - tab4, "method = class_type.__swig_getmethods__.get(name,None)\n", - tab4, "if method: return method(self)\n", tab4, "raise AttributeError(name)\n\n", NIL); + Printv(f_shadow, + "def _swig_getattr(self,class_type,name):\n", + tab4, "if (name == \"thisown\"): return self.this.own()\n", + tab4, "method = class_type.__swig_getmethods__.get(name,None)\n", + tab4, "if method: return method(self)\n", tab4, "raise AttributeError(name)\n\n", NIL); - Printv(f_shadow, - "def _swig_repr(self):\n", - tab4, "try: strthis = \"proxy of \" + self.this.__repr__()\n", - tab4, "except: strthis = \"\"\n", tab4, "return \"<%s.%s; %s >\" % (self.__class__.__module__, self.__class__.__name__, strthis,)\n\n", NIL); + Printv(f_shadow, + "def _swig_repr(self):\n", + tab4, "try: strthis = \"proxy of \" + self.this.__repr__()\n", + tab4, "except: strthis = \"\"\n", tab4, "return \"<%s.%s; %s >\" % (self.__class__.__module__, self.__class__.__name__, strthis,)\n\n", NIL); - if (!classic) { - /* Usage of types.ObjectType is deprecated. - * But don't sure wether this would broken old Python? - */ - Printv(f_shadow, - // "import types\n", - "try:\n", - // " _object = types.ObjectType\n", - " _object = object\n", - " _newclass = 1\n", "except AttributeError:\n", " class _object : pass\n", " _newclass = 0\n", - // "del types\n", - "\n\n", NIL); - } + if (!classic) { + /* Usage of types.ObjectType is deprecated. + * But don't sure wether this would broken old Python? + */ + Printv(f_shadow, + // "import types\n", + "try:\n", + // " _object = types.ObjectType\n", + " _object = object\n", + " _newclass = 1\n", "except AttributeError:\n", " class _object : pass\n", " _newclass = 0\n", + // "del types\n", + "\n\n", NIL); } - if (modern) { - Printv(f_shadow, "def _swig_setattr_nondynamic_method(set):\n", tab4, "def set_attr(self,name,value):\n", + } + if (modern) { + Printv(f_shadow, "def _swig_setattr_nondynamic_method(set):\n", tab4, "def set_attr(self,name,value):\n", #ifdef USE_THISOWN - tab4, tab4, "if hasattr(self,name) or (name in (\"this\", \"thisown\")):\n", + tab4, tab4, "if hasattr(self,name) or (name in (\"this\", \"thisown\")):\n", #else - tab4, tab4, "if (name == \"thisown\"): return self.this.own(value)\n", tab4, tab4, "if hasattr(self,name) or (name == \"this\"):\n", + tab4, tab4, "if (name == \"thisown\"): return self.this.own(value)\n", tab4, tab4, "if hasattr(self,name) or (name == \"this\"):\n", #endif - tab4, tab4, tab4, "set(self,name,value)\n", - tab4, tab4, "else:\n", - tab4, tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n", tab4, "return set_attr\n\n\n", NIL); - } + tab4, tab4, tab4, "set(self,name,value)\n", + tab4, tab4, "else:\n", + tab4, tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n", tab4, "return set_attr\n\n\n", NIL); + } - if (directorsEnabled()) { - // Try loading weakref.proxy, which is only available in Python 2.1 and higher - Printv(f_shadow, - "try:\n", tab4, "import weakref\n", tab4, "weakref_proxy = weakref.proxy\n", "except:\n", tab4, "weakref_proxy = lambda x: x\n", "\n\n", NIL); - } - } + if (directorsEnabled()) { + // Try loading weakref.proxy, which is only available in Python 2.1 and higher + Printv(f_shadow, + "try:\n", tab4, "import weakref\n", tab4, "weakref_proxy = weakref.proxy\n", "except:\n", tab4, "weakref_proxy = lambda x: x\n", "\n\n", NIL); + } + } // Include some information in the code Printf(f_header, "\n/*-----------------------------------------------\n @(target):= %s.so\n\ @@ -899,22 +901,22 @@ Printf(f_init, "#endif\n"); Printf(f_init, "}\n"); if (builtin) - Printf(f_builtins, "} // namespace {\n\n"); + Printf(f_builtins, "} // namespace {\n\n"); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); if (shadow) { - if (builtin) { - Printv(f_shadow_import_stmts, "}\n", NIL); - Printv(f_header, f_shadow_import_stmts, NIL); - } - Printv(f_shadow_py, f_shadow, "\n", NIL); - Printv(f_shadow_py, f_shadow_stubs, "\n", NIL); + if (builtin) { + Printv(f_shadow_import_stmts, "}\n", NIL); + Printv(f_header, f_shadow_import_stmts, NIL); + } + Printv(f_shadow_py, f_shadow, "\n", NIL); + Printv(f_shadow_py, f_shadow_stubs, "\n", NIL); - Close(f_shadow_py); - Delete(f_shadow_py); + Close(f_shadow_py); + Delete(f_shadow_py); } /* Close all of the files */ @@ -932,7 +934,7 @@ Dump(f_wrappers, f_begin); if (builtin) - Dump(f_builtins, f_begin); + Dump(f_builtins, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); @@ -992,24 +994,24 @@ if (!options || (!Getattr(options, "noshadow") && !Getattr(options, "noproxy"))) { Printf(import, "_%s\n", modname); if (!Strstr(f_shadow_imports, import)) { - if (pkg && (!package || Strcmp(pkg, package) != 0)) { - if (builtin) { - Printf(f_shadow_import_stmts, tab4 "import_str = PyString_FromString(\"%s.%s\");\n", pkg, modname); - Printf(f_shadow_import_stmts, tab4 "PyImport_Import(import_str);\n"); - Printf(f_shadow_import_stmts, tab4 "Py_XDECREF(import_str);\n"); - } else { - Printf(f_shadow, "import %s.%s\n", pkg, modname); - } + if (pkg && (!package || Strcmp(pkg, package) != 0)) { + if (builtin) { + Printf(f_shadow_import_stmts, tab4 "import_str = PyString_FromString(\"%s.%s\");\n", pkg, modname); + Printf(f_shadow_import_stmts, tab4 "PyImport_Import(import_str);\n"); + Printf(f_shadow_import_stmts, tab4 "Py_XDECREF(import_str);\n"); } else { - if (builtin) { - Printf(f_shadow_import_stmts, tab4 "import_str = PyString_FromString(\"%s\");\n", modname); - Printf(f_shadow_import_stmts, tab4 "PyImport_Import(import_str);\n"); - Printf(f_shadow_import_stmts, tab4 "Py_XDECREF(import_str);\n"); - } else { - Printf(f_shadow, "import %s\n", modname); - } + Printf(f_shadow, "import %s.%s\n", pkg, modname); } - Printv(f_shadow_imports, import, NULL); + } else { + if (builtin) { + Printf(f_shadow_import_stmts, tab4 "import_str = PyString_FromString(\"%s\");\n", modname); + Printf(f_shadow_import_stmts, tab4 "PyImport_Import(import_str);\n"); + Printf(f_shadow_import_stmts, tab4 "Py_XDECREF(import_str);\n"); + } else { + Printf(f_shadow, "import %s\n", modname); + } + } + Printv(f_shadow_imports, import, NULL); } } } @@ -1026,12 +1028,12 @@ * module. Using proper argument and calling style for * given node n. * ------------------------------------------------------------ */ - String *funcCall(String *name, String *parms) { + String *funcCall(String *name, String *parms) { String *str = NewString(""); Printv(str, module, ".", name, "(", parms, ")", NIL); return str; - } + } /* ------------------------------------------------------------ @@ -1200,7 +1202,7 @@ return doc; } - /* ----------------------------------------------------------------------------- + /* ----------------------------------------------------------------------------- * makeParameterName() * Note: the generated name should consist with that in kwnames[] * @@ -1585,26 +1587,26 @@ if (is_real_overloaded(n) || GetFlag(n, "feature:compactdefaultargs") || !is_primitive_defaultargs(n)) - { - String *parms = NewString(""); - if(in_class) - Printf(parms, "self, "); - Printf(parms, "*args"); - if (kw) - Printf(parms, ", **kwargs"); - return parms; - } + { + String *parms = NewString(""); + if(in_class) + Printf(parms, "self, "); + Printf(parms, "*args"); + if (kw) + Printf(parms, ", **kwargs"); + return parms; + } bool funcanno = py3 ? true : false; String *params = NewString(""); String *_params = make_autodocParmList(n, false, is_calling, funcanno); if (in_class) - { - Printf(params, "self"); - if(Len(_params) > 0) - Printf(params, ", "); - } + { + Printf(params, "self"); + if(Len(_params) > 0) + Printf(params, ", "); + } Printv(params, _params, NULL); @@ -1707,7 +1709,7 @@ if (ret) ret = SwigType_str(ret, 0); } return (ret && py3) ? NewStringf(" -> \"%s\" ", ret) - : NewString(""); + : NewString(""); } /* ------------------------------------------------------------ @@ -1731,7 +1733,7 @@ Printv(f_dest, pythoncode(pythonappend(n), " "), "\n", NIL); Printv(f_dest, " return val\n", NIL); } else { - Printv(f_dest, " return ", funcCall(name, callParms), "\n", NIL); + Printv(f_dest, " return ", funcCall(name, callParms), "\n", NIL); } if (Getattr(n, "feature:python:callback") || !have_addtofunc(n)) { @@ -1748,7 +1750,7 @@ int check_kwargs(Node *n) { return (use_kw || GetFlag(n, "feature:kwargs")) - && !GetFlag(n, "memberset") && !GetFlag(n, "memberget"); + && !GetFlag(n, "memberset") && !GetFlag(n, "memberget"); } @@ -1759,9 +1761,9 @@ void add_method(String *name, String *function, int kw, Node *n = 0, int = 0, int = -1, int = -1) { if (!kw) { - Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function); + Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function); } else { - Printf(methods, "\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS, ", name, function); + Printf(methods, "\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS, ", name, function); } if (!n) { @@ -1792,7 +1794,7 @@ /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ - void dispatchFunction(Node *n, int funpack = 0, bool builtin_self = false, bool constructor = false) { + void dispatchFunction(Node *n, String *linkage, int funpack = 0, bool builtin_self = false, bool constructor = false) { /* Last node in overloaded chain */ int maxargs; @@ -1814,30 +1816,30 @@ String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *self, PyObject *args) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *self, PyObject *args) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "PyObject *argv[%d]", maxargs + 1); Wrapper_add_local(f, "argv", tmp); if (!fastunpack) { - bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); - bool add_self = builtin_self && (!constructor || director_class); - Wrapper_add_local(f, "ii", "int ii"); - if (maxargs - (add_self ? 1 : 0) > 0) - Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); - Append(f->code, "argc = args ? (int)PyObject_Length(args) : 0;\n"); - if (add_self) - Append(f->code, "argv[0] = self;\n"); - Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", add_self ? maxargs-1 : maxargs); - Printf(f->code, "argv[ii%s] = PyTuple_GET_ITEM(args,ii);\n", add_self ? " + 1" : ""); - Append(f->code, "}\n"); - if (add_self) - Append(f->code, "argc++;\n"); + bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); + bool add_self = builtin_self && (!constructor || director_class); + Wrapper_add_local(f, "ii", "int ii"); + if (maxargs - (add_self ? 1 : 0) > 0) + Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); + Append(f->code, "argc = args ? (int)PyObject_Length(args) : 0;\n"); + if (add_self) + Append(f->code, "argv[0] = self;\n"); + Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", add_self ? maxargs-1 : maxargs); + Printf(f->code, "argv[ii%s] = PyTuple_GET_ITEM(args,ii);\n", add_self ? " + 1" : ""); + Append(f->code, "}\n"); + if (add_self) + Append(f->code, "argc++;\n"); } else { - String *iname = Getattr(n, "sym:name"); - Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args,\"%s\",0,%d,argv))) SWIG_fail;\n", iname, maxargs); - Append(f->code, "--argc;\n"); + String *iname = Getattr(n, "sym:name"); + Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args,\"%s\",0,%d,argv))) SWIG_fail;\n", iname, maxargs); + Append(f->code, "--argc;\n"); } Replaceall(dispatch, "$args", "self,args"); @@ -1866,7 +1868,7 @@ Wrapper_print(f, f_wrappers); Node *p = Getattr(n, "sym:previousSibling"); if (!builtin_self) - add_method(symname, wname, 0, p); + add_method(symname, wname, 0, p); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { @@ -1940,8 +1942,23 @@ bool builtin_self = builtin && in_class && (constructor || (l && Getattr(l, "self"))); bool builtin_ctor = builtin_self && constructor; bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); + bool builtin_getter = (builtin && GetFlag(n, "memberget")); + bool builtin_setter = (builtin && GetFlag(n, "memberset") && !builtin_getter); char const *self_param = builtin_self ? "self" : "SWIGUNUSEDPARM(self)"; char const *wrap_return = builtin_ctor ? "int " : "PyObject *"; + String *linkage = NewString("SWIGINTERN "); + String *slot = Getattr(n, "feature:pyslot"); + if (builtin_setter || builtin_getter) { + Clear(linkage); + Printv(linkage, "extern ", NIL); + } + if (slot) { + String *functype = Getattr(n, "feature:pyslot:functype"); + if (!strcmp(Char(functype), "binary_func") || !strcmp(Char(functype), "ternary_func")) { + Clear(linkage); + Printv(linkage, "extern ", NIL); + } + } if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); @@ -1962,9 +1979,9 @@ int allow_thread = threads_enable(n); if (builtin_ctor) - Wrapper_add_local(f, "resultobj", "int resultobj = 0"); + Wrapper_add_local(f, "resultobj", "int resultobj = 0"); else - Wrapper_add_local(f, "resultobj", "PyObject *resultobj = 0"); + Wrapper_add_local(f, "resultobj", "PyObject *resultobj = 0"); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); @@ -1976,8 +1993,8 @@ tuple_arguments = num_arguments = emit_num_arguments(l); tuple_required = num_required = emit_num_required(l); if (builtin_self && (!constructor || (constructor && director_class))) { - --tuple_arguments; - --tuple_required; + --tuple_arguments; + --tuple_required; } if (((num_arguments == 0) && (num_required == 0)) || ((num_arguments == 1) && (num_required == 1) && Getattr(l, "self"))) allow_kwargs = 0; @@ -1990,9 +2007,9 @@ if (!allow_kwargs || Getattr(n, "sym:overloaded")) { if (!varargs) { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } else { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); } if (allow_kwargs) { Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, "Can't use keyword arguments with overloaded functions (%s).\n", Swig_name_decl(n)); @@ -2003,15 +2020,15 @@ Swig_warning(WARN_LANG_VARARGS_KEYWORD, input_file, line_number, "Can't wrap varargs with keyword arguments enabled\n"); varargs = 0; } - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); } if (!builtin || !in_class || tuple_arguments > 0) { - if (!allow_kwargs) { - Append(parse_args, " if (!PyArg_ParseTuple(args,(char *)\""); - } else { - Append(parse_args, " if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)\""); - Append(arglist, ",kwnames"); - } + if (!allow_kwargs) { + Append(parse_args, " if (!PyArg_ParseTuple(args,(char *)\""); + } else { + Append(parse_args, " if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)\""); + Append(arglist, ",kwnames"); + } } int funpack = modernargs && fastunpack && !varargs && !allow_kwargs; @@ -2046,10 +2063,10 @@ } if (builtin_self && !builtin_ctor) - Printf(self_parse, "%s = self;\n", funpack ? "swig_obj[0]" : "obj0"); + Printf(self_parse, "%s = self;\n", funpack ? "swig_obj[0]" : "obj0"); - if (constructor && director_class) - Printv(self_parse, funpack ? "swig_obj[1]" : "obj1", " = self;\n", NIL); + if (builtin_ctor && director_class) + Printv(self_parse, funpack ? "swig_obj[1]" : "obj1", " = self;\n", NIL); int use_parse = 0; Append(kwargs, "{"); @@ -2063,14 +2080,14 @@ String *pn = Getattr(p, "name"); String *ln = Getattr(p, "lname"); if (funpack) - sprintf(source, "swig_obj[%d]", builtin_ctor ? i + 1 : i); + sprintf(source, "swig_obj[%d]", builtin_ctor ? i + 1 : i); else sprintf(source, "obj%d", builtin_ctor ? i + 1 : i); if (parse_from_tuple) { - Putc(',', arglist); - if (i == num_required) - Putc('|', parse_args); /* Optional argument separator */ + Putc(',', arglist); + if (i == num_required) + Putc('|', parse_args); /* Optional argument separator */ } /* Keyword argument handling */ @@ -2122,11 +2139,11 @@ bool parse_from_tuple = (i > 0 || !builtin_self || (builtin_ctor && !director_class)); if (parse_from_tuple) - Putc('O', parse_args); + Putc('O', parse_args); if (!funpack) { Wrapper_add_localv(f, source, "PyObject *", source, "= 0", NIL); if (parse_from_tuple) - Printf(arglist, "&%s", source); + Printf(arglist, "&%s", source); } if (i >= num_required) Printv(get_pointers, "if (", source, ") {\n", NIL); @@ -2138,7 +2155,7 @@ use_parse = 1; Append(parse_args, parse); if (parse_from_tuple) - Printf(arglist, "&%s", ln); + Printf(arglist, "&%s", ln); } p = Getattr(p, "tmap:in:next"); continue; @@ -2164,16 +2181,16 @@ Clear(f->def); if (overname) { if (noargs) { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {", NIL); } else { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **swig_obj) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **swig_obj) {", NIL); } Printf(parse_args, "if ((nobjs < %d) || (nobjs > %d)) SWIG_fail;\n", num_required, num_arguments); } else { if (noargs) { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } else { - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } if (onearg) { Printf(parse_args, "if (!args) SWIG_fail;\n"); @@ -2318,10 +2335,10 @@ /* Return the function value */ if (builtin_ctor) { - Printf(f->code, "%s\n", actioncode); - tm = Swig_typemap_lookup("builtin_init", n, "result", f); + Printf(f->code, "%s\n", actioncode); + tm = Swig_typemap_lookup("builtin_init", n, "result", f); } else { - tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode); + tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode); } if (tm) { @@ -2426,10 +2443,10 @@ if (need_cleanup) { Printv(f->code, cleanup, NIL); } - if (builtin_self && constructor) - Printv(f->code, " return 0;\n", NIL); + if (builtin_ctor) + Printv(f->code, " return 0;\n", NIL); else - Printv(f->code, " return NULL;\n", NIL); + Printv(f->code, " return NULL;\n", NIL); if (funpack) { @@ -2463,7 +2480,7 @@ if (varargs) { DelWrapper(f); f = NewWrapper(); - Printv(f->def, "SWIGINTERN ", wrap_return, wname, "(PyObject *self, PyObject *args) {", NIL); + Printv(f->def, linkage, wrap_return, wname, "(PyObject *self, PyObject *args) {", NIL); Wrapper_add_local(f, "resultobj", constructor && builtin_self ? "int resultobj" : "PyObject *resultobj"); Wrapper_add_local(f, "varargs", "PyObject *varargs"); Wrapper_add_local(f, "newargs", "PyObject *newargs"); @@ -2480,8 +2497,8 @@ /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { - if (!builtin_self) - add_method(iname, wname, allow_kwargs, n, funpack, num_required, num_arguments); + if (!builtin_self) + add_method(iname, wname, allow_kwargs, n, funpack, num_required, num_arguments); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { @@ -2489,11 +2506,53 @@ } } else { if (!Getattr(n, "sym:nextSibling")) { - dispatchFunction(n, funpack, builtin_self, constructor); + dispatchFunction(n, linkage, funpack, builtin_self, constructor); } } + + String *wrapper_name = Swig_name_wrapper(iname); + + /* If this is a builtin type, create a PyGetSetDef entry for this member variable. */ + if (builtin_getter) { + Hash *h = Getattr(builtin_getset, name); + if (!h) { + h = NewHash(); + Setattr(builtin_getset, name, h); + Delete(h); + } + Setattr(h, "getter", wrapper_name); + } + if (builtin_setter) { + Hash *h = Getattr(builtin_getset, name); + if (!h) { + h = NewHash(); + Setattr(builtin_getset, name, h); + Delete(h); + } + Setattr(h, "setter", wrapper_name); + } + + /* Handle builtin operator overloads */ + if (slot) { + String *functype = Getattr(n, "feature:pyslot:functype"); + String *feature_name = NewStringf("feature:%s", slot); + String *closure_name = NewString(""); + if (!strcmp(Char(functype), "binary_func")) { + Printf(closure_name, "pyswig_binaryfunc_closure< %s >", wrapper_name); + } else if (!strcmp(Char(functype), "ternary_func")) { + Printf(closure_name, "pyswig_ternaryfunc_closure< %s >", wrapper_name); + } else { + Append(closure_name, wrapper_name); + } + Node *parent = Swig_methodclass(n); + Setattr(parent, feature_name, closure_name); + Delete(feature_name); + Delete(closure_name); + } + Delete(self_parse); Delete(parse_args); + Delete(linkage); Delete(arglist); Delete(get_pointers); Delete(cleanup); @@ -2501,6 +2560,7 @@ Delete(kwargs); Delete(wname); DelWrapper(f); + Delete(wrapper_name); return SWIG_OK; } @@ -2538,7 +2598,7 @@ int assignable = is_assignable(n); if (!builtin && (shadow) && !assignable && !in_class) - Printf(f_shadow_stubs, "%s = %s.%s\n", iname, global_name, iname); + Printf(f_shadow_stubs, "%s = %s.%s\n", iname, global_name, iname); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); @@ -2616,69 +2676,69 @@ * constantWrapper() * ------------------------------------------------------------ */ - virtual int constantWrapper(Node *n) { - String *name = Getattr(n, "name"); - String *iname = Getattr(n, "sym:name"); - SwigType *type = Getattr(n, "type"); - String *rawval = Getattr(n, "rawval"); - String *value = rawval ? rawval : Getattr(n, "value"); - String *tm; - int have_tm = 0; + virtual int constantWrapper(Node *n) { + String *name = Getattr(n, "name"); + String *iname = Getattr(n, "sym:name"); + SwigType *type = Getattr(n, "type"); + String *rawval = Getattr(n, "rawval"); + String *value = rawval ? rawval : Getattr(n, "value"); + String *tm; + int have_tm = 0; - if (!addSymbol(iname, n)) - return SWIG_ERROR; + if (!addSymbol(iname, n)) + return SWIG_ERROR; - /* Special hook for member pointer */ - if (SwigType_type(type) == T_MPOINTER) { - String *wname = Swig_name_wrapper(iname); - String *str = SwigType_str(type, wname); - Printf(f_header, "static %s = %s;\n", str, value); - Delete(str); - value = wname; - } + /* Special hook for member pointer */ + if (SwigType_type(type) == T_MPOINTER) { + String *wname = Swig_name_wrapper(iname); + String *str = SwigType_str(type, wname); + Printf(f_header, "static %s = %s;\n", str, value); + Delete(str); + value = wname; + } - if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); - Replaceall(tm, "$value", value); - Printf(const_code, "%s,\n", tm); - Delete(tm); - have_tm = 1; - } + if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { + Replaceall(tm, "$source", value); + Replaceall(tm, "$target", name); + Replaceall(tm, "$value", value); + Printf(const_code, "%s,\n", tm); + Delete(tm); + have_tm = 1; + } - if (builtin && in_class) { - Swig_require("builtin_constantWrapper", n, "*sym:name", "builtin_sym:name", NIL); - Setattr(n, "sym:name", Getattr(n, "builtin_sym:name")); - } + if (builtin && in_class) { + Swig_require("builtin_constantWrapper", n, "*sym:name", "builtin_sym:name", NIL); + Setattr(n, "sym:name", Getattr(n, "builtin_sym:name")); + } - if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { - Replaceall(tm, "$source", value); - Replaceall(tm, "$target", name); - Replaceall(tm, "$value", value); - Printf(f_init, "%s\n", tm); - Delete(tm); - have_tm = 1; - } + if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { + Replaceall(tm, "$source", value); + Replaceall(tm, "$target", name); + Replaceall(tm, "$value", value); + Printf(f_init, "%s\n", tm); + Delete(tm); + have_tm = 1; + } - if (builtin && in_class) - Swig_restore(n); + if (builtin && in_class) + Swig_restore(n); - if (!have_tm) { - Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); - return SWIG_NOWRAP; - } + if (!have_tm) { + Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); + return SWIG_NOWRAP; + } - if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { - if (!in_class) { - Printv(f_shadow, iname, " = ", module, ".", iname, "\n", NIL); - } else { - if (!(Getattr(n, "feature:python:callback"))) { - Printv(f_shadow_stubs, iname, " = ", module, ".", iname, "\n", NIL); - } - } + if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { + if (!in_class) { + Printv(f_shadow, iname, " = ", module, ".", iname, "\n", NIL); + } else { + if (!(Getattr(n, "feature:python:callback"))) { + Printv(f_shadow_stubs, iname, " = ", module, ".", iname, "\n", NIL); } - return SWIG_OK; + } } + return SWIG_OK; + } /* ------------------------------------------------------------ @@ -2701,17 +2761,17 @@ -/* ---------------------------------------------------------------------------- - * BEGIN C++ Director Class modifications - * ------------------------------------------------------------------------- */ + /* ---------------------------------------------------------------------------- + * BEGIN C++ Director Class modifications + * ------------------------------------------------------------------------- */ -/* C++/Python polymorphism demo code, copyright (C) 2002 Mark Rose <mr...@st...> - * - * TODO - * - * Move some boilerplate code generation to Swig_...() functions. - * - */ + /* C++/Python polymorphism demo code, copyright (C) 2002 Mark Rose <mr...@st...> + * + * TODO + * + * Move some boilerplate code generation to Swig_...() functions. + * + */ /* --------------------------------------------------------------- * classDirectorMethod() @@ -2823,13 +2883,13 @@ if (dirprot_mode()) { /* - This implementation uses a std::map<std::string,int>. + This implementation uses a std::map<std::string,int>. - It should be possible to rewrite it using a more elegant way, - like copying the Java approach for the 'override' array. + It should be possible to rewrite it using a more elegant way, + like copying the Java approach for the 'override' array. - But for now, this seems to be the least intrusive way. - */ + But for now, this seems to be the least intrusive way. + */ Printf(f_directors_h, "\n\n"); Printf(f_directors_h, "/* Internal Director utilities */\n"); Printf(f_directors_h, "public:\n"); @@ -2885,480 +2945,538 @@ result = Language::classDirectorDisown(n); shadow = oldshadow; if (shadow) { - if (builtin) { - Printf(f_shadow, tab4, "{ \"disown\", (PyCFunction) Swig::Director::pyobj_disown< %s >, METH_NOARGS, \"\" },\n", real_classname); - } else { - String *symname = Getattr(n, "sym:name"); - String *mrename = Swig_name_disown(NSPACE_TODO, symname); //Getattr(n, "name")); - Printv(f_shadow, tab4, "def __disown__(self):\n", NIL); + if (builtin) { + Printf(f_shadow, tab4, "{ \"disown\", (PyCFunction) Swig::Director::pyobj_disown< %s >, METH_NOARGS, \"\" },\n", real_classname); + } else { + String *symname = Getattr(n, "sym:name"); + String *mrename = Swig_name_disown(NSPACE_TODO, symname); //Getattr(n, "name")); + Printv(f_shadow, tab4, "def __disown__(self):\n", NIL); #ifdef USE_THISOWN - Printv(f_shadow, tab8, "self.thisown = 0\n", NIL); + Printv(f_shadow, tab8, "self.thisown = 0\n", NIL); #else - Printv(f_shadow, tab8, "self.this.disown()\n", NIL); + Printv(f_shadow, tab8, "self.this.disown()\n", NIL); #endif - Printv(f_shadow, tab8, module, ".", mrename, "(self)\n", NIL); - Printv(f_shadow, tab8, "return weakref_proxy(self)\n", NIL); - Delete(mrename); - } + Printv(f_shadow, tab8, module, ".", mrename, "(self)\n", NIL); + Printv(f_shadow, tab8, "return weakref_proxy(self)\n", NIL); + Delete(mrename); + } } return result; } -/* ---------------------------------------------------------------------------- - * END of C++ Director Class modifications - * ------------------------------------------------------------------------- */ + /* ---------------------------------------------------------------------------- + * END of C++ Director Class modifications + * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ - virtual bool get_single_base (Node *n, Node **base = NULL) - { + virtual bool get_single_base (Node *n, Node **base = NULL) + { + if (base) + *base = NULL; + if (Getattr(n, "single_inh")) + return true; + List *baselist = Getattr(n, "bases"); + if (!baselist || Len(baselist) == 0) { + Setattr(n, "single_inh", "1"); + return true; + } + if (baselist && Len(baselist) == 1) { + Iterator b = First(baselist); + if (this->get_single_base(b.item)) { if (base) - *base = NULL; - if (Getattr(n, "single_inh")) - return true; - List *baselist = Getattr(n, "bases"); - if (!baselist || Len(baselist) == 0) { - Setattr(n, "single_inh", "1"); - return true; - } - if (baselist && Len(baselist) == 1) { - Iterator b = First(baselist); - if (this->get_single_base(b.item)) { - if (base) - *base = b.item; - Setattr(n, "single_inh", "1"); - return true; - } - } - return false; + *base = b.item; + Setattr(n, "single_inh", "1"); + return true; + } } + return false; + } - virtual int classDeclaration(Node *n) { - if (shadow && !Getattr(n, "feature:onlychildren")) { - Node *mod = Getattr(n, "module"); - if (mod) { - String *importname = NewString(""); - String *modname = Getattr(mod, "name"); - if (Strcmp(modname, mainmodule) != 0) { - // check if the module has a package option - Node *options = Getattr(mod, "options"); - String *pkg = options ? Getattr(options, "package") : 0; - if (pkg && (!package || Strcmp(pkg, package) != 0)) { - Printf(importname, "%s.", pkg); - } - Printf(importname, "%s.", modname); - } - Append(importname, Getattr(n, "sym:name")); - Setattr(n, "python:proxy", importname); - } + virtual int classDeclaration(Node *n) { + if (shadow && !Getattr(n, "feature:onlychildren")) { + Node *mod = Getattr(n, "module"); + if (mod) { + String *importname = NewString(""); + String *modname = Getattr(mod, "name"); + if (Strcmp(modname, mainmodule) != 0) { + // check if the module has a package option + Node *options = Getattr(mod, "options"); + String *pkg = options ? Getattr(options, "package") : 0; + if (pkg && (!package || Strcmp(pkg, package) != 0)) { + Printf(importname, "%s.", pkg); + } + Printf(importname, "%s.", modname); } - int result = Language::classDeclaration(n); - return result; + Append(importname, Getattr(n, "sym:name")); + Setattr(n, "python:proxy", importname); + } } + int result = Language::classDeclaration(n); + return result; + } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ - void builtin_pre_decl (Node *n, Node *base_node) - { - String *name = Getattr(n, "name"); - String *rname = SwigType_namestr(name); - Printf(f_init, tab4 "builtin_pytype = &PySwigBuiltin< %s >::pytype;\n", rname); - Printf(f_init, tab4 "builtin_pytype->tp_new = PyType_GenericNew;\n"); - if (base_node) { - String *base_name = Copy(Getattr(base_node, "name")); - SwigType_add_pointer(base_name); - String *base_mname = SwigType_manglestr(base_name); - Printf(f_init, tab4 "builtin_basetype = SWIG_MangledTypeQuery(\"%s\");\n", base_mname); - Printf(f_init, tab4 "if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {\n"); - Printf(f_init, tab8 "builtin_pytype->tp_base = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;\n"); - Printf(f_init, tab4 "}\n"); - Delete(base_mname); - Delete(base_name); - } else { - //Printv(f_init, tab4, "builtin_pytype->tp_base = SwigPyObject_type();\n", NIL); - Printv(f_init, tab4, "builtin_pytype->tp_base = &PyBaseObject_Type;\n", NIL); - } - Printf(f_init, tab4 "builtin_pytype->tp_dict = d = PyDict_New();\n"); - Delete(rname); + void builtin_pre_decl (Node *n, Node *base_node) + { + String *name = Getattr(n, "name"); + String *rname = SwigType_namestr(name); + Printf(f_init, tab4 "builtin_pytype = &PySwigBuiltin< %s >::pytype;\n", rname); + Printf(f_init, tab4 "builtin_pytype->tp_new = PyType_GenericNew;\n"); + if (base_node) { + String *base_name = Copy(Getattr(base_node, "name")); + SwigType_add_pointer(base_name); + String *base_mname = SwigType_manglestr(base_name); + Printf(f_init, tab4 "builtin_basetype = SWIG_MangledTypeQuery(\"%s\");\n", base_mname); + Printf(f_init, tab4 "if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {\n"); + Printf(f_init, tab8 "builtin_pytype->tp_base = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;\n"); + Printf(f_init, tab4 "}\n"); + Delete(base_mname); + Delete(base_name); + } else { + //Printv(f_init, tab4, "builtin_pytype->tp_base = SwigPyObject_type();\n", NIL); + Printv(f_init, tab4, "builtin_pytype->tp_base = &PyBaseObject_Type;\n", NIL); } + Printf(f_init, tab4 "builtin_pytype->tp_dict = d = PyDict_New();\n"); + Delete(rname); + } - void builtin_post_decl (File *f, Node *n) - { - String *name = Getattr(n, "name"); - String *pname = Copy(name); - SwigType_add_pointer(pname); - String *symname = Getattr(n, "sym:name"); - String *rname = SwigType_namestr(name); - String *mname = SwigType_manglestr(pname); - String *templ = NewString(""); - Printf(templ, "PySwigBuiltin< %s >", rname); - char const *tp_init = builtin_tp_init ? Char(builtin_tp_init) : "0"; + void builtin_post_decl (File *f, Node *n) + { + String *name = Getattr(n, "name"); + String *pname = Copy(name); + SwigType_add_pointer(pname); + String *symname = Getattr(n, "sym:name"); + String *rname = SwigType_namestr(name); + String *mname = SwigType_manglestr(pname); + String *templ = NewString(""); + Printf(templ, "PySwigBuiltin< %s >", rname); + char const *tp_init = builtin_tp_init ? Char(builtin_tp_init) : "0"; - // Check for non-public destructor, in which case tp_dealloc should be "0" - String *tp_dealloc = NewString(""); - String *dtor_name = NewString("delete"); - if (Getattr(class_members, "delete")) - Printf(tp_dealloc, "py_builtin_dealloc< %s >", rname); - else - Printv(tp_dealloc, "0", NIL); - Delete(dtor_name); + // Check for non-public destructor, in which case tp_dealloc should be "0" + String *tp_dealloc = NewString(""); + String *dtor_name = NewString("delete"); + if (Getattr(class_members, "delete")) + Printf(tp_dealloc, "py_builtin_dealloc< %s >", rname); + else + Printv(tp_dealloc, "0", NIL); + Delete(dtor_name); - Printf(f, "template <> PyTypeObject PySwigBuiltin< %s >::pytype = {\n", rname); - Printf(f, " PyObject_HEAD_INIT(NULL)\n"); - Printf(f, " 0, /*ob_size*/\n"); - Printf(f, " \"%s... [truncated message content] |