diff options
author | Andy Wingo <wingo@pobox.com> | 2014-04-16 14:33:20 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-04-16 14:33:20 +0200 |
commit | 4819276185a35001d56af93177fc29a6a7700000 (patch) | |
tree | 8f7a38f23d453dc9e4f9eef3368790ab8c88b64f /libguile/frames.c | |
parent | d856931d8dedf3aeea2f5e8d530f43162b9dfaa5 (diff) | |
download | guile-4819276185a35001d56af93177fc29a6a7700000.tar.gz |
Better backtraces from C, especially for optimized closures
* libguile/frames.h:
* libguile/frames.c (scm_frame_call_representation): New interface;
dispatches to Scheme.
* libguile/backtrace.c (display_application): Use
scm_frame_call_representation. This should be monotonically better,
given that scm_frame_arguments (which was previously called) also
dispatched to Scheme and actually ended up calling
frame-call-representation.
Diffstat (limited to 'libguile/frames.c')
-rw-r--r-- | libguile/frames.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libguile/frames.c b/libguile/frames.c index 6096824c7..105b15455 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -171,6 +171,27 @@ SCM_DEFINE (scm_frame_arguments, "frame-arguments", 1, 0, 0, } #undef FUNC_NAME +static SCM frame_call_representation_var; + +static void +init_frame_call_representation_var (void) +{ + frame_call_representation_var + = scm_c_private_lookup ("system vm frame", "frame-call-representation"); +} + +SCM scm_frame_call_representation (SCM frame) +#define FUNC_NAME "frame-call-representation" +{ + static scm_i_pthread_once_t once = SCM_I_PTHREAD_ONCE_INIT; + scm_i_pthread_once (&once, init_frame_call_representation_var); + + SCM_VALIDATE_VM_FRAME (1, frame); + + return scm_call_1 (scm_variable_ref (frame_call_representation_var), frame); +} +#undef FUNC_NAME + SCM_DEFINE (scm_frame_source, "frame-source", 1, 0, 0, (SCM frame), "") |