From: Dag Sverre Seljebotn Date: Mon, 6 Oct 2008 19:12:23 +0000 (+0200) Subject: merge X-Git-Tag: 0.9.9.2.beta~63^2 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=6fff2b59221043effc2ea8a953b0fcf21b44f316;p=cython.git merge --- 6fff2b59221043effc2ea8a953b0fcf21b44f316 diff --cc Cython/Compiler/ExprNodes.py index e4c61149,46323cd6..bbcd0e79 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@@ -568,68 -563,11 +568,71 @@@ class ExprNode(Node) # a constant, local var, C global var, struct member # reference, or temporary. return self.result_in_temp() + + def as_cython_attribute(self): + return None +class NewTempExprNode(ExprNode): + backwards_compatible_result = None + + def result(self): + if self.is_temp: + return self.temp_code + else: + return self.calculate_result_code() + + def allocate_target_temps(self, env, rhs): + self.allocate_subexpr_temps(env) + rhs.release_temp(rhs) + self.release_subexpr_temps(env) + + def allocate_temps(self, env, result = None): + self.allocate_subexpr_temps(env) + self.backwards_compatible_result = result + if self.is_temp: + self.release_subexpr_temps(env) + + def allocate_temp(self, env, result = None): + assert result is None + + def release_temp(self, env): + pass + + def pre_generate_result_code(self, code): + if self.is_temp: + type = self.type + if not type.is_void: + if type.is_pyobject: + type = PyrexTypes.py_object_type + if self.backwards_compatible_result: + self.temp_code = self.backwards_compatible_result + else: + self.temp_code = code.funcstate.allocate_temp(type) + else: + self.temp_code = None + + def generate_disposal_code(self, code): + if self.is_temp: + if self.type.is_pyobject: + code.put_decref_clear(self.result(), self.ctype()) + if not self.backwards_compatible_result: + code.funcstate.release_temp(self.temp_code) + else: + self.generate_subexpr_disposal_code(code) + + def generate_post_assignment_code(self, code): + if self.is_temp: + if self.type.is_pyobject: + code.putln("%s = 0;" % self.temp_code) + if not self.backwards_compatible_result: + code.funcstate.release_temp(self.temp_code) + else: + self.generate_subexpr_disposal_code(code) + + + + class AtomicExprNode(ExprNode): # Abstract base class for expression nodes which have # no sub-expressions.