From 985adc13fba238405028361a8d8e35e8b1b1008c Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Mon, 31 Oct 2005 09:58:24 +0000 Subject: [PATCH] remove 'thisown' and ClassPtr git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7767 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/python/pyrun.swg | 444 ++++++++++++++++++++++---------------- Source/Modules/lang.cxx | 7 + Source/Modules/python.cxx | 89 ++++++-- 3 files changed, 338 insertions(+), 202 deletions(-) diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg index 7e7287a95..2b8ed1c44 100644 --- a/Lib/python/pyrun.swg +++ b/Lib/python/pyrun.swg @@ -46,6 +46,10 @@ * Pointer declarations * ----------------------------------------------------------------------------- */ +/* Flags for new pointer objects */ +#define SWIG_POINTER_NEW SWIG_POINTER_OWN << 1 + + #ifdef __cplusplus extern "C" { #if 0 @@ -59,38 +63,12 @@ extern "C" { typedef struct { PyObject_HEAD void *ptr; - const char *desc; + swig_type_info *ty; + int own; } PySwigObject; -SWIGRUNTIME int -PySwigObject_print(PySwigObject *v, FILE *fp, int flags) -{ - char result[SWIG_BUFFER_SIZE]; - flags = flags; - if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { - fputs("", fp); - return 0; - } else { - return 1; - } -} -SWIGRUNTIME PyObject * -PySwigObject_repr(PySwigObject *v) -{ - char result[SWIG_BUFFER_SIZE]; - return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? - PyString_FromFormat("", result) : 0; -} - -SWIGRUNTIME PyObject * -PySwigObject_str(PySwigObject *v) -{ - char result[SWIG_BUFFER_SIZE]; - return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? - PyString_FromString(result) : 0; -} SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) @@ -126,29 +104,103 @@ PySwigObject_hex(PySwigObject *v) return PySwigObject_format("%x",v); } -SWIGRUNTIME int -PySwigObject_compare(PySwigObject *v, PySwigObject *w) +SWIGRUNTIME PyObject * +PySwigObject_repr(PySwigObject *v) { - int c = strcmp(v->desc, w->desc); - if (c) { - return (c > 0) ? 1 : -1; + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *hex = PySwigObject_hex(v); + if (name) { + return PyString_FromFormat("", name, PyString_AsString(hex)); } else { - void *i = v->ptr; - void *j = w->ptr; - return (i < j) ? -1 : ((i > j) ? 1 : 0); + return PyString_FromFormat("", PyString_AsString(hex)); + } + Py_DECREF(hex); +} + +SWIGRUNTIME int +PySwigObject_print(PySwigObject *v, FILE *fp, int SWIGUNUSED flags) +{ + PyObject *repr = PySwigObject_repr(v); + if (repr) { + fputs(PyString_AsString(repr), fp); + Py_DECREF(repr); + return 0; + } else { + return 1; } } -SWIGRUNTIME void -PySwigObject_dealloc(PySwigObject *self) + +SWIGRUNTIME PyObject * +PySwigObject_str(PySwigObject *v) { - PyObject_Del(self); + char result[SWIG_BUFFER_SIZE]; + return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? + PyString_FromString(result) : 0; +} + +SWIGRUNTIME int +PySwigObject_compare(PySwigObject *v, PySwigObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +SWIGRUNTIME PyTypeObject* PySwigObject_type(void); + +SWIGRUNTIME int +PySwigObject_Check(PyObject *op) { + return ((op)->ob_type == PySwigObject_type()) + || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); +} + +SWIGRUNTIME void +PySwigObject_dealloc(PyObject *v) +{ + if (PySwigObject_Check(v)) { + PySwigObject *self = (PySwigObject *) v; + if (self->own) { + } + } + v->ob_type->tp_free(v); +} + + +SWIGINTERN PyObject* +PySwigObject_disown(PySwigObject *self) +{ + self->own = 0; + Py_INCREF(Py_None); + return Py_None; +} + +SWIGINTERN PyObject* +PySwigObject_acquire(PySwigObject *self) +{ + self->own = 1; + Py_INCREF(Py_None); + return Py_None; +} + +SWIGINTERN PyObject* +PySwigObject_own(PySwigObject *self) +{ + PyObject *obj = self->own ? Py_True : Py_False; + Py_INCREF(obj); + return obj; } SWIGRUNTIME PyTypeObject* PySwigObject_type(void) { - static char pyswigobject_type__doc__[] = - "Swig object carries a C/C++ instance pointer"; + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyMethodDef + swigobject_methods[] = { + {"disown", (PyCFunction)PySwigObject_disown, METH_NOARGS, "release ownership of the pointer"}, + {"acquire", (PyCFunction)PySwigObject_acquire, METH_NOARGS, "aquire ownership of the pointer"}, + {"own", (PyCFunction)PySwigObject_own, METH_NOARGS, "return ownership status of the pointer"}, + {0, 0, 0, 0} + }; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ @@ -190,26 +242,27 @@ PySwigObject_type(void) { #endif = { PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - (char *)"PySwigObject", /*tp_name*/ - sizeof(PySwigObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PySwigObject_dealloc, /*tp_dealloc*/ - (printfunc)PySwigObject_print, /*tp_print*/ - (getattrfunc)0, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)PySwigObject_compare, /*tp_compare*/ - (reprfunc)PySwigObject_repr, /*tp_repr*/ - &PySwigObject_as_number, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)PySwigObject_str, /*tp_str*/ - /* Space for future expansion */ - 0,0,0,0, - pyswigobject_type__doc__, /* Documentation string */ + 0, /* ob_size */ + (char *)"PySwigObject", /* tp_name */ + sizeof(PySwigObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)PySwigObject_dealloc, /* tp_dealloc */ + (printfunc)PySwigObject_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ + (cmpfunc)PySwigObject_compare, /* tp_compare */ + (reprfunc)PySwigObject_repr, /* tp_repr */ + &PySwigObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)PySwigObject_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ @@ -219,8 +272,27 @@ PySwigObject_type(void) { 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ + 0, /* tp_iter */ + 0, /* tp_iternext */ #endif + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + PyObject_Del, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif @@ -236,35 +308,19 @@ PySwigObject_type(void) { return &pyswigobject_type; } + SWIGRUNTIME PyObject * -PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) +PySwigObject_New(void *ptr, swig_type_info *ty, int own) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_type()); if (self) { self->ptr = ptr; - self->desc = desc; + self->ty = ty; + self->own = own; } return (PyObject *)self; } -SWIGRUNTIMEINLINE void * -PySwigObject_AsVoidPtr(PyObject *self) -{ - return ((PySwigObject *)self)->ptr; -} - -SWIGRUNTIMEINLINE const char * -PySwigObject_GetDesc(PyObject *self) -{ - return ((PySwigObject *)self)->desc; -} - -SWIGRUNTIMEINLINE int -PySwigObject_Check(PyObject *op) { - return ((op)->ob_type == PySwigObject_type()) - || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); -} - /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ @@ -272,7 +328,7 @@ PySwigObject_Check(PyObject *op) { typedef struct { PyObject_HEAD void *pack; - const char *desc; + swig_type_info *ty; size_t size; } PySwigPacked; @@ -286,7 +342,7 @@ PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) fputs("at ", fp); fputs(result, fp); } - fputs(v->desc,fp); + fputs(v->ty->name,fp); fputs(">", fp); return 0; } @@ -296,9 +352,9 @@ PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { - return PyString_FromFormat("", result, v->desc); + return PyString_FromFormat("", result, v->ty->name); } else { - return PyString_FromFormat("", v->desc); + return PyString_FromFormat("", v->ty->name); } } @@ -307,37 +363,42 @@ PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ - return PyString_FromFormat("%s%s", result, v->desc); + return PyString_FromFormat("%s%s", result, v->ty->name); } else { - return PyString_FromString(v->desc); + return PyString_FromString(v->ty->name); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { - int c = strcmp(v->desc, w->desc); - if (c) { - return (c > 0) ? 1 : -1; - } else { - size_t i = v->size; - size_t j = w->size; - int s = (i < j) ? -1 : ((i > j) ? 1 : 0); - return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); - } + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* PySwigPacked_type(void); + +SWIGRUNTIME int +PySwigPacked_Check(PyObject *op) { + return ((op)->ob_type == PySwigPacked_type()) + || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } SWIGRUNTIME void -PySwigPacked_dealloc(PySwigPacked *self) +PySwigPacked_dealloc(PyObject *v) { - free(self->pack); - PyObject_Del(self); + if (PySwigPacked_Check(v)) { + PySwigPacked *self = (PySwigPacked *) v; + free(self->pack); + } + v->ob_type->tp_free(v); } SWIGRUNTIME PyTypeObject* PySwigPacked_type(void) { - static char pyswigpacked_type__doc__[] = - "Swig object carries a C/C++ instance pointer"; + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject pyswigpacked_type #if !defined(__cplusplus) ; @@ -347,26 +408,27 @@ PySwigPacked_type(void) { #endif = { PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - (char *)"PySwigPacked", /*tp_name*/ - sizeof(PySwigPacked), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ - (printfunc)PySwigPacked_print, /*tp_print*/ - (getattrfunc)0, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)PySwigPacked_compare, /*tp_compare*/ - (reprfunc)PySwigPacked_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)PySwigPacked_str, /*tp_str*/ - /* Space for future expansion */ - 0,0,0,0, - pyswigpacked_type__doc__, /* Documentation string */ + 0, /* ob_size */ + (char *)"PySwigPacked", /* tp_name */ + sizeof(PySwigPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)PySwigPacked_dealloc, /* tp_dealloc */ + (printfunc)PySwigPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ + (cmpfunc)PySwigPacked_compare, /* tp_compare */ + (reprfunc)PySwigPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)PySwigPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ @@ -375,9 +437,28 @@ PySwigPacked_type(void) { 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif -#if PY_VERSION_HEX >= 0x02020000 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ #endif + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + PyObject_Del, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif @@ -394,7 +475,7 @@ PySwigPacked_type(void) { } SWIGRUNTIME PyObject * -PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) +PySwigPacked_New(void *ptr, size_t size, swig_type_info *ty) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_type()); if (self == NULL) { @@ -404,7 +485,7 @@ PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) if (pack) { memcpy(pack, ptr, size); self->pack = pack; - self->desc = desc; + self->ty = ty; self->size = size; return (PyObject *) self; } @@ -412,41 +493,38 @@ PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) } } -SWIGRUNTIMEINLINE const char * +SWIGRUNTIMEINLINE swig_type_info * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { - PySwigPacked *self = (PySwigPacked *)obj; - if (self->size != size) return 0; - memcpy(ptr, self->pack, size); - return self->desc; + if (PySwigPacked_Check(obj)) { + PySwigPacked *self = (PySwigPacked *)obj; + if (self->size != size) return 0; + memcpy(ptr, self->pack, size); + return self->ty; + } else { + return 0; + } } -SWIGRUNTIMEINLINE const char * -PySwigPacked_GetDesc(PyObject *self) -{ - return ((PySwigPacked *)self)->desc; -} - -SWIGRUNTIMEINLINE int -PySwigPacked_Check(PyObject *op) { - return ((op)->ob_type == PySwigPacked_type()) - || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); -} - - /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ + /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { - swig_cast_info *tc; - const char *c = 0; - static PyObject *SWIG_this = 0; + swig_type_info *to = 0; + const char *desc = 0; int newref = 0; PyObject *pyobj = 0; - void *vptr; + void *vptr = 0; + PySwigObject *sobj = 0; + static PyObject *SWIG_this = +#if !defined(__cplusplus) + 0; if (!SWIG_this) SWIG_this = +#endif + PyString_FromString("this"); if (!obj) return SWIG_ERROR; if (obj == Py_None) { @@ -454,33 +532,37 @@ SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) return SWIG_OK; } - if (!(PySwigObject_Check(obj))) { - if (!SWIG_this) - SWIG_this = PyString_FromString("this"); + if (!(PySwigObject_Check(obj))) { pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); - newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } + newref = 1; } - vptr = PySwigObject_AsVoidPtr(obj); - c = (const char *) PySwigObject_GetDesc(obj); - if (newref) { Py_DECREF(obj); } - goto type_check; + sobj = (PySwigObject *) obj; + vptr = sobj->ptr; + to = sobj->ty; + desc = (const char *) to->name; + if (newref) { newref = 0; Py_DECREF(obj); } type_check: if (ty) { - tc = SWIG_TypeCheck(c,ty); - if (!tc) goto type_error; - *ptr = SWIG_TypeCast(tc,vptr); + if (to == ty) { + /* no type cast needed */ + *ptr = vptr; + } else { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (!tc) goto type_error; + *ptr = SWIG_TypeCast(tc,vptr); + } } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { - PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); + sobj->own = 0; } return SWIG_OK; @@ -491,10 +573,10 @@ SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); - c = doc ? strstr(doc, "swig_ptr: ") : 0; - if (c) { - c = ty ? SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name) : 0; - if (!c) goto type_error; + desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) { + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) goto type_error; goto type_check; } } @@ -505,19 +587,18 @@ SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { - swig_cast_info *tc; - const char *c = 0; - - c = PySwigPacked_UnpackData(obj, ptr, sz); - if (!c) goto type_error; + swig_type_info *to = PySwigPacked_UnpackData(obj, ptr, sz); + if (!to) goto type_error; if (ty) { - tc = SWIG_TypeCheck(c,ty); - if (!tc) goto type_error; + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) goto type_error; + } } return SWIG_OK; - + type_error: - PyErr_Clear(); return SWIG_ERROR; } @@ -528,7 +609,7 @@ SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *t SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { PyObject *robj = 0; - int own = flags & SWIG_POINTER_OWN; + int own = (flags & SWIG_POINTER_OWN) || (flags & SWIG_POINTER_NEW); if (!type) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "Swig: null type passed to NewPointerObj"); @@ -539,18 +620,17 @@ SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { Py_INCREF(Py_None); return Py_None; } - robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); + robj = PySwigObject_New((void *) ptr, type, own); if (!robj || (robj == Py_None)) return robj; - if (type->clientdata) { + /* direct new call doesn't create a shadow */ + if (!(flags & SWIG_POINTER_NEW) && type->clientdata) { PyObject *inst; - PyObject *args = Py_BuildValue((char*)"(O)", robj); + PyObject *args = PyDict_New(); + PyDict_SetItemString(args, "_swig_this", robj); Py_DECREF(robj); - inst = PyObject_CallObject((PyObject *) type->clientdata, args); + inst = PyEval_CallObjectWithKeywords((PyObject *) type->clientdata, NULL, args); Py_DECREF(args); if (inst) { - if (own) { - PyObject_SetAttrString(inst,(char*)"thisown",Py_True); - } robj = inst; } } @@ -567,7 +647,7 @@ SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return Py_None; } - robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); + robj = PySwigPacked_New((void *) ptr, sz, type); return robj; } diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 5c2289dcf..ea9efa58a 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -2269,10 +2269,17 @@ Language::constructorHandler(Node *n) { Swig_require("constructorHandler",n,"?name","*sym:name","?type","?parms",NIL); String *symname = Getattr(n,"sym:name"); String *mrename = Swig_name_construct(symname); + String *nodeType = Getattr(n, "nodeType"); + int constructor = (!Cmp(nodeType, "constructor")); List *abstract = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstract); + if (!constructor) { + /* if not originally a constructor, still handle it as one */ + Setattr(n,"handled_as_constructor","1"); + } + Swig_ConstructorToFunction(n, ClassType, none_comparison, director_ctor, CPlusPlus, Getattr(n, "template") ? 0 :Extend); Setattr(n,"sym:name", mrename); diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index f812f054b..ea63ffd8c 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -351,12 +351,18 @@ public: tab4, "if (name == \"this\"):\n", tab4, tab4, "if isinstance(value, class_type):\n", tab4, tab8, "self.__dict__[name] = value.this\n", +#ifdef USE_THISOWN 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", +#ifdef USE_THISOWN tab4, "if (not static) or hasattr(self,name) or (name == \"thisown\"):\n", +#else + 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", @@ -389,7 +395,11 @@ public: 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", +#else + 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", @@ -523,14 +533,19 @@ public: * to use keyword args or not. * ------------------------------------------------------------ */ - String *funcCallHelper(String *name, int kw) { + String *funcCallHelper(String *name, int kw, const char* self = 0) { String *str; str = NewString(""); if (apply) { Printv(str, "apply(", module, ".", name, ", args", (kw ? ", kwargs" : ""), ")", NIL); } else { - Printv(str, module, ".", name, "(*args", (kw ? ", **kwargs" : ""), ")", NIL); + if (self) { + Printv(str, module, ".", name, "(", self, ", *args", (kw ? ", **kwargs" : ""), ")", NIL); + } else { + Printv(str, module, ".", name, "(*args", (kw ? ", **kwargs" : ""), ")", NIL); + } + } return str; } @@ -784,7 +799,7 @@ public: Printf(pdocs, " %s\n", pdoc); } } else { - Printf(doc, "??"); + Printf(doc, "?"); } if (value) { @@ -1454,12 +1469,15 @@ public: Replaceall(tm,"$source", "result"); Replaceall(tm,"$target", "resultobj"); Replaceall(tm,"$result", "resultobj"); - if (GetFlag(n,"feature:new")) { - Replaceall(tm,"$owner","SWIG_POINTER_OWN"); - } else { - Replaceall(tm,"$owner","0"); + if (constructor || Getattr(n,"handled_as_constructor")) { + Replaceall(tm,"$owner","SWIG_POINTER_NEW"); + } else { + if (GetFlag(n,"feature:new")) { + Replaceall(tm,"$owner","SWIG_POINTER_OWN"); + } else { + Replaceall(tm,"$owner","0"); + } } - // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! @@ -1922,7 +1940,11 @@ public: String *symname = Getattr(n,"sym:name"); String *mrename = Swig_name_disown(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); +#else + 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); @@ -2107,7 +2129,16 @@ public: Delete(ct); } if (!have_constructor) { - Printv(f_shadow_file,tab4,"def __init__(self): raise RuntimeError, \"No constructor defined\"\n",NIL); + String *rclassname = Swig_class_name(getCurrentClass()); + Printv(f_shadow_file, tab4,"def __init__(self, **kwargs):\n",NIL); + Printv(f_shadow_file, tab8, "try: this = kwargs[\"_swig_this\"]\n", NIL); + Printv(f_shadow_file, tab8, "except: this = None\n", NIL); + Printv(f_shadow_file, tab8, "if this == None: raise RuntimeError, \"No constructor defined\"\n", NIL); + if (!modern) { + Printv(f_shadow_file, tab8, "_swig_setattr(self, ", rclassname, ", 'this', this )\n", NIL); + } else { + Printv(f_shadow_file, tab8, "self.this = this\n", NIL); + } } if (!have_repr) { @@ -2116,13 +2147,13 @@ public: if (new_repr) { Printv(f_shadow_file, tab4, "def __repr__(self):\n", - tab8, "return \"<%s.%s; proxy of ", CPlusPlus ? "C++ " : "C ", rname," instance at %s>\" % (self.__class__.__module__, self.__class__.__name__, self.this,)\n", + tab8, "return \"<%s.%s; proxy of ", CPlusPlus ? "C++ " : "C ", rname," instance at 0x%x>\" % (self.__class__.__module__, self.__class__.__name__, self.this,)\n", NIL); } else { Printv(f_shadow_file, tab4, "def __repr__(self):\n", - tab8, "return \"\" % (self.this,)\n", + tab8, "return \"\" % (self.this,)\n", NIL); } Delete(rname); @@ -2133,24 +2164,30 @@ public: Printv(f_shadow_file, f_shadow, NIL); /* Now the Ptr class */ +#if 0 Printv(f_shadow_file, "\nclass ", class_name, "Ptr(", class_name, "):\n", tab4, "def __init__(self, this):\n", NIL); if (!modern) { Printv(f_shadow_file, tab8, "_swig_setattr(self, ", class_name, ", 'this', this)\n", +#ifdef USE_THISOWN tab8, "if not hasattr(self,\"thisown\"): _swig_setattr(self, ", class_name, ", 'thisown', 0)\n", +#endif tab8, "self.__class__ = ", class_name, "\n", NIL); } else { Printv(f_shadow_file, tab8, "self.this = this\n", +#ifdef USE_THISOWN tab8, "if not hasattr(self,\"thisown\"): self.thisown = 0\n", +#endif tab8, "self.__class__ = ", class_name, "\n", NIL); // tab8,"try: self.this = this.this; self.thisown = getattr(this,'thisown',0); this.thisown=0\n", // tab8,"except AttributeError: self.this = this\n" } +#endif - Printf(f_shadow_file,"%s.%s_swigregister(%sPtr)\n", module, class_name, class_name,0); + Printf(f_shadow_file,"%s.%s_swigregister(%s)\n", module, class_name, class_name,0); shadow_indent = 0; Printf(f_shadow_file,"%s\n", f_shadow_stubs); Clear(f_shadow_stubs); @@ -2336,7 +2373,7 @@ public: String *classname = Swig_class_name(parent); String *rclassname = Swig_class_name(getCurrentClass()); assert(rclassname); - if (use_director) { + if (use_director) { Printv(pass_self, tab8, NIL); Printf(pass_self, "if self.__class__ == %s:\n", classname); Printv(pass_self, tab8, tab4, "args = (None,) + args\n", @@ -2345,25 +2382,28 @@ public: NIL); } - Printv(f_shadow, tab4, "def __init__(self, *args", - (allow_kwargs ? ", **kwargs" : ""), "):\n", NIL); + Printv(f_shadow, tab4, "def __init__(self, *args, **kwargs):\n", NIL); if ( have_docstring(n) ) Printv(f_shadow, tab8, docstring(n, AUTODOC_CTOR, tab8), "\n", NIL); if ( have_pythonprepend(n) ) Printv(f_shadow, tab8, pythonprepend(n), "\n", NIL); Printv(f_shadow, pass_self, NIL); + Printv(f_shadow, tab8, "try: this = kwargs[\"_swig_this\"]\n", NIL); + Printv(f_shadow, tab8, "except: this = None\n", NIL); + Printv(f_shadow, tab8, "if this == None: this = ", funcCallHelper(Swig_name_construct(symname), allow_kwargs),"\n", NIL); if (!modern) { - Printv(f_shadow, tab8, "_swig_setattr(self, ", rclassname, ", 'this', ", - funcCallHelper(Swig_name_construct(symname), allow_kwargs), ")\n", NIL); + Printv(f_shadow, tab8, "_swig_setattr(self, ", rclassname, ", 'this', this )\n", NIL); Printv(f_shadow, +#ifdef USE_THISOWN tab8, "_swig_setattr(self, ", rclassname, ", 'thisown', 1)\n", +#endif NIL); } else { - Printv(f_shadow, tab8, "newobj = ", - funcCallHelper(Swig_name_construct(symname), allow_kwargs), "\n", NIL); - Printv(f_shadow, tab8, "self.this = newobj.this\n", NIL); + Printv(f_shadow, tab8, "self.this = this\n", NIL); +#ifdef USE_THISOWN Printv(f_shadow, tab8, "self.thisown = 1\n", NIL); Printv(f_shadow, tab8, "del newobj.thisown\n", NIL); +#endif } if ( have_pythonappend(n) ) Printv(f_shadow, tab8, pythonappend(n), "\n\n", NIL); @@ -2390,7 +2430,9 @@ public: Printv(f_shadow_stubs, tab4, pythonprepend(n), "\n", NIL); Printv(f_shadow_stubs, tab4, "val = ", funcCallHelper(Swig_name_construct(symname), allow_kwargs), "\n", NIL); +#ifdef USE_THISOWN Printv(f_shadow_stubs, tab4, "val.thisown = 1\n", NIL); +#endif if ( have_pythonappend(n) ) Printv(f_shadow_stubs, tab4, pythonappend(n), "\n", NIL); Printv(f_shadow_stubs, tab4, "return val\n", NIL); @@ -2410,6 +2452,7 @@ public: int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; + //Setattr(n,"emit:dealloc","1"); Language::destructorHandler(n); shadow = oldshadow; if (shadow) { @@ -2425,9 +2468,15 @@ public: Printv(f_shadow, tab8, docstring(n, AUTODOC_DTOR, tab8), "\n", NIL); if ( have_pythonprepend(n) ) Printv(f_shadow, tab8, pythonprepend(n), "\n", NIL); +#ifdef USE_THISOWN Printv(f_shadow, tab8, "try:\n", NIL); Printv(f_shadow, tab8, tab4, "if self.thisown: destroy(self)\n", NIL); Printv(f_shadow, tab8, "except: pass\n", NIL); +#else + Printv(f_shadow, tab8, "try:\n", NIL); + Printv(f_shadow, tab8, tab4, "if self.this.own(): destroy(self.this)\n", NIL); + Printv(f_shadow, tab8, "except: pass\n", NIL); +#endif if ( have_pythonappend(n) ) Printv(f_shadow, tab8, pythonappend(n), "\n", NIL); Printv(f_shadow, "\n", NIL);