summaryrefslogtreecommitdiff
path: root/libguile/frames.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2014-04-16 14:33:20 +0200
committerAndy Wingo <wingo@pobox.com>2014-04-16 14:33:20 +0200
commit4819276185a35001d56af93177fc29a6a7700000 (patch)
tree8f7a38f23d453dc9e4f9eef3368790ab8c88b64f /libguile/frames.c
parentd856931d8dedf3aeea2f5e8d530f43162b9dfaa5 (diff)
downloadguile-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.c21
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),
"")