From 1232f5dbf8e68f9c3a7fe77360c0b950ecff3eac Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 13 Nov 2011 21:19:43 -0800 Subject: 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. --- unwind.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'unwind.h') 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, ...); -- cgit v1.2.3