From db2d654347e06fe7e40a498eee02e523936f4a53 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 17 Mar 2017 06:47:48 -0700 Subject: trace: implement redefinition checks. The tracing module should warn when traced functions or methods are being redefined, and stop tracing the original methods. * eval.c (trace_check): New function. Calls sys:trace-redefined-check if the trace module has been loaded, otherwise does nothing. (op_defun, op_defmacro): Call trace_check to have a warning issued for a redefined traced function or macro. * eval.h (trace_check): Declared. * lisplib.c (trace_loaded): New global variable. (trace_instantiate): Flip trace_loaded to t. * lisplib.h (trace_loaded): Declared. * share/txr/stdlib/trace.tl (sys:trace-redefine-check): New function. Checks two situations: traced function or method is redefined (neither old nor new is traced any longer), and traced method is overridden (base method continues to be traced, override is not traced). * struct.c (static_slot_ensure): Do a trace check here, taking care of defmeth. --- struct.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'struct.c') diff --git a/struct.c b/struct.c index a4e9eb8f..bd9644be 100644 --- a/struct.c +++ b/struct.c @@ -1123,6 +1123,12 @@ val static_slot_ensure(val stype, val sym, val newval, val no_error_p) uw_throwf(error_s, lit("~a: ~s isn't a valid slot name"), self, sym, nao); + if (trace_loaded) { + struct struct_type *st = stype_handle(&stype, self); + val name = list(meth_s, st->name, sym, nao); + trace_check(name); + } + no_error_p = default_bool_arg(no_error_p); return static_slot_ens_rec(stype, sym, newval, no_error_p, self, 0); } -- cgit v1.2.3