diff options
author | Andy Wingo <wingo@pobox.com> | 2014-05-01 14:26:20 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2014-05-01 14:26:20 +0200 |
commit | de0233af177806ac96d535bb58f27875fb8c5375 (patch) | |
tree | 2df38f60a3a772f10d8b351dde2054892ebf5ca0 /libguile/programs.c | |
parent | d7a67c3e918acd8ca46dc7792a8ca98b33cb94e8 (diff) | |
download | guile-de0233af177806ac96d535bb58f27875fb8c5375.tar.gz |
Fix inner and outer stack cuts to match on procedure code
* doc/ref/api-debug.texi (Stack Capture): Update make-stack docs.
* libguile/programs.h:
* libguile/programs.c (scm_program_address_range): New internal
procedure.
* libguile/stacks.c (narrow_stack): Interpret a pair of integers as an
address range. If a cut is a procedure, attempt to resolve it to an
address range.
(scm_make_stack): Update docstring.
* module/system/vm/program.scm (program-address-range): New exported
procedure.
* module/statprof.scm (statprof, gcprof): Use program-address-range to
get the outer-cut, for efficiency.
Diffstat (limited to 'libguile/programs.c')
-rw-r--r-- | libguile/programs.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libguile/programs.c b/libguile/programs.c index fae95d0ab..64c861a71 100644 --- a/libguile/programs.c +++ b/libguile/programs.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -180,6 +180,18 @@ scm_find_source_for_addr (SCM ip) return scm_call_1 (scm_variable_ref (source_for_addr), ip); } +SCM +scm_program_address_range (SCM program) +{ + static SCM program_address_range = SCM_BOOL_F; + + if (scm_is_false (program_address_range) && scm_module_system_booted_p) + program_address_range = + scm_c_private_variable ("system vm program", "program-address-range"); + + return scm_call_1 (scm_variable_ref (program_address_range), program); +} + SCM_DEFINE (scm_program_num_free_variables, "program-num-free-variables", 1, 0, 0, (SCM program), "") |