なかだです。

At Sun, 22 Sep 2002 22:05:02 +0900,
Nobuyoshi-Nakada wrote:
> > コミットしてください。で、call_trace_funcの中で
> > ruby_in_compileを見た方が良いですか?
> 
> 入れました。

すいません、ダメダメでした。callerがおかしくなります。ad hocで
すが、とりあえずtracingを使ってみました。


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.333 diff -u -2 -p -r1.333 eval.c --- eval.c 22 Sep 2002 12:52:18 -0000 1.333 +++ eval.c 23 Sep 2002 07:47:22 -0000 @@ -888,4 +888,6 @@ static VALUE trace_func = 0; static int tracing = 0; static void call_trace_func _((char*,NODE*,VALUE,ID,VALUE)); +#define ENABLE_TRACE() (tracing &= ~2) +#define DISABLE_TRACE() (tracing |= 2) #define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \ @@ -4502,19 +4504,19 @@ rb_call0(klass, recv, id, oid, argc, arg if (trace_func) { int state; - NODE *volatile node = ruby_current_node; + volatile old_tracing = tracing; call_trace_func("c-call", ruby_current_node, recv, id, klass); - ruby_current_node = 0; PUSH_TAG(PROT_FUNC); + DISABLE_TRACE(); if ((state = EXEC_TAG()) == 0) { result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); } POP_TAG(); - ruby_current_node = node; + tracing = old_tracing; + ruby_current_node = ruby_frame->node; call_trace_func("c-return", ruby_current_node, recv, id, klass); if (state) JUMP_TAG(state); } else { - ruby_current_node = 0; result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); } @@ -4974,4 +4976,5 @@ eval(self, src, scope, file, line) NODE *nodesave = ruby_current_node; volatile int iter = ruby_frame->iter; + volatile int old_tracing = tracing; int state; @@ -5036,4 +5039,5 @@ eval(self, src, scope, file, line) } if (!NIL_P(result)) ruby_errinfo = result; + ENABLE_TRACE(); result = eval_node(self, node); } @@ -5077,4 +5081,5 @@ eval(self, src, scope, file, line) ruby_current_node = nodesave; ruby_set_current_source(); + tracing = old_tracing; if (state) { if (state == TAG_RAISE) { @@ -5310,4 +5315,5 @@ rb_load(fname, wrap) volatile VALUE wrapper = 0; volatile VALUE self = ruby_top_self; + volatile int old_tracing = tracing; NODE *saved_cref = ruby_cref; TMP_PROTECT; @@ -5363,4 +5369,5 @@ rb_load(fname, wrap) ALLOW_INTS; if (ruby_nerrs == 0) { + ENABLE_TRACE(); eval_node(self, node); } @@ -5378,4 +5385,5 @@ rb_load(fname, wrap) POP_VARS(); ruby_wrapper = wrapper; + tracing = old_tracing; if (ruby_nerrs > 0) { ruby_nerrs = 0;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦