[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