From 7039048b34f68018aed46dfc84e216c381b08c40 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Fri, 28 Jan 2011 09:23:28 +0100 Subject: [PATCH] a method's self argument doesn't need to be in a temp when calling it --- Cython/Compiler/ExprNodes.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 03c1a75d..8d10c17c 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2965,7 +2965,10 @@ class SimpleCallNode(CallNode): if arg.is_temp: some_args_in_temps = True elif arg.type.is_pyobject and not env.nogil: - if not arg.is_name or arg.entry and (not arg.entry.is_local or arg.entry.in_closure): + if arg.is_name or (i == 0 and self.self is not None): + # names and a method's cloned "self" argument are ok + pass + elif arg.entry and (not arg.entry.is_local or arg.entry.in_closure): # we do not safely own the argument's reference, # but we must make sure it cannot be collected # before we return from the function, so we create @@ -2978,6 +2981,8 @@ class SimpleCallNode(CallNode): # constructed in the wrong order (temps first) => make # sure they are either all temps or all not temps for i in range(min(max_nargs, actual_nargs)-1): + 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) @@ -7404,6 +7409,9 @@ class CloneNode(CoercionNode): if hasattr(self.arg, 'entry'): self.entry = self.arg.entry + def is_simple(self): + return True # result is always in a temp (or a name) + def generate_evaluation_code(self, code): pass -- 2.26.2