From 480ee80ce45f057aff1752e3f3006d66e4a44d9d Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Tue, 15 Feb 2011 02:15:55 -0800 Subject: [PATCH] Remove excessive refcounting. --- Cython/Compiler/ExprNodes.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 86a26c7c..5b339da9 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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() -- 2.26.2