summaryrefslogtreecommitdiffstats
path: root/unwind.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-11-13 21:19:43 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-11-13 21:19:43 -0800
commit1232f5dbf8e68f9c3a7fe77360c0b950ecff3eac (patch)
tree18cb4ab7caf1d2b42139f98c80691e641a76efdd /unwind.h
parentcc0f30f375914382e9e94e5bba26b14b2a734499 (diff)
downloadtxr-1232f5dbf8e68f9c3a7fe77360c0b950ecff3eac.tar.gz
txr-1232f5dbf8e68f9c3a7fe77360c0b950ecff3eac.tar.bz2
txr-1232f5dbf8e68f9c3a7fe77360c0b950ecff3eac.zip
Adding a debugger. This is an experimental prototype.
* Makefile (OBJS): New object file debug.o. * dep.mk: Updated. * match.c (h_fun): Use debug_begin and debug_end macros to set up a debug frame for backtracing. (match_line, match_files): Call debug_check to give debugger a chance to instrument call. (v_fun): Use debug_begin and debug_end macros to set up a debug frame for backtracing. Call debug_check to give debugger a chance to instrument call. * stream.c (struct strm_ops): New function pointer, flush. (stdio_maybe_write_error): Wrong word in error message corrected. (stdio_flush): New static function. (stdio_ops, pipe_ops): New function entered into tables. (flush_stream): New function. * stream.h (flush_stream): Declared. * txr.c (help): New options documented. (main): call to debug_init added. New debug options parsed and opt_debugger set accordingly. * unwind.c (uw_push_debug, uw_current_frame): New function. * unwind.h (uw_frtype): New enumeration member UW_DBG. (struct uw_debug): New frame variant. (union uw_frame): New member, db. (uw_push_debug, uw_current_frame): Declared, * debug.c: New file. * debug.h: New file.
Diffstat (limited to 'unwind.h')
-rw-r--r--unwind.h19
1 files changed, 18 insertions, 1 deletions
diff --git a/unwind.h b/unwind.h
index a09df613..1ccdbaee 100644
--- a/unwind.h
+++ b/unwind.h
@@ -31,7 +31,7 @@
#endif
typedef union uw_frame uw_frame_t;
-typedef enum uw_frtype { UW_BLOCK, UW_ENV, UW_CATCH } uw_frtype_t;
+typedef enum uw_frtype { UW_BLOCK, UW_ENV, UW_CATCH, UW_DBG } uw_frtype_t;
struct uw_common {
uw_frame_t *up;
@@ -65,11 +65,24 @@ struct uw_catch {
jmp_buf jb;
};
+struct uw_debug {
+ uw_frame_t *up;
+ uw_frtype_t type;
+ val func;
+ val args;
+ val ub_p_a_pairs;
+ val bindings;
+ val data;
+ val line;
+ val chr;
+};
+
union uw_frame {
struct uw_common uw;
struct uw_block bl;
struct uw_dynamic_env ev;
struct uw_catch ca;
+ struct uw_debug db;
};
void uw_push_block(uw_frame_t *, val tag);
@@ -86,7 +99,11 @@ noreturn val uw_errorf(val fmt, ...);
val uw_register_subtype(val sub, val super);
val uw_exception_subtype_p(val sub, val sup);
void uw_continue(uw_frame_t *curr, uw_frame_t *target);
+void uw_push_debug(uw_frame_t *, val func, val args,
+ val ub_p_a_pairs, val bindings, val data,
+ val line, val chr);
void uw_pop_frame(uw_frame_t *);
+uw_frame_t *uw_current_frame(void);
void uw_init(void);
noreturn val type_mismatch(val, ...);