- /* Debugging extensions for Guile
- * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation
+/* Debugging extensions for Guile
+ * Copyright (C) 1995,1996,1997,1998,1999,2000,2001 Free Software Foundation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
-#include <stdio.h>
#include "libguile/_scm.h"
#include "libguile/eval.h"
#include "libguile/stackchk.h"
SCM_DEFINE (scm_debug_options, "debug-options-interface", 0, 1, 0,
(SCM setting),
-"")
+ "Option interface for the debug options. Instead of using\n"
+ "this procedure directly, use the procedures @code{debug-enable},\n"
+ "@code{debug-disable}, @code{debug-set!} and @var{debug-options}.")
#define FUNC_NAME s_scm_debug_options
{
SCM ans;
SCM_DEFINE (scm_with_traps, "with-traps", 1, 0, 0,
(SCM thunk),
-"")
+ "Call @var{thunk} with traps enabled.")
#define FUNC_NAME s_scm_with_traps
{
int trap_flag;
#undef FUNC_NAME
\f
-static SCM scm_sym_source, scm_sym_dots;
-static SCM scm_sym_procname;
+
+SCM_SYMBOL (scm_sym_procname, "procname");
+SCM_SYMBOL (scm_sym_dots, "...");
+SCM_SYMBOL (scm_sym_source, "source");
/* {Memoized Source}
*/
-long scm_tc16_memoized;
-
+scm_bits_t scm_tc16_memoized;
static int
-prinmemoized (SCM obj,SCM port,scm_print_state *pstate)
+memoized_print (SCM obj, SCM port, scm_print_state *pstate)
{
int writingp = SCM_WRITINGP (pstate);
scm_puts ("#<memoized ", port);
SCM_DEFINE (scm_memoized_p, "memoized?", 1, 0, 0,
(SCM obj),
-"")
+ "Return @code{#t} if @var{obj} is memoized.")
#define FUNC_NAME s_scm_memoized_p
{
return SCM_BOOL(SCM_MEMOIZEDP (obj));
SCM_DEFINE (scm_make_gloc, "make-gloc", 1, 1, 0,
(SCM var, SCM env),
-"")
+ "Create a gloc for variable @var{var} in the environment\n"
+ "@var{env}.")
#define FUNC_NAME s_scm_make_gloc
{
-#if 1 /* Unsafe */
- if (SCM_CONSP (var))
- var = scm_cons (SCM_BOOL_F, var);
- else
-#endif
- SCM_VALIDATE_VARIABLE (1,var);
+ SCM_VALIDATE_VARIABLE (1,var);
if (SCM_UNBNDP (env))
env = scm_top_level_env (SCM_TOP_LEVEL_LOOKUP_CLOSURE);
else
SCM_VALIDATE_NULLORCONS (2,env);
- return scm_make_memoized (SCM_VARVCELL (var) + 1, env);
+ return scm_make_memoized (SCM_PACK (SCM_UNPACK (var) + scm_tc3_cons_gloc), env);
}
#undef FUNC_NAME
SCM_DEFINE (scm_gloc_p, "gloc?", 1, 0, 0,
(SCM obj),
-"")
+ "Return @code{#t} if @var{obj} is a gloc.")
#define FUNC_NAME s_scm_gloc_p
{
- return SCM_BOOL((SCM_MEMOIZEDP (obj)
- && (SCM_UNPACK(SCM_MEMOIZED_EXP (obj)) & 7) == 1));
+ return
+ SCM_BOOL (SCM_MEMOIZEDP (obj)
+ && ((SCM_UNPACK(SCM_MEMOIZED_EXP(obj))&7) == scm_tc3_cons_gloc));
}
#undef FUNC_NAME
SCM_DEFINE (scm_make_iloc, "make-iloc", 3, 0, 0,
(SCM frame, SCM binding, SCM cdrp),
-"")
+ "Return a new iloc with frame offset @var{frame}, binding\n"
+ "offset @var{binding} and the cdr flag @var{cdrp}.")
#define FUNC_NAME s_scm_make_iloc
{
SCM_VALIDATE_INUM (1,frame);
SCM_VALIDATE_INUM (2,binding);
- return (SCM_ILOC00
- + SCM_IFRINC * SCM_INUM (frame)
- + (SCM_NFALSEP (cdrp) ? SCM_ICDR : 0)
- + SCM_IDINC * SCM_INUM (binding));
+ return SCM_PACK (SCM_UNPACK (SCM_ILOC00)
+ + SCM_IFRINC * SCM_INUM (frame)
+ + (SCM_NFALSEP (cdrp) ? SCM_ICDR : 0)
+ + SCM_IDINC * SCM_INUM (binding));
}
#undef FUNC_NAME
SCM_DEFINE (scm_iloc_p, "iloc?", 1, 0, 0,
(SCM obj),
-"")
+ "Return @code{#t} if @var{obj} is an iloc.")
#define FUNC_NAME s_scm_iloc_p
{
return SCM_BOOL(SCM_ILOCP (obj));
SCM_DEFINE (scm_memcons, "memcons", 2, 1, 0,
(SCM car, SCM cdr, SCM env),
-"")
+ "Return a new memoized cons cell with @var{car} and @var{cdr}\n"
+ "as members and @var{env} as the environment.")
#define FUNC_NAME s_scm_memcons
{
if (SCM_MEMOIZEDP (car))
SCM_DEFINE (scm_mem_to_proc, "mem->proc", 1, 0, 0,
(SCM obj),
-"")
+ "Convert a memoized object (which must be a lambda expression)\n"
+ "to a procedure.")
#define FUNC_NAME s_scm_mem_to_proc
{
SCM env;
SCM_DEFINE (scm_proc_to_mem, "proc->mem", 1, 0, 0,
(SCM obj),
-"")
+ "Convert a procedure to a memoized object.")
#define FUNC_NAME s_scm_proc_to_mem
{
SCM_VALIDATE_CLOSURE (1, obj);
SCM_DEFINE (scm_unmemoize, "unmemoize", 1, 0, 0,
(SCM m),
-"")
+ "Unmemoize the memoized expression @var{m},")
#define FUNC_NAME s_scm_unmemoize
{
SCM_VALIDATE_MEMOIZED (1,m);
SCM_DEFINE (scm_memoized_environment, "memoized-environment", 1, 0, 0,
(SCM m),
-"")
+ "Return the environment of the memoized expression @var{m}.")
#define FUNC_NAME s_scm_memoized_environment
{
SCM_VALIDATE_MEMOIZED (1,m);
SCM_DEFINE (scm_procedure_name, "procedure-name", 1, 0, 0,
(SCM proc),
-"")
+ "Return the name of the procedure @var{proc}")
#define FUNC_NAME s_scm_procedure_name
{
SCM_VALIDATE_PROC (1,proc);
SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0,
(SCM proc),
-"")
+ "Return the source of the procedure @var{proc}.")
#define FUNC_NAME s_scm_procedure_source
{
SCM_VALIDATE_NIM (1,proc);
switch (SCM_TYP7 (proc)) {
case scm_tcs_closures:
{
- SCM src;
- src = scm_source_property (SCM_CDR (SCM_CODE (proc)), scm_sym_copy);
- if (! SCM_FALSEP (src))
- return scm_cons2 (scm_sym_lambda, SCM_CAR (SCM_CODE (proc)), src);
- src = SCM_CODE (proc);
+ SCM formals = SCM_CLOSURE_FORMALS (proc);
+ SCM src = scm_source_property (SCM_CDR (SCM_CODE (proc)), scm_sym_copy);
+ if (!SCM_FALSEP (src))
+ return scm_cons2 (scm_sym_lambda, formals, src);
return scm_cons (scm_sym_lambda,
- scm_unmemocopy (src,
- SCM_EXTEND_ENV (SCM_CAR (src),
- SCM_EOL,
- SCM_ENV (proc))));
+ scm_unmemocopy (SCM_CODE (proc),
+ SCM_EXTEND_ENV (formals,
+ SCM_EOL,
+ SCM_ENV (proc))));
}
case scm_tcs_subrs:
#ifdef CCLO
built in procedures! */
return scm_procedure_property (proc, scm_sym_source);
default:
- SCM_WTA(1,proc);
- return SCM_BOOL_F;
+ SCM_WRONG_TYPE_ARG (1, proc);
+ /* not reached */
}
}
#undef FUNC_NAME
SCM_DEFINE (scm_procedure_environment, "procedure-environment", 1, 0, 0,
(SCM proc),
-"")
+ "Return the environment of the procedure @var{proc}.")
#define FUNC_NAME s_scm_procedure_environment
{
SCM_VALIDATE_NIM (1,proc);
#endif
return SCM_EOL;
default:
- SCM_WTA(1,proc);
- return SCM_BOOL_F;
+ SCM_WRONG_TYPE_ARG (1, proc);
+ /* not reached */
}
}
#undef FUNC_NAME
SCM
scm_reverse_lookup (SCM env, SCM data)
{
- SCM names, values;
- while (SCM_NIMP (env) && SCM_SLOPPY_CONSP (SCM_CAR (env)))
+ while (SCM_CONSP (env) && SCM_CONSP (SCM_CAR (env)))
{
- names = SCM_CAAR (env);
- values = SCM_CDAR (env);
+ SCM names = SCM_CAAR (env);
+ SCM values = SCM_CDAR (env);
while (SCM_CONSP (names))
{
if (SCM_EQ_P (SCM_CAR (values), data))
names = SCM_CDR (names);
values = SCM_CDR (values);
}
- if (! SCM_NULLP (names) && SCM_EQ_P (values, data))
+ if (!SCM_NULLP (names) && SCM_EQ_P (values, data))
return names;
env = SCM_CDR (env);
}
scm_start_stack (SCM id, SCM exp, SCM env)
{
SCM answer;
- scm_debug_frame vframe;
- scm_debug_info vframe_vect_body;
+ scm_debug_frame_t vframe;
+ scm_debug_info_t vframe_vect_body;
vframe.prev = scm_last_debug_frame;
vframe.status = SCM_VOIDFRAME;
vframe.vect = &vframe_vect_body;
static SCM
scm_m_start_stack (SCM exp, SCM env)
+#define FUNC_NAME s_start_stack
{
exp = SCM_CDR (exp);
- SCM_ASSERT (SCM_ECONSP (exp)
- && SCM_ECONSP (SCM_CDR (exp))
- && SCM_NULLP (SCM_CDDR (exp)),
- exp,
- SCM_WNA,
- s_start_stack);
+ if (!SCM_ECONSP (exp)
+ || !SCM_ECONSP (SCM_CDR (exp))
+ || !SCM_NULLP (SCM_CDDR (exp)))
+ SCM_WRONG_NUM_ARGS ();
return scm_start_stack (scm_eval_car (exp, env), SCM_CADR (exp), env);
}
+#undef FUNC_NAME
+
/* {Debug Objects}
*
* The debugging evaluator throws these on frame traps.
*/
-long scm_tc16_debugobj;
+scm_bits_t scm_tc16_debugobj;
static int
-prindebugobj (SCM obj,SCM port,scm_print_state *pstate)
+debugobj_print (SCM obj, SCM port, scm_print_state *pstate)
{
scm_puts ("#<debug-object ", port);
scm_intprint ((int) SCM_DEBUGOBJ_FRAME (obj), 16, port);
SCM_DEFINE (scm_debug_object_p, "debug-object?", 1, 0, 0,
(SCM obj),
- "")
+ "Return @code{#t} if @var{obj} is a debug object.")
#define FUNC_NAME s_scm_debug_object_p
{
return SCM_BOOL(SCM_DEBUGOBJP (obj));
SCM
-scm_make_debugobj (scm_debug_frame *frame)
+scm_make_debugobj (scm_debug_frame_t *frame)
{
register SCM z;
SCM_NEWCELL (z);
#ifdef GUILE_DEBUG
SCM_DEFINE (scm_debug_hang, "debug-hang", 0, 1, 0,
(SCM obj),
- "")
+ "Go into an endless loop, which can be only terminated with\n"
+ "a debugger.")
#define FUNC_NAME s_scm_debug_hang
{
int go = 0;
{
scm_init_opts (scm_debug_options, scm_debug_opts, SCM_N_DEBUG_OPTIONS);
- scm_tc16_memoized = scm_make_smob_type_mfpe ("memoized", 0,
- scm_markcdr, NULL, prinmemoized, NULL);
-
- scm_tc16_debugobj = scm_make_smob_type_mfpe ("debug-object", 0,
- NULL, NULL, prindebugobj, NULL);
+ scm_tc16_memoized = scm_make_smob_type ("memoized", 0);
+ scm_set_smob_mark (scm_tc16_memoized, scm_markcdr);
+ scm_set_smob_print (scm_tc16_memoized, memoized_print);
- scm_sym_procname = SCM_CAR (scm_sysintern ("procname", SCM_UNDEFINED));
- scm_sym_dots = SCM_CAR (scm_sysintern ("...", SCM_UNDEFINED));
- scm_sym_source = SCM_CAR (scm_sysintern ("source", SCM_UNDEFINED));
+ scm_tc16_debugobj = scm_make_smob_type ("debug-object", 0);
+ scm_set_smob_print (scm_tc16_debugobj, debugobj_print);
#ifdef GUILE_DEBUG
- scm_sysintern ("SCM_IM_AND", SCM_IM_AND);
- scm_sysintern ("SCM_IM_BEGIN", SCM_IM_BEGIN);
- scm_sysintern ("SCM_IM_CASE", SCM_IM_CASE);
- scm_sysintern ("SCM_IM_COND", SCM_IM_COND);
- scm_sysintern ("SCM_IM_DO", SCM_IM_DO);
- scm_sysintern ("SCM_IM_IF", SCM_IM_IF);
- scm_sysintern ("SCM_IM_LAMBDA", SCM_IM_LAMBDA);
- scm_sysintern ("SCM_IM_LET", SCM_IM_LET);
- scm_sysintern ("SCM_IM_LETSTAR", SCM_IM_LETSTAR);
- scm_sysintern ("SCM_IM_LETREC", SCM_IM_LETREC);
- scm_sysintern ("SCM_IM_OR", SCM_IM_OR);
- scm_sysintern ("SCM_IM_QUOTE", SCM_IM_QUOTE);
- scm_sysintern ("SCM_IM_SET_X", SCM_IM_SET_X);
- scm_sysintern ("SCM_IM_DEFINE", SCM_IM_DEFINE);
- scm_sysintern ("SCM_IM_APPLY", SCM_IM_APPLY);
- scm_sysintern ("SCM_IM_CONT", SCM_IM_CONT);
- scm_sysintern ("SCM_IM_DISPATCH", SCM_IM_DISPATCH);
+ scm_c_define ("SCM_IM_AND", SCM_IM_AND);
+ scm_c_define ("SCM_IM_BEGIN", SCM_IM_BEGIN);
+ scm_c_define ("SCM_IM_CASE", SCM_IM_CASE);
+ scm_c_define ("SCM_IM_COND", SCM_IM_COND);
+ scm_c_define ("SCM_IM_DO", SCM_IM_DO);
+ scm_c_define ("SCM_IM_IF", SCM_IM_IF);
+ scm_c_define ("SCM_IM_LAMBDA", SCM_IM_LAMBDA);
+ scm_c_define ("SCM_IM_LET", SCM_IM_LET);
+ scm_c_define ("SCM_IM_LETSTAR", SCM_IM_LETSTAR);
+ scm_c_define ("SCM_IM_LETREC", SCM_IM_LETREC);
+ scm_c_define ("SCM_IM_OR", SCM_IM_OR);
+ scm_c_define ("SCM_IM_QUOTE", SCM_IM_QUOTE);
+ scm_c_define ("SCM_IM_SET_X", SCM_IM_SET_X);
+ scm_c_define ("SCM_IM_DEFINE", SCM_IM_DEFINE);
+ scm_c_define ("SCM_IM_APPLY", SCM_IM_APPLY);
+ scm_c_define ("SCM_IM_CONT", SCM_IM_CONT);
+ scm_c_define ("SCM_IM_DISPATCH", SCM_IM_DISPATCH);
#endif
scm_add_feature ("debug-extensions");