From 76c1e4e8887178ffbfebbc985e00c6faacb1a169 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 2 Jan 2008 17:30:55 +0000 Subject: [PATCH] In classes' tp_init wrappers, create an instance of the helper class only if called from a subclass, else create a regular pure C++ original class. --- pybindgen/cppmethod.py | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/pybindgen/cppmethod.py b/pybindgen/cppmethod.py index a69efd7..d90e0fa 100644 --- a/pybindgen/cppmethod.py +++ b/pybindgen/cppmethod.py @@ -244,16 +244,39 @@ class CppConstructor(ForwardWrapperBase): "virtual method implementation; do not call" #assert isinstance(class_, CppClass) if class_.helper_class is None: - class_name = class_.full_name - call_params = self.call_params + self.before_call.write_code( + 'self->obj = new %s(%s);' % + (class_.get_construct_name(), ", ".join(self.call_params))) else: - class_name = class_.helper_class.name - #self.before_call.write_code(r'fprintf(stderr, "creating a %s class instance\n");' % class_name) - self.before_call.write_code( - 'self->obj = new %s(%s);' % - (class_name, ", ".join(self.call_params))) - if class_.helper_class is not None: - self.before_call.write_code('((%s*) self->obj)->set_pyobj((PyObject *)self);' % class_name) + ## We should only create a helper class instance when + ## being called from a user python subclass. + self.before_call.write_code("if (self->ob_type != &%s)" % class_.pytypestruct) + self.before_call.write_code("{") + self.before_call.indent() + + self.before_call.write_code( + 'self->obj = new %s(%s);' % + (class_.helper_class.name, ", ".join(self.call_params))) + self.before_call.write_code('((%s*) self->obj)->set_pyobj((PyObject *)self);' + % class_.helper_class.name) + + self.before_call.unindent() + self.before_call.write_code("} else {") + self.before_call.indent() + + try: + contruct_name = class_.get_construct_name() + except CodeGenerationError: + self.before_call.write_code('PyErr_SetString(PyExc_TypeError, "class \'%s\' ' + 'cannot be constructed");' % class_.name) + self.before_call.write_code('return -1;') + else: + self.before_call.write_code( + 'self->obj = new %s(%s);' % + (contruct_name, ", ".join(self.call_params))) + + self.before_call.unindent() + self.before_call.write_code("}") def _before_return_hook(self): "hook that post-processes parameters and check for custodian= CppClass parameters"