From: Robert Bradshaw Date: Fri, 25 Feb 2011 06:27:31 +0000 (-0800) Subject: More temp arg assignment avoidance. X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=3d6647f0524e1da9de68543917f149608ea3dcae;p=cython.git More temp arg assignment avoidance. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index c1d56d9b..2a94ad1f 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -368,7 +368,7 @@ class ExprNode(Node): 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 + return self.is_temp or self.type.is_array or self.type.is_cfunction # --------------- Type Analysis ------------------ @@ -1477,6 +1477,8 @@ class NameNode(AtomicExprNode): return 1 def nonlocally_immutable(self): + if ExprNode.nonlocally_immutable(self): + return True entry = self.entry return entry and (entry.is_local or entry.is_arg) and not entry.in_closure @@ -3038,10 +3040,8 @@ class SimpleCallNode(CallNode): if i == 0 and self.self is not None: continue # self is ok arg = self.args[i] - if arg.is_name and arg.entry and ( - (arg.entry.is_local and not arg.entry.in_closure) - or arg.entry.type.is_cfunction): - # local variables and C functions are safe + if arg.nonlocally_immutable(): + # locals, C functions, unassignable types are safe. pass elif arg.type.is_cpp_class: # Assignment has side effects, avoid.