[pypy-commit] pypy faster-traceback: try to get a raw way of getting traceback quickly

fijal pypy.commits at gmail.com
Fri Mar 25 15:33:57 EDT 2016


Author: fijal
Branch: faster-traceback
Changeset: r83368:5c1292c4398f
Date: 2016-03-25 21:32 +0200
http://bitbucket.org/pypy/pypy/changeset/5c1292c4398f/

Log:	try to get a raw way of getting traceback quickly

diff --git a/pypy/module/__pypy__/interp_traceback.py b/pypy/module/__pypy__/interp_traceback.py
new file mode 100644
diff --git a/pypy/module/_vmprof/__init__.py b/pypy/module/_vmprof/__init__.py
--- a/pypy/module/_vmprof/__init__.py
+++ b/pypy/module/_vmprof/__init__.py
@@ -13,6 +13,8 @@
         'disable': 'interp_vmprof.disable',
         'write_all_code_objects': 'interp_vmprof.write_all_code_objects',
         'VMProfError': 'space.fromcache(interp_vmprof.Cache).w_VMProfError',
+        'get_fast_traceback' : 'interp_vmprof.get_fast_traceback',
+        'code_get_unique_id' : 'interp_vmprof.code_get_unique_id',
     }
 
 
diff --git a/pypy/module/_vmprof/interp_vmprof.py b/pypy/module/_vmprof/interp_vmprof.py
--- a/pypy/module/_vmprof/interp_vmprof.py
+++ b/pypy/module/_vmprof/interp_vmprof.py
@@ -5,6 +5,9 @@
 from pypy.interpreter.baseobjspace import W_Root
 from rpython.rlib import rvmprof
 
+from rpython.rtyper.lltypesystem import lltype
+
+
 # ____________________________________________________________
 
 
@@ -82,3 +85,20 @@
         rvmprof.disable()
     except rvmprof.VMProfError, e:
         raise VMProfError(space, e)
+
+
+def get_fast_traceback(space):
+    MAX_SIZE = 1000
+    l = []
+
+    with lltype.scoped_alloc(lltype.Signed, MAX_SIZE) as buf:
+        n = rvmprof._get_vmprof().cintf.get_stack_trace_default(
+            buf, MAX_SIZE)
+        for i in range(n):
+            l.append(buf[i])
+    return space.newlist_int(l)
+
+ at unwrap_spec(w_code=PyCode)
+def code_get_unique_id(space, w_code):
+    return space.wrap(w_code._vmprof_unique_id)
+
diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py
--- a/rpython/rlib/rvmprof/cintf.py
+++ b/rpython/rlib/rvmprof/cintf.py
@@ -55,6 +55,10 @@
                                             [rffi.INT], lltype.Void,
                                             compilation_info=eci,
                                             _nowrapper=True)
+    vmprof_get_stack_trace_default = rffi.llexternal(
+        "vmprof_get_stack_trace_default",
+        [rffi.CArrayPtr(lltype.Signed), rffi.INT],
+        rffi.INT, compilation_info=eci, threadsafe=False)
     return CInterface(locals())
 
 
diff --git a/rpython/rlib/rvmprof/src/vmprof_common.h b/rpython/rlib/rvmprof/src/vmprof_common.h
--- a/rpython/rlib/rvmprof/src/vmprof_common.h
+++ b/rpython/rlib/rvmprof/src/vmprof_common.h
@@ -119,3 +119,8 @@
     return 0;
 }
 #endif
+
+static int get_stack_trace_default(intptr_t *result, int max_depth)
+{
+    return get_stack_trace(get_vmprof_stack(), result, max_depth, 0);
+}


More information about the pypy-commit mailing list