From 31c42db88657d05b1f1347beeb6f4db53cf134bb Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 28 Aug 2019 07:19:34 -0700 Subject: trace: bug: redef of traced method resurrects old. When a method which is traced is redefined, a warning message is correctly issued and the trace is removed. But the removal is done in the wrong order and ends up restoring the old function, clobbering the new definition. * struct.c (static_slot_ensure): Move the trace_check before the call to static_slot_ens_rec, so installation of the new method takes place after the trace is removed from the old one. --- struct.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'struct.c') diff --git a/struct.c b/struct.c index 604ba041..693c20dc 100644 --- a/struct.c +++ b/struct.c @@ -1246,15 +1246,15 @@ 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); - no_error_p = default_null_arg(no_error_p); - res = static_slot_ens_rec(stype, sym, newval, no_error_p, self, 0); - 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_null_arg(no_error_p); + res = static_slot_ens_rec(stype, sym, newval, no_error_p, self, 0); + return res; } -- cgit v1.2.3