diff -ur Pyrex-0.9.3.orig/Pyrex/Compiler/Code.py Pyrex-0.9.3/Pyrex/Compiler/Code.py --- Pyrex-0.9.3.orig/Pyrex/Compiler/Code.py 2003-07-08 10:31:27.000000000 +0200 +++ Pyrex-0.9.3/Pyrex/Compiler/Code.py 2005-06-16 22:51:58.000000000 +0200 @@ -218,14 +218,19 @@ for entry in entries: self.put_var_xdecref_clear(entry) - def put_init_to_py_none(self, cname): - self.putln("%s = Py_None; Py_INCREF(%s);" % (cname, cname)) + def put_init_to_py_none(self, cast, cname): + if cast: + self.putln("%s = Py_None; Py_INCREF(%s %s);" % (cname, cast, cname)) + else: + self.putln("%s = Py_None; Py_INCREF(%s);" % (cname, cname)) def put_init_var_to_py_none(self, entry, template = "%s"): code = template % entry.cname if entry.type.is_extension_type: - code = "((PyObject*)%s)" % code - self.put_init_to_py_none(code) + cast = "(PyObject *)" + else: + cast = None + self.put_init_to_py_none(cast, code) def put_pymethoddef(self, entry, term): if entry.doc: diff -ur Pyrex-0.9.3.orig/Pyrex/Compiler/ExprNodes.py Pyrex-0.9.3/Pyrex/Compiler/ExprNodes.py --- Pyrex-0.9.3.orig/Pyrex/Compiler/ExprNodes.py 2004-05-01 12:15:07.000000000 +0200 +++ Pyrex-0.9.3/Pyrex/Compiler/ExprNodes.py 2005-06-16 22:52:23.000000000 +0200 @@ -806,7 +806,7 @@ if self.type.is_pyobject: rhs.make_owned_reference(code) code.put_decref(self.result, self.type) - code.putln('%s = %s;' % (self.result, rhs.result)) + code.putln('%s = %s;' % (self.entry.cname, rhs.result)) if debug_disposal_code: print "NameNode.generate_assignment_code:" print "...generating post-assignment code for", rhs @@ -1580,16 +1580,18 @@ return NameNode.is_ephemeral(self) def result_code(self): - return self.select_code() + return self.select_code()[0] def result_as_extension_type(self): return self.uncast_select_code() def select_code(self): - code = self.uncast_select_code() + orig_code = self.uncast_select_code() if self.type.is_extension_type: - code = "((PyObject *)%s)" % code - return code + code = "((PyObject *)%s)" % orig_code + else: + code = orig_code + return code, orig_code def uncast_select_code(self): obj_type = self.obj.type @@ -1642,13 +1644,13 @@ code.error_goto(self.pos))) rhs.generate_disposal_code(code) else: - select_code = self.select_code() + select_code, orig_code = self.select_code() if self.type.is_pyobject: rhs.make_owned_reference(code) code.put_decref(select_code, self.type) code.putln( "%s = %s;" % ( - select_code, + orig_code, rhs.result)) rhs.generate_post_assignment_code(code) self.obj.generate_disposal_code(code) Seulement dans Pyrex-0.9.3/Pyrex/Compiler: ExprNodes.py.orig diff -ur Pyrex-0.9.3.orig/Pyrex/Compiler/Nodes.py Pyrex-0.9.3/Pyrex/Compiler/Nodes.py --- Pyrex-0.9.3.orig/Pyrex/Compiler/Nodes.py 2004-07-11 09:26:29.000000000 +0200 +++ Pyrex-0.9.3/Pyrex/Compiler/Nodes.py 2005-06-16 22:51:58.000000000 +0200 @@ -484,9 +484,9 @@ self.generate_self_cast(scope, code) type = scope.parent_type if type.vtabslot_cname: - code.putln("(struct %s *)p->%s = %s;" % ( - type.vtabstruct_cname, + code.putln("p->%s = (struct %s *)%s;" % ( type.vtabslot_cname, + type.vtabstruct_cname, type.vtabptr_cname)) for entry in scope.var_entries: if entry.type.is_pyobject: @@ -1685,10 +1685,11 @@ code.putln("") if self.return_type.is_pyobject: if self.return_type.is_extension_type: - lhs = "(PyObject *)%s" % Naming.retval_cname + cast = "(PyObject *)" else: - lhs = Naming.retval_cname - code.put_init_to_py_none(lhs) + cast = None + lhs = Naming.retval_cname + code.put_init_to_py_none(cast, lhs) else: val = self.return_type.default_value if val: