[pypy-svn] r57705 - pypy/branch/garden-call-code-2/pypy/interpreter

pedronis at codespeak.net pedronis at codespeak.net
Sun Aug 31 23:32:18 CEST 2008


Author: pedronis
Date: Sun Aug 31 23:32:15 2008
New Revision: 57705

Modified:
   pypy/branch/garden-call-code-2/pypy/interpreter/function.py
Log:
WIP: start of removing fastcall* on PyCode and the ArgumentsFormValuestack

this expectedly break test in test_function.py about fastcall being used



Modified: pypy/branch/garden-call-code-2/pypy/interpreter/function.py
==============================================================================
--- pypy/branch/garden-call-code-2/pypy/interpreter/function.py	(original)
+++ pypy/branch/garden-call-code-2/pypy/interpreter/function.py	Sun Aug 31 23:32:15 2008
@@ -69,25 +69,39 @@
         return self.call_args(Arguments(self.space, list(args_w)))
 
     def funccall_valuestack(self, nargs, frame): # speed hack
+        from pypy.interpreter import gateway
         code = self.getcode() # hook for the jit
         fast_natural_arity = code.fast_natural_arity        
-        if nargs == fast_natural_arity:        
-            if nargs == 0:
-                return code.fastcall_0(self.space, self)
-            elif nargs == 1:
-                return code.fastcall_1(self.space, self, frame.peekvalue(0))
-            elif nargs == 2:
-                return code.fastcall_2(self.space, self, frame.peekvalue(1),
-                                       frame.peekvalue(0))
-            elif nargs == 3:
-                return code.fastcall_3(self.space, self, frame.peekvalue(2),
-                                       frame.peekvalue(1), frame.peekvalue(0))
-            elif nargs == 4:
-                return code.fastcall_4(self.space, self, frame.peekvalue(3),
-                                       frame.peekvalue(2), frame.peekvalue(1),
-                                        frame.peekvalue(0))
+        if nargs == fast_natural_arity:
+            from pypy.interpreter.pycode import PyCode
+            if type(code) is PyCode:
+                new_frame = self.space.createframe(code, self.w_func_globals,
+                                                   self.closure)
+                for i in xrange(nargs):
+                    w_arg = frame.peekvalue(nargs-1-i)
+                    new_frame.fastlocals_w[i] = w_arg
+                return new_frame.run()                
+            else:
+                if nargs == 0:
+                    assert isinstance(code, gateway.BuiltinCode0)
+                    return code.fastcall_0(self.space, self)
+                elif nargs == 1:
+                    assert isinstance(code, gateway.BuiltinCode1)
+                    return code.fastcall_1(self.space, self, frame.peekvalue(0))
+                elif nargs == 2:
+                    assert isinstance(code, gateway.BuiltinCode2)
+                    return code.fastcall_2(self.space, self, frame.peekvalue(1),
+                                           frame.peekvalue(0))
+                elif nargs == 3:
+                    assert isinstance(code, gateway.BuiltinCode3)
+                    return code.fastcall_3(self.space, self, frame.peekvalue(2),
+                                           frame.peekvalue(1), frame.peekvalue(0))
+                elif nargs == 4:
+                    assert isinstance(code, gateway.BuiltinCode4)
+                    return code.fastcall_4(self.space, self, frame.peekvalue(3),
+                                           frame.peekvalue(2), frame.peekvalue(1),
+                                            frame.peekvalue(0))
         elif fast_natural_arity == -1 and nargs >= 1:
-            from pypy.interpreter import gateway
             assert isinstance(code, gateway.BuiltinCodePassThroughArguments1)
             w_obj = frame.peekvalue(nargs-1)
             args = frame.make_arguments(nargs-1)



More information about the Pypy-commit mailing list