From c7ecd529c038102e964af4fdf353e0007fde0990 Mon Sep 17 00:00:00 2001 From: Mikael Djurfeldt Date: Tue, 20 Aug 1996 17:08:53 +0000 Subject: [PATCH] * debug.h: New file: low-level debugging support. * libguile.h: Conditionally include debug.h --- libguile/debug.h | 170 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 libguile/debug.h diff --git a/libguile/debug.h b/libguile/debug.h new file mode 100644 index 000000000..8796b0dc1 --- /dev/null +++ b/libguile/debug.h @@ -0,0 +1,170 @@ +/* classes: h_files */ + +#ifndef DEBUGH +#define DEBUGH +/* Copyright (C) 1995,1996 Mikael Djurfeldt + * + * 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 Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * As a special exception, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + * The author can be reached at djurfeldt@nada.kth.se + * Mikael Djurfeldt, SANS/NADA KTH, 10044 STOCKHOLM, SWEDEN + */ + + +#include "options.h" +#include "__scm.h" + + + +/* + * Here comes some definitions for the debugging machinery. + * It might seem strange to represent debug flags as ints, + * but consider that any particular piece of code is normally + * only interested in one flag at a time. This is then + * the most efficient representation. + */ + +/* {Options} + */ + +extern scm_option scm_debug_opts[]; + +#define RECORD_PROCNAMES scm_debug_opts[0].val +#define DEBUG_EVAL scm_debug_opts[1].val +#define BREAKPOINTS scm_debug_opts[2].val +#define TRACE scm_debug_opts[3].val +#define BACKTRACE scm_debug_opts[4].val +#define BACKTRACE_DEPTH scm_debug_opts[5].val +#define FRAMES scm_debug_opts[6].val +#define CHEAPTRAPS scm_debug_opts[7].val +#define N_DEBUG_OPTIONS 8 + +extern scm_option scm_evaluator_trap_table[]; + +#define ENTER_FRAME scm_evaluator_trap_table[0].val +#define APPLY_FRAME scm_evaluator_trap_table[1].val +#define EXIT_FRAME scm_evaluator_trap_table[2].val +#define N_EVALUATOR_TRAPS 3 + +#ifdef __STDC__ +extern SCM (*scm_ceval_ptr) (SCM exp, SCM env); +#else +extern SCM (*scm_ceval_ptr) (); +#endif +extern int debug_mode, check_entry, check_apply, check_exit; + +#define CHECK_ENTRY check_entry +#define CHECK_APPLY check_apply +#define CHECK_EXIT check_exit + +#define RESET_DEBUG_MODE \ +{\ + if (ENTER_FRAME || BREAKPOINTS) CHECK_ENTRY = 1;\ + if (APPLY_FRAME || TRACE) CHECK_APPLY = 1;\ + if (EXIT_FRAME || TRACE) CHECK_EXIT = 1;\ + debug_mode = DEBUG_EVAL || BACKTRACE || CHECK_ENTRY || CHECK_APPLY || CHECK_EXIT;\ + scm_ceval_ptr = debug_mode ? scm_deval : scm_ceval;\ +} + + +/* {Evaluator} + */ + +typedef union scm_debug_info +{ + struct { SCM exp, env; } e; + struct { SCM proc, args; } a; +} scm_debug_info; + +extern int scm_debug_eframe_size; + +typedef struct scm_debug_frame +{ + struct scm_debug_frame *prev; + long status; + scm_debug_info vect[1]; +} scm_debug_frame; + +extern scm_debug_frame *last_debug_info_frame; + +#define TAILREC (1L << 10) +#define TRACEDFRAME (1L << 9) +#define APPLYFRAME (1L << 8) +#define ARGSREADY (1L << 7) +#define DOVERFLOW (1L << 6) +#define MAXFRAMESIZE 63 /* also used as a mask for the size field */ + +#define EVALFRAMEP(x) (((x).status & APPLYFRAME) == 0) +#define APPLYFRAMEP(x) (((x).status & APPLYFRAME) != 0) +#define OVERFLOWP(x) (((x).status & DOVERFLOW) != 0) +#define ARGSREADYP(x) (((x).status & ARGSREADY) != 0) +#define TRACEDFRAMEP(x) (((x).status & TRACEDFRAME) != 0) +#define TAILRECP(x) (((x).status & TAILREC) != 0) +#define SETOVERFLOW(x) ((x).status |= DOVERFLOW) +#define SETARGSREADY(x) ((x).status |= ARGSREADY) +#define CLEARARGSREADY(x) ((x).status &= ~ARGSREADY) +#define SETTRACEDFRAME(x) ((x).status |= TRACEDFRAME) +#define CLEARTRACEDFRAME(x) ((x).status &= ~TRACEDFRAME) +#define SETTAILREC(x) ((x).status |= TAILREC) + +#define DEBUGGINGP debug_mode +#define DSIDEVAL(x, env) if NIMP(x) scm_deval((x), (env)) + +/* {Memoized Source} + */ + +extern long scm_tc16_memoized; + +#define SCM_MEMOIZEDP(x) (scm_tc16_memoized == SCM_TYP16 (x)) +#define SCM_MEMOEXP(x) SCM_CAR (SCM_CDR (x)) +#define SCM_MEMOENV(x) SCM_CDR (SCM_CDR (x)) + + + +#ifdef __STDC__ +extern SCM scm_unmemoize (SCM memoized); +extern SCM scm_make_debugobj (scm_debug_frame* debug); +extern void scm_init_debug (void); +#else +extern SCM scm_unmemoize (); +extern SCM scm_make_debugobj (); +extern void scm_init_debug (); +#endif + +#endif /* DEBUGH */ -- 2.20.1