Make a few common cases not use temporary for buffer acquisition
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 27 Nov 2008 11:16:50 +0000 (12:16 +0100)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Thu, 27 Nov 2008 11:16:50 +0000 (12:16 +0100)
Cython/Compiler/ExprNodes.py

index eb780c820a7ba57777d22e8ad139f1f52f02e6bc..87ea05c9c18d3bce085c77e7ebfbc1c5a2f4c388 100644 (file)
@@ -1227,17 +1227,23 @@ class NameNode(AtomicExprNode):
         # rhstmp is only used in case the rhs is a complicated expression leading to
         # the object, to avoid repeating the same C expression for every reference
         # to the rhs. It does NOT hold a reference.
-        rhstmp = code.funcstate.allocate_temp(self.entry.type, manage_ref=False)
+        pretty_rhs = isinstance(rhs, NameNode) or rhs.is_temp
+        if pretty_rhs:
+            rhstmp = rhs.result_as(self.ctype())
+        else:
+            rhstmp = code.funcstate.allocate_temp(self.entry.type, manage_ref=False)
+            code.putln('%s = %s;' % (rhstmp, rhs.result_as(self.ctype())))
+
         buffer_aux = self.entry.buffer_aux
         bufstruct = buffer_aux.buffer_info_var.cname
-        code.putln('%s = %s;' % (rhstmp, rhs.result_as(self.ctype())))
-
         import Buffer
         Buffer.put_assign_to_buffer(self.result(), rhstmp, buffer_aux, self.entry.type,
                                     is_initialized=not self.lhs_of_first_assignment,
                                     pos=self.pos, code=code)
-        code.putln("%s = 0;" % rhstmp)
-        code.funcstate.release_temp(rhstmp)
+        
+        if not pretty_rhs:
+            code.putln("%s = 0;" % rhstmp)
+            code.funcstate.release_temp(rhstmp)
     
     def generate_deletion_code(self, code):
         if self.entry is None: