/* Representation of stack frame debug information
- * Copyright (C) 1996,1997 Free Software Foundation
+ * Copyright (C) 1996,1997, 2000 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
*
* The author can be reached at djurfeldt@nada.kth.se
* Mikael Djurfeldt, SANS/NADA KTH, 10044 STOCKHOLM, SWEDEN */
+
+/* Software engineering face-lift by Greg J. Badros, 11-Dec-1999,
+ gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */
+
\f
-#include <stdio.h>
-#include "_scm.h"
-#include "debug.h"
-#include "continuations.h"
-#include "struct.h"
-#include "macros.h"
+#include "libguile/_scm.h"
+#include "libguile/eval.h"
+#include "libguile/debug.h"
+#include "libguile/continuations.h"
+#include "libguile/struct.h"
+#include "libguile/macros.h"
+#include "libguile/procprop.h"
+#include "libguile/modules.h"
+#include "libguile/root.h"
+#include "libguile/strings.h"
-#include "stacks.h"
+#include "libguile/validate.h"
+#include "libguile/stacks.h"
\f
/* {Frames and stacks}
* DFRAME. OFFSET is used for relocation of pointers when the stack
* is read from a continuation.
*/
-static int stack_depth SCM_P ((scm_debug_frame *dframe, long offset, SCM *id, int *maxp));
static int
-stack_depth (dframe, offset, id, maxp)
- scm_debug_frame *dframe;
- long offset;
- SCM *id;
- int *maxp;
+stack_depth (scm_debug_frame *dframe,long offset,SCM *id,int *maxp)
{
- int n, size;
+ int n;
int max_depth = SCM_BACKTRACE_MAXDEPTH;
- scm_debug_info *info;
for (n = 0;
dframe && !SCM_VOIDFRAMEP (*dframe) && n < max_depth;
dframe = RELOC_FRAME (dframe->prev, offset))
{
if (SCM_EVALFRAMEP (*dframe))
{
- size = dframe->status & SCM_MAX_FRAME_SIZE;
- info = RELOC_INFO (dframe->info, offset);
+ scm_debug_info * info = RELOC_INFO (dframe->info, offset);
n += (info - dframe->vect) / 2 + 1;
/* Data in the apply part of an eval info frame comes from previous
stack frame if the scm_debug_info vector is overflowed. */
/* Read debug info from DFRAME into IFRAME.
*/
-static void read_frame SCM_P ((scm_debug_frame *dframe, long offset, scm_info_frame *iframe));
static void
-read_frame (dframe, offset, iframe)
- scm_debug_frame *dframe;
- long offset;
- scm_info_frame *iframe;
+read_frame (scm_debug_frame *dframe,long offset,scm_info_frame *iframe)
{
- SCM flags = SCM_INUM0;
- int size;
- scm_debug_info *info;
+ scm_bits_t flags = SCM_UNPACK (SCM_INUM0); /* UGh. */
if (SCM_EVALFRAMEP (*dframe))
{
- size = dframe->status & SCM_MAX_FRAME_SIZE;
- info = RELOC_INFO (dframe->info, offset);
+ scm_debug_info * info = RELOC_INFO (dframe->info, offset);
if ((info - dframe->vect) & 1)
{
/* Debug.vect ends with apply info. */
--info;
- if (info[1].a.proc != SCM_UNDEFINED)
+ if (!SCM_UNBNDP (info[1].a.proc))
{
flags |= SCM_FRAMEF_PROC;
iframe->proc = info[1].a.proc;
iframe->flags = flags;
}
-SCM_SYMBOL (scm_sym_apply, "apply");
-
/* Look up the first body form of the apply closure. We'll use this
below to prevent it from being displayed.
*/
static SCM
get_applybody ()
{
- SCM proc = SCM_CDR (scm_sym2vcell (scm_sym_apply, SCM_BOOL_F, SCM_BOOL_F));
- if (SCM_NIMP (proc) && SCM_CLOSUREP (proc))
- return SCM_CADR (SCM_CODE (proc));
+ SCM cell = scm_sym2vcell (scm_sym_apply, SCM_BOOL_F, SCM_BOOL_F);
+ if (SCM_CONSP (cell) && SCM_CLOSUREP (SCM_CDR (cell)))
+ return SCM_CADR (SCM_CODE (SCM_CDR (cell)));
else
return SCM_UNDEFINED;
}
#define NEXT_FRAME(iframe, n, quit) \
-{ \
+do { \
if (SCM_NIMP (iframe->source) \
- && SCM_MEMOIZED_EXP (iframe->source) == applybody) \
+ && SCM_EQ_P (SCM_MEMOIZED_EXP (iframe->source), applybody)) \
{ \
iframe->source = SCM_BOOL_F; \
if (SCM_FALSEP (iframe->proc)) \
++iframe; \
if (--n == 0) \
goto quit; \
-} \
+} while (0)
/* Fill the scm_info_frame vector IFRAME with data from N stack frames
* DFRAME.
*/
-static int read_frames SCM_P ((scm_debug_frame *dframe, long offset, int nframes, scm_info_frame *iframes));
static int
-read_frames (dframe, offset, n, iframes)
- scm_debug_frame *dframe;
- long offset;
- int n;
- scm_info_frame *iframes;
+read_frames (scm_debug_frame *dframe,long offset,int n,scm_info_frame *iframes)
{
- int size;
scm_info_frame *iframe = iframes;
scm_debug_info *info;
static SCM applybody = SCM_UNDEFINED;
*(iframe - 1) = *iframe;
--iframe;
}
- size = dframe->status & SCM_MAX_FRAME_SIZE;
info = RELOC_INFO (dframe->info, offset);
if ((info - dframe->vect) & 1)
--info;
&& !SCM_UNBNDP (info[1].a.proc))
{
NEXT_FRAME (iframe, n, quit);
- iframe->flags = SCM_INUM0 | SCM_FRAMEF_PROC;
+ iframe->flags = SCM_UNPACK(SCM_INUM0) | SCM_FRAMEF_PROC;
iframe->proc = info[1].a.proc;
iframe->args = info[1].a.args;
}
{
if (!SCM_UNBNDP (info[1].a.proc))
{
- iframe->flags = SCM_INUM0 | SCM_FRAMEF_PROC;
+ iframe->flags = SCM_UNPACK(SCM_INUM0) | SCM_FRAMEF_PROC;
iframe->proc = info[1].a.proc;
iframe->args = info[1].a.args;
}
else
- iframe->flags = SCM_INUM0;
+ iframe->flags = SCM_UNPACK (SCM_INUM0);
iframe->source = scm_make_memoized (info[0].e.exp,
info[0].e.env);
info -= 2;
NEXT_FRAME (iframe, n, quit);
}
}
- else if (iframe->proc == scm_f_gsubr_apply)
+ else if (SCM_EQ_P (iframe->proc, scm_f_gsubr_apply))
/* Skip gsubr apply frames. */
continue;
else
return iframe - iframes; /* Number of frames actually read */
}
-static void narrow_stack SCM_P ((SCM stack, int inner, SCM inner_key, int outer, SCM outer_key));
+/* Narrow STACK by cutting away stackframes (mutatingly).
+ *
+ * Inner frames (most recent) are cut by advancing the frames pointer.
+ * Outer frames are cut by decreasing the recorded length.
+ *
+ * Cut maximally INNER inner frames and OUTER outer frames using
+ * the keys INNER_KEY and OUTER_KEY.
+ *
+ * Frames are cut away starting at the end points and moving towards
+ * the center of the stack. The key is normally compared to the
+ * operator in application frames. Frames up to and including the key
+ * are cut.
+ *
+ * If INNER_KEY is #t a different scheme is used for inner frames:
+ *
+ * Frames up to but excluding the first source frame originating from
+ * a user module are cut, except for possible application frames
+ * between the user frame and the last system frame previously
+ * encountered.
+ */
static void
-narrow_stack (stack, inner, inner_key, outer, outer_key)
- SCM stack;
- int inner;
- SCM inner_key;
- int outer;
- SCM outer_key;
+narrow_stack (SCM stack,int inner,SCM inner_key,int outer,SCM outer_key)
{
scm_stack *s = SCM_STACK (stack);
int i;
int n = s->length;
/* Cut inner part. */
- for (i = 0; inner; --inner)
- if (s->frames[i++].proc == inner_key)
- break;
+ if (SCM_EQ_P (inner_key, SCM_BOOL_T))
+ /* Cut all frames up to user module code */
+ {
+ for (i = 0; inner; ++i, --inner)
+ {
+ SCM m = s->frames[i].source;
+ if ( SCM_MEMOIZEDP (m)
+ && SCM_NIMP (SCM_MEMOIZED_ENV (m))
+ && SCM_FALSEP (scm_system_module_env_p (SCM_MEMOIZED_ENV (m))))
+ {
+ /* Back up in order to include any non-source frames */
+ while (i > 0
+ && !((m = s->frames[i - 1].source, SCM_MEMOIZEDP (m))
+ || (SCM_NIMP (m = s->frames[i - 1].proc)
+ && SCM_NFALSEP (scm_procedure_p (m))
+ && SCM_NFALSEP (scm_procedure_property
+ (m, scm_sym_system_procedure)))))
+ {
+ --i;
+ ++inner;
+ }
+ break;
+ }
+ }
+ }
+ else
+ /* Use standard cutting procedure. */
+ {
+ for (i = 0; inner; --inner)
+ if (SCM_EQ_P (s->frames[i++].proc, inner_key))
+ break;
+ }
s->frames = &s->frames[i];
n -= i;
/* Cut outer part. */
for (; n && outer; --outer)
- if (s->frames[--n].proc == outer_key)
+ if (SCM_EQ_P (s->frames[--n].proc, outer_key))
break;
s->length = n;
SCM scm_stack_type;
-SCM_PROC (s_stack_p, "stack?", 1, 0, 0, scm_stack_p);
-SCM
-scm_stack_p (obj)
- SCM obj;
+SCM_DEFINE (scm_stack_p, "stack?", 1, 0, 0,
+ (SCM obj),
+ "Return @code{#t} if @var{obj} is a calling stack.")
+#define FUNC_NAME s_scm_stack_p
{
- return SCM_NIMP (obj) && SCM_STACKP (obj) ? SCM_BOOL_T : SCM_BOOL_F;
+ return SCM_BOOL(SCM_STACKP (obj));
}
-
-SCM_PROC (s_make_stack, "make-stack", 0, 0, 1, scm_make_stack);
-SCM
-scm_make_stack (args)
- SCM args;
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_make_stack, "make-stack", 1, 0, 1,
+ (SCM obj, SCM args),
+ "Create a new stack. If @var{obj} is @code{#t}, the current\n"
+ "evaluation stack is used for creating the stack frames,\n"
+ "otherwise the frames are taken from @var{obj} (which must be\n"
+ "either a debug object or a continuation).\n"
+ "@var{args} must be a list of integers and specifies how the\n"
+ "resulting stack will be narrowed.")
+#define FUNC_NAME s_scm_make_stack
{
int n, maxp, size;
- scm_debug_frame *dframe;
+ scm_debug_frame *dframe = scm_last_debug_frame;
scm_info_frame *iframe;
long offset = 0;
SCM stack, id;
- SCM obj, inner_cut, outer_cut;
-
- SCM_ASSERT (SCM_NIMP (args) && SCM_CONSP (args),
- scm_makfrom0str (s_make_stack),
- SCM_WNA,
- NULL);
- obj = SCM_CAR (args);
- args = SCM_CDR (args);
+ SCM inner_cut, outer_cut;
/* Extract a pointer to the innermost frame of whatever object
scm_make_stack was given. */
- if (obj == SCM_BOOL_T)
- dframe = scm_last_debug_frame;
- else
+ /* just use dframe == scm_last_debug_frame
+ (from initialization of dframe, above) if obj is #t */
+ if (!SCM_EQ_P (obj, SCM_BOOL_T))
{
- SCM_ASSERT (SCM_NIMP (obj), obj, SCM_ARG1, s_make_stack);
+ SCM_ASSERT (SCM_NIMP (obj), obj, SCM_ARG1, FUNC_NAME);
if (SCM_DEBUGOBJP (obj))
dframe = (scm_debug_frame *) SCM_DEBUGOBJ_FRAME (obj);
- else if (scm_tc7_contin == SCM_TYP7 (obj))
+ else if (SCM_CONTINUATIONP (obj))
{
- offset = ((SCM_STACKITEM *) (SCM_CHARS (obj) + sizeof (scm_contregs))
+ offset = ((SCM_STACKITEM *) ((char *) SCM_CONTREGS (obj) + sizeof (scm_contregs))
- SCM_BASE (obj));
#ifndef STACK_GROWS_UP
- offset += SCM_LENGTH (obj);
+ offset += SCM_CONTINUATION_LENGTH (obj);
#endif
dframe = RELOC_FRAME (SCM_DFRAME (obj), offset);
}
else
{
- scm_wta (obj, (char *) SCM_ARG1, s_make_stack);
- abort ();
+ SCM_WRONG_TYPE_ARG (SCM_ARG1, obj);
+ /* not reached */
}
}
SCM_STACK (stack) -> length = n;
/* Narrow the stack according to the arguments given to scm_make_stack. */
- while (n > 0 && SCM_NIMP (args) && SCM_CONSP (args))
+ SCM_VALIDATE_REST_ARGUMENT (args);
+ while (n > 0 && !SCM_NULLP (args))
{
inner_cut = SCM_CAR (args);
args = SCM_CDR (args);
- if (SCM_NIMP (args) && SCM_CONSP (args))
+ if (SCM_NULLP (args))
+ {
+ outer_cut = SCM_INUM0;
+ }
+ else
{
outer_cut = SCM_CAR (args);
args = SCM_CDR (args);
}
- else
- outer_cut = SCM_INUM0;
narrow_stack (stack,
SCM_INUMP (inner_cut) ? SCM_INUM (inner_cut) : n,
else
return SCM_BOOL_F;
}
+#undef FUNC_NAME
-SCM_PROC (s_stack_id, "stack-id", 1, 0, 0, scm_stack_id);
-SCM
-scm_stack_id (stack)
- SCM stack;
+SCM_DEFINE (scm_stack_id, "stack-id", 1, 0, 0,
+ (SCM stack),
+ "Return the identifier given to @var{stack} by @code{start-stack}.")
+#define FUNC_NAME s_scm_stack_id
{
scm_debug_frame *dframe;
long offset = 0;
- if (stack == SCM_BOOL_T)
+ if (SCM_EQ_P (stack, SCM_BOOL_T))
dframe = scm_last_debug_frame;
else
{
- SCM_ASSERT (SCM_NIMP (stack), stack, SCM_ARG1, s_make_stack);
+ SCM_VALIDATE_NIM (1,stack);
if (SCM_DEBUGOBJP (stack))
dframe = (scm_debug_frame *) SCM_DEBUGOBJ_FRAME (stack);
- else if (scm_tc7_contin == SCM_TYP7 (stack))
+ else if (SCM_CONTINUATIONP (stack))
{
- offset = ((SCM_STACKITEM *) (SCM_CHARS (stack) + sizeof (scm_contregs))
+ offset = ((SCM_STACKITEM *) ((char *) SCM_CONTREGS (stack) + sizeof (scm_contregs))
- SCM_BASE (stack));
#ifndef STACK_GROWS_UP
- offset += SCM_LENGTH (stack);
+ offset += SCM_CONTINUATION_LENGTH (stack);
#endif
dframe = RELOC_FRAME (SCM_DFRAME (stack), offset);
}
else if (SCM_STACKP (stack))
return SCM_STACK (stack) -> id;
- else scm_wrong_type_arg (s_stack_id, SCM_ARG1, stack);
+ else
+ SCM_WRONG_TYPE_ARG (1, stack);
}
while (dframe && !SCM_VOIDFRAMEP (*dframe))
dframe = RELOC_FRAME (dframe->prev, offset);
return dframe->vect[0].id;
return SCM_BOOL_F;
}
+#undef FUNC_NAME
-SCM_PROC (s_stack_ref, "stack-ref", 2, 0, 0, scm_stack_ref);
-SCM
-scm_stack_ref (stack, i)
- SCM stack;
- SCM i;
+SCM_DEFINE (scm_stack_ref, "stack-ref", 2, 0, 0,
+ (SCM stack, SCM i),
+ "Return the @var{i}'th frame from @var{stack}.")
+#define FUNC_NAME s_scm_stack_ref
{
- SCM_ASSERT (SCM_NIMP (stack)
- && SCM_STACKP (stack),
- stack,
- SCM_ARG1,
- s_stack_ref);
- SCM_ASSERT (SCM_INUMP (i), i, SCM_ARG2, s_stack_ref);
- SCM_ASSERT (SCM_INUM (i) >= 0
- && SCM_INUM (i) < SCM_STACK_LENGTH (stack),
- i,
- SCM_OUTOFRANGE,
- s_stack_ref);
+ SCM_VALIDATE_STACK (1,stack);
+ SCM_VALIDATE_INUM (2,i);
+ SCM_ASSERT_RANGE (1,i,
+ SCM_INUM (i) >= 0 &&
+ SCM_INUM (i) < SCM_STACK_LENGTH (stack));
return scm_cons (stack, i);
}
+#undef FUNC_NAME
-SCM_PROC(s_stack_length, "stack-length", 1, 0, 0, scm_stack_length);
-SCM
-scm_stack_length (stack)
- SCM stack;
+SCM_DEFINE (scm_stack_length, "stack-length", 1, 0, 0,
+ (SCM stack),
+ "Return the length of @var{stack}.")
+#define FUNC_NAME s_scm_stack_length
{
- SCM_ASSERT (SCM_NIMP (stack)
- && SCM_STACKP (stack),
- stack,
- SCM_ARG1,
- s_stack_length);
+ SCM_VALIDATE_STACK (1,stack);
return SCM_MAKINUM (SCM_STACK_LENGTH (stack));
}
+#undef FUNC_NAME
/* Frames
*/
-SCM_PROC (s_frame_p, "frame?", 1, 0, 0, scm_frame_p);
-SCM
-scm_frame_p (obj)
- SCM obj;
+SCM_DEFINE (scm_frame_p, "frame?", 1, 0, 0,
+ (SCM obj),
+ "Return @code{#t} if @var{obj} is a stack frame.")
+#define FUNC_NAME s_scm_frame_p
{
- return SCM_NIMP (obj) && SCM_FRAMEP (obj);
+ return SCM_BOOL(SCM_FRAMEP (obj));
}
-
-SCM_PROC(s_last_stack_frame, "last-stack-frame", 1, 0, 0, scm_last_stack_frame);
-SCM
-scm_last_stack_frame (obj)
- SCM obj;
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_last_stack_frame, "last-stack-frame", 1, 0, 0,
+ (SCM obj),
+ "Return a stack which consists of a single frame, which is the\n"
+ "last stack frame for @var{obj}. @var{obj} must be either a\n"
+ "debug object or a continuation.")
+#define FUNC_NAME s_scm_last_stack_frame
{
scm_debug_frame *dframe;
long offset = 0;
SCM stack;
- SCM_ASSERT (SCM_NIMP (obj), obj, SCM_ARG1, s_last_stack_frame);
+ SCM_VALIDATE_NIM (1,obj);
if (SCM_DEBUGOBJP (obj))
dframe = (scm_debug_frame *) SCM_DEBUGOBJ_FRAME (obj);
- else if (scm_tc7_contin == SCM_TYP7 (obj))
+ else if (SCM_CONTINUATIONP (obj))
{
- offset = ((SCM_STACKITEM *) (SCM_CHARS (obj) + sizeof (scm_contregs))
+ offset = ((SCM_STACKITEM *) ((char *) SCM_CONTREGS (obj) + sizeof (scm_contregs))
- SCM_BASE (obj));
#ifndef STACK_GROWS_UP
- offset += SCM_LENGTH (obj);
+ offset += SCM_CONTINUATION_LENGTH (obj);
#endif
dframe = RELOC_FRAME (SCM_DFRAME (obj), offset);
}
else
{
- scm_wta (obj, (char *) SCM_ARG1, s_last_stack_frame);
- abort ();
+ SCM_WRONG_TYPE_ARG (1, obj);
+ /* not reached */
}
if (!dframe || SCM_VOIDFRAMEP (*dframe))
return scm_cons (stack, SCM_INUM0);;
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_number, "frame-number", 1, 0, 0, scm_frame_number);
-SCM
-scm_frame_number (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_number, "frame-number", 1, 0, 0,
+ (SCM frame),
+ "Return the frame number of @var{frame}.")
+#define FUNC_NAME s_scm_frame_number
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_number);
+ SCM_VALIDATE_FRAME (1,frame);
return SCM_MAKINUM (SCM_FRAME_NUMBER (frame));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_source, "frame-source", 1, 0, 0, scm_frame_source);
-SCM
-scm_frame_source (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_source, "frame-source", 1, 0, 0,
+ (SCM frame),
+ "Return the source of @var{frame}.")
+#define FUNC_NAME s_scm_frame_source
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_source);
+ SCM_VALIDATE_FRAME (1,frame);
return SCM_FRAME_SOURCE (frame);
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_procedure, "frame-procedure", 1, 0, 0, scm_frame_procedure);
-SCM
-scm_frame_procedure (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_procedure, "frame-procedure", 1, 0, 0,
+ (SCM frame),
+ "Return the procedure for @var{frame}, or @code{#f} if no\n"
+ "procedure is associated with @var{frame}.")
+#define FUNC_NAME s_scm_frame_procedure
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_procedure);
+ SCM_VALIDATE_FRAME (1,frame);
return (SCM_FRAME_PROC_P (frame)
? SCM_FRAME_PROC (frame)
: SCM_BOOL_F);
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_arguments, "frame-arguments", 1, 0, 0, scm_frame_arguments);
-SCM
-scm_frame_arguments (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_arguments, "frame-arguments", 1, 0, 0,
+ (SCM frame),
+ "Return the arguments of @var{frame}.")
+#define FUNC_NAME s_scm_frame_arguments
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_arguments);
+ SCM_VALIDATE_FRAME (1,frame);
return SCM_FRAME_ARGS (frame);
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_previous, "frame-previous", 1, 0, 0, scm_frame_previous);
-SCM
-scm_frame_previous (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_previous, "frame-previous", 1, 0, 0,
+ (SCM frame),
+ "Return the previous frame of @var{frame}, or @code{#f} if\n"
+ "@var{frame} is the first frame in its stack.")
+#define FUNC_NAME s_scm_frame_previous
{
int n;
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_previous);
+ SCM_VALIDATE_FRAME (1,frame);
n = SCM_INUM (SCM_CDR (frame)) + 1;
if (n >= SCM_STACK_LENGTH (SCM_CAR (frame)))
return SCM_BOOL_F;
else
return scm_cons (SCM_CAR (frame), SCM_MAKINUM (n));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_next, "frame-next", 1, 0, 0, scm_frame_next);
-SCM
-scm_frame_next (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_next, "frame-next", 1, 0, 0,
+ (SCM frame),
+ "Return the next frame of @var{frame}, or @code{#f} if\n"
+ "@var{frame} is the last frame in its stack.")
+#define FUNC_NAME s_scm_frame_next
{
int n;
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_next);
+ SCM_VALIDATE_FRAME (1,frame);
n = SCM_INUM (SCM_CDR (frame)) - 1;
if (n < 0)
return SCM_BOOL_F;
else
return scm_cons (SCM_CAR (frame), SCM_MAKINUM (n));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_real_p, "frame-real?", 1, 0, 0, scm_frame_real_p);
-SCM
-scm_frame_real_p (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_real_p, "frame-real?", 1, 0, 0,
+ (SCM frame),
+ "Return @code{#t} if @var{frame} is a real frame.")
+#define FUNC_NAME s_scm_frame_real_p
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_real_p);
- return SCM_FRAME_REAL_P (frame) ? SCM_BOOL_T : SCM_BOOL_F;
+ SCM_VALIDATE_FRAME (1,frame);
+ return SCM_BOOL(SCM_FRAME_REAL_P (frame));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_procedure_p, "frame-procedure?", 1, 0, 0, scm_frame_procedure_p);
-SCM
-scm_frame_procedure_p (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_procedure_p, "frame-procedure?", 1, 0, 0,
+ (SCM frame),
+ "Return @code{#t} if a procedure is associated with @var{frame}.")
+#define FUNC_NAME s_scm_frame_procedure_p
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_procedure_p);
- return SCM_FRAME_PROC_P (frame) ? SCM_BOOL_T : SCM_BOOL_F;
+ SCM_VALIDATE_FRAME (1,frame);
+ return SCM_BOOL(SCM_FRAME_PROC_P (frame));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_evaluating_args_p, "frame-evaluating-args?", 1, 0, 0, scm_frame_evaluating_args_p);
-SCM
-scm_frame_evaluating_args_p (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_evaluating_args_p, "frame-evaluating-args?", 1, 0, 0,
+ (SCM frame),
+ "Return @code{#t} if @var{frame} contains evaluated arguments.")
+#define FUNC_NAME s_scm_frame_evaluating_args_p
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_evaluating_args_p);
- return SCM_FRAME_EVAL_ARGS_P (frame) ? SCM_BOOL_T : SCM_BOOL_F;
+ SCM_VALIDATE_FRAME (1,frame);
+ return SCM_BOOL(SCM_FRAME_EVAL_ARGS_P (frame));
}
+#undef FUNC_NAME
-SCM_PROC(s_frame_overflow_p, "frame-overflow?", 1, 0, 0, scm_frame_overflow_p);
-SCM
-scm_frame_overflow_p (frame)
- SCM frame;
+SCM_DEFINE (scm_frame_overflow_p, "frame-overflow?", 1, 0, 0,
+ (SCM frame),
+ "Return @code{#t} if @var{frame} is an overflow frame.")
+#define FUNC_NAME s_scm_frame_overflow_p
{
- SCM_ASSERT (SCM_NIMP (frame) && SCM_FRAMEP (frame),
- frame,
- SCM_ARG1,
- s_frame_overflow_p);
- return SCM_FRAME_OVERFLOW_P (frame) ? SCM_BOOL_T : SCM_BOOL_F;
+ SCM_VALIDATE_FRAME (1,frame);
+ return SCM_BOOL(SCM_FRAME_OVERFLOW_P (frame));
}
+#undef FUNC_NAME
\f
scm_init_stacks ()
{
SCM vtable;
- SCM vtable_layout = scm_make_struct_layout (scm_nullstr);
SCM stack_layout
= scm_make_struct_layout (scm_makfrom0str (SCM_STACK_LAYOUT));
- vtable = scm_make_vtable_vtable (vtable_layout, SCM_INUM0, SCM_EOL);
+ vtable = scm_make_vtable_vtable (scm_nullstr, SCM_INUM0, SCM_EOL);
scm_stack_type
= scm_permanent_object (scm_make_struct (vtable, SCM_INUM0,
scm_cons (stack_layout,
SCM_EOL)));
-#include "stacks.x"
+ scm_set_struct_vtable_name_x (scm_stack_type, scm_str2symbol ("stack"));
+#ifndef SCM_MAGIC_SNARFER
+#include "libguile/stacks.x"
+#endif
}
+
+/*
+ Local Variables:
+ c-file-style: "gnu"
+ End:
+*/