summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2006-02-07 22:28:09 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2006-02-07 22:28:09 (GMT)
commit35f82d7051093ffe3ab181a05ed61982560149be (patch)
tree41363bf405279a1ff19754fbb3ed978be7687dac
parente0f85926d676d7284eef9cb06c825ae8d1a54469 (diff)
downloadcpython-35f82d7051093ffe3ab181a05ed61982560149be.zip
cpython-35f82d7051093ffe3ab181a05ed61982560149be.tar.gz
cpython-35f82d7051093ffe3ab181a05ed61982560149be.tar.bz2
Fixed an oversight and a misunderstanding of PEP253:
- Call tp_dealloc on the static baseclass, not dynamic (which leads to infinite loops with more than one baseclass) - Call tp_new and tp_init on baseclasses (overridable) -This line, and those below, will be ignored-- M bgen/bgenObjectDefinition.py
-rw-r--r--Tools/bgen/bgen/bgenObjectDefinition.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/Tools/bgen/bgen/bgenObjectDefinition.py b/Tools/bgen/bgen/bgenObjectDefinition.py
index 1a44ca4..422ebfd 100644
--- a/Tools/bgen/bgen/bgenObjectDefinition.py
+++ b/Tools/bgen/bgen/bgenObjectDefinition.py
@@ -141,7 +141,7 @@ class ObjectDefinition(GeneratorGroup):
OutLbrace()
self.outputCleanupStructMembers()
if self.basetype:
- Output("self->ob_type->tp_base->tp_dealloc((PyObject *)self);")
+ Output("%s.tp_dealloc((PyObject *)self);", self.basetype)
elif hasattr(self, 'output_tp_free'):
# This is a new-style object with tp_free slot
Output("self->ob_type->tp_free((PyObject *)self);")
@@ -382,12 +382,20 @@ class PEP253Mixin(PEP252Mixin):
def outputHook_tp_free(self):
Output("%s_tp_free, /* tp_free */", self.prefix)
+ def output_tp_initBody_basecall(self):
+ if self.basetype:
+ Output("if (%s.tp_init)", self.basetype)
+ OutLbrace()
+ Output("if ( (*%s.tp_init)(_self, _args, _kwds) < 0) return -1;", self.basetype)
+ OutRbrace()
+
output_tp_initBody = None
def output_tp_init(self):
if self.output_tp_initBody:
Output("static int %s_tp_init(PyObject *_self, PyObject *_args, PyObject *_kwds)", self.prefix)
OutLbrace()
+ self.output_tp_initBody_basecall()
self.output_tp_initBody()
OutRbrace()
else:
@@ -414,7 +422,17 @@ class PEP253Mixin(PEP252Mixin):
Output()
Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
self.prefix);
- Output("if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;")
+ if self.basetype:
+ Output("if (%s.tp_new)", self.basetype)
+ OutLbrace()
+ Output("if ( (*%s.tp_init)(_self, _args, _kwds) == NULL) return NULL;", self.basetype)
+ Dedent()
+ Output("} else {")
+ Indent()
+ Output("if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;")
+ OutRbrace()
+ else:
+ Output("if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;")
Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
Output("return _self;")