Remove excessive refcounting.
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 15 Feb 2011 10:15:55 +0000 (02:15 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 15 Feb 2011 10:15:55 +0000 (02:15 -0800)
Cython/Compiler/ExprNodes.py

index 86a26c7cc074f1ca4004f99f0d82f57e5806a4f8..5b339da9423f29777883b736da3c80102d2d09d9 100755 (executable)
@@ -365,6 +365,11 @@ class ExprNode(Node):
         else:
             self.not_implemented("infer_type")
 
+    def nonlocally_immutable(self):
+        # Returns whether this variable is a safe reference, i.e.
+        # can't be modified as part of globals or closures.
+        return self.is_temp
+
     # --------------- Type Analysis ------------------
 
     def analyse_as_module(self, env):
@@ -751,6 +756,9 @@ class ConstNode(AtomicExprNode):
     def is_simple(self):
         return 1
 
+    def nonlocally_immutable(self):
+        return 1
+
     def may_be_none(self):
         return False
 
@@ -1468,6 +1476,10 @@ class NameNode(AtomicExprNode):
         #  If it's not a C variable, it'll be in a temp.
         return 1
 
+    def nonlocally_immutable(self):
+        entry = self.entry
+        return entry and (entry.is_local or entry.is_arg) and not entry.in_closure
+
     def calculate_target_results(self, env):
         pass
 
@@ -2990,7 +3002,7 @@ class SimpleCallNode(CallNode):
                 if i == 0 and self.self is not None:
                     # a method's cloned "self" argument is ok
                     pass
-                elif arg.is_name and arg.entry and arg.entry.is_local and not arg.entry.in_closure:
+                elif arg.nonlocally_immutable():
                     # plain local variables are ok
                     pass
                 else:
@@ -4042,6 +4054,10 @@ class TupleNode(SequenceNode):
         # either temp or constant => always simple
         return True
 
+    def nonlocally_immutable(self):
+        # either temp or constant => always safe
+        return True
+
     def calculate_result_code(self):
         if len(self.args) > 0:
             return self.result_code
@@ -5428,6 +5444,9 @@ class TypecastNode(ExprNode):
         # either temp or a C cast => no side effects
         return True
 
+    def nonlocally_immutable(self):
+        return self.operand.nonlocally_immutable()
+
     def nogil_check(self, env):
         if self.type and self.type.is_pyobject and self.is_temp:
             self.gil_error()