[pypy-svn] r56457 - in pypy/branch/builtin-profiling/pypy/interpreter: . test

antocuni at codespeak.net antocuni at codespeak.net
Fri Jul 11 17:23:28 CEST 2008


Author: antocuni
Date: Fri Jul 11 17:23:26 2008
New Revision: 56457

Modified:
   pypy/branch/builtin-profiling/pypy/interpreter/baseobjspace.py
   pypy/branch/builtin-profiling/pypy/interpreter/function.py
   pypy/branch/builtin-profiling/pypy/interpreter/pyopcode.py
   pypy/branch/builtin-profiling/pypy/interpreter/test/test_executioncontext.py
Log:
make profiling of builtin calls working also in the general case



Modified: pypy/branch/builtin-profiling/pypy/interpreter/baseobjspace.py
==============================================================================
--- pypy/branch/builtin-profiling/pypy/interpreter/baseobjspace.py	(original)
+++ pypy/branch/builtin-profiling/pypy/interpreter/baseobjspace.py	Fri Jul 11 17:23:26 2008
@@ -694,17 +694,10 @@
         return self.call_args(w_func, args)
 
     def call_valuestack(self, w_func, nargs, frame):
-        from pypy.interpreter.function import Function, Method
-        from pypy.interpreter.gateway import BuiltinCode
+        from pypy.interpreter.function import Function, Method, is_builtin_code
         if frame.is_being_profiled:
             ec = self.getexecutioncontext()
-            is_c_call = False
-            if isinstance(w_func, Method):
-                code = w_func.w_function.getcode()
-            elif isinstance(w_func, Function):
-                code = w_func.getcode()
-            if isinstance(code, BuiltinCode):
-                is_c_call = True
+            is_c_call = is_builtin_code(w_func)
 
             # XXX: this code is copied&pasted :-( from the slow path
             # below. The profiling info could be not very accurate

Modified: pypy/branch/builtin-profiling/pypy/interpreter/function.py
==============================================================================
--- pypy/branch/builtin-profiling/pypy/interpreter/function.py	(original)
+++ pypy/branch/builtin-profiling/pypy/interpreter/function.py	Fri Jul 11 17:23:26 2008
@@ -502,3 +502,11 @@
 
     def descr_function_repr(self):
         return self.space.wrap('<built-in function %s>' % (self.name,))
+
+def is_builtin_code(w_func):
+    from pypy.interpreter.gateway import BuiltinCode
+    if isinstance(w_func, Method):
+        code = w_func.w_function.getcode()
+    elif isinstance(w_func, Function):
+        code = w_func.getcode()
+    return isinstance(code, BuiltinCode)

Modified: pypy/branch/builtin-profiling/pypy/interpreter/pyopcode.py
==============================================================================
--- pypy/branch/builtin-profiling/pypy/interpreter/pyopcode.py	(original)
+++ pypy/branch/builtin-profiling/pypy/interpreter/pyopcode.py	Fri Jul 11 17:23:26 2008
@@ -856,6 +856,7 @@
                       
     def call_function(f, oparg, w_star=None, w_starstar=None):
         from pypy.rlib import rstack # for resume points
+        from pypy.interpreter.function import is_builtin_code
     
         n_arguments = oparg & 0xff
         n_keywords = (oparg>>8) & 0xff
@@ -865,7 +866,20 @@
         arguments = f.popvalues(n_arguments)
         args = Arguments(f.space, arguments, keywords, w_star, w_starstar)
         w_function  = f.popvalue()
-        w_result = f.space.call_args(w_function, args)
+        if f.is_being_profiled and is_builtin_code(w_function):
+            is_c_call = is_builtin_code(w_function)
+            ec = f.space.getexecutioncontext()
+            if is_c_call:
+                ec.c_call_trace(f, w_function)
+            try:
+                w_result = f.space.call_args(w_function, args)
+            except OperationError, e:
+                if is_c_call:
+                    ec.c_exception_trace(f, e)
+            if is_c_call:
+                ec.c_return_trace(f, w_function)
+        else:
+            w_result = f.space.call_args(w_function, args)
         rstack.resume_point("call_function", f, returns=w_result)
         f.pushvalue(w_result)
         

Modified: pypy/branch/builtin-profiling/pypy/interpreter/test/test_executioncontext.py
==============================================================================
--- pypy/branch/builtin-profiling/pypy/interpreter/test/test_executioncontext.py	(original)
+++ pypy/branch/builtin-profiling/pypy/interpreter/test/test_executioncontext.py	Fri Jul 11 17:23:26 2008
@@ -99,6 +99,7 @@
         check_snippet('args = (1, 2); max(*args)')
         check_snippet('max(1, 2, **{})')
         check_snippet('args = (1, 2); max(*args, **{})')
+        check_snippet('abs(val=0)')
         
     def test_llprofile_c_exception(self):
         l = []



More information about the Pypy-commit mailing list