Skip to content

Commit

Permalink
Fixed an oversight and a misunderstanding of PEP253:
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
jackjansen committed Feb 7, 2006
1 parent e0f8592 commit 35f82d7
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions Tools/bgen/bgen/bgenObjectDefinition.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def outputDealloc(self):
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);")
Expand Down Expand Up @@ -382,12 +382,20 @@ def outputHook_tp_new(self):
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:
Expand All @@ -414,7 +422,17 @@ def output_tp_newBody(self):
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;")

Expand Down

0 comments on commit 35f82d7

Please sign in to comment.