From: Robert Bradshaw Date: Tue, 10 Jul 2007 09:15:10 +0000 (-0700) Subject: latest 0.9.4 changes into 0.9.5 branch X-Git-Tag: 0.9.6.14~29^2~177 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=1b0644899e50ff542e5a6f254063d8db0fef1a29;p=cython.git latest 0.9.4 changes into 0.9.5 branch --- 1b0644899e50ff542e5a6f254063d8db0fef1a29 diff --cc Cython/Compiler/ExprNodes.py index a105e33f,f7e17a05..18eb72c7 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@@ -1877,17 -1854,31 +1877,38 @@@ class SequenceNode(ExprNode) self.generate_operation_code(code) def generate_assignment_code(self, rhs, code): + code.putln( + "if (PyTuple_CheckExact(%s) && PyTuple_GET_SIZE(%s) == %s) {" % ( + rhs.py_result(), + rhs.py_result(), + len(self.args))) + for i in range(len(self.args)): + item = self.unpacked_items[i] + code.putln( + "%s = PyTuple_GET_ITEM(%s, %s);" % ( + item.result_code, + rhs.py_result(), + i)) + code.put_incref(item.result_code, item.ctype()) + value_node = self.coerced_unpacked_items[i] + value_node.generate_evaluation_code(code) + self.args[i].generate_assignment_code(value_node, code) + ++ rhs.generate_disposal_code(code) + code.putln("}") + code.putln("else {") + + code.putln( + "%s = PyObject_GetIter(%s); if (!%s) %s" % ( + self.iterator.result_code, + rhs.py_result(), + self.iterator.result_code, + code.error_goto(self.pos))) + rhs.generate_disposal_code(code) for i in range(len(self.args)): item = self.unpacked_items[i] - unpack_code = "__Pyx_UnpackItem(%s, %s)" % ( - rhs.py_result(), - i) + unpack_code = "__Pyx_UnpackItem(%s)" % ( + self.iterator.py_result()) code.putln( "%s = %s; if (!%s) %s" % ( item.result_code, @@@ -1898,14 -1889,17 +1919,16 @@@ value_node.generate_evaluation_code(code) self.args[i].generate_assignment_code(value_node, code) code.putln( - "if (__Pyx_EndUnpack(%s, %s) < 0) %s" % ( - rhs.py_result(), - len(self.args), + "if (__Pyx_EndUnpack(%s) < 0) %s" % ( + self.iterator.py_result(), code.error_goto(self.pos))) - - code.putln("}") if debug_disposal_code: print "UnpackNode.generate_assignment_code:" -- print "...generating disposal code for", rhs - rhs.generate_disposal_code(code) ++ print "...generating disposal code for", iterator + self.iterator.generate_disposal_code(code) + ++ code.putln("}") + class TupleNode(SequenceNode): # Tuple constructor.