From: nobu.nakada@... Date: 2002-09-22T20:53:59+09:00 Subject: [ruby-dev:18352] Re: source file name at -r option なかだです。 At Sat, 24 Aug 2002 17:27:45 +0900, Nobuyoshi-Nakada wrote: > それと、rb_require()を呼ぶ前にruby_sourcefileを0にしているため > に、ライブラリが見付からないときのメッセージがちょっとおかしく > なっている気がします。 これは、-rが複数あるときを考えてないというのは明らかなバグなん ですが、他にもいくつか問題がありました。 1) ruby自体をフルパスで指定したときに、tracer.rbでruby自身の実 行ファイルが読まれてバイナリが出力されてしまう 2) rb_str_new()などもString.allocateを介するようになったために、 コンパイルの最中に大量のトレースが発生する 3) c-funcの呼び出し中にも同様 1と2に関しては、たぶんコンパイル中はトレースを呼び出さないよう にしたほうがいいんじゃないか、と思うんですが。 3はちと微妙ですが、おそらくc-funcの最中に不用意にコンテキストス イッチなどが起きてしまうのは、まずいこともありそうな気がします。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.332 diff -u -2 -p -r1.332 eval.c --- eval.c 21 Sep 2002 13:30:00 -0000 1.332 +++ eval.c 22 Sep 2002 09:55:12 -0000 @@ -896,6 +896,5 @@ ruby_set_current_source() { if (ruby_current_node) { - ruby_sourcefile = ruby_current_node->nd_file; - ruby_sourceline = nd_line(ruby_current_node); + SET_CURRENT_SOURCE(); } } @@ -2065,5 +2064,5 @@ call_trace_func(event, node, self, id, k node_save[0] = ruby_last_node; if (!(node_save[1] = ruby_current_node)) { - node_save[1] = NEW_NEWLINE(0); + return; } tracing = 1; @@ -4502,6 +4501,8 @@ rb_call0(klass, recv, id, oid, argc, arg if (trace_func) { int state; + NODE *volatile node = ruby_current_node; call_trace_func("c-call", ruby_current_node, recv, id, klass); + ruby_current_node = 0; PUSH_TAG(PROT_FUNC); if ((state = EXEC_TAG()) == 0) { @@ -4509,8 +4510,10 @@ rb_call0(klass, recv, id, oid, argc, arg } POP_TAG(); + ruby_current_node = 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); } Index: ruby.c =================================================================== RCS file: /cvs/ruby/src/ruby/ruby.c,v retrieving revision 1.66 diff -u -2 -p -r1.66 ruby.c --- ruby.c 2 Sep 2002 12:19:30 -0000 1.66 +++ ruby.c 22 Sep 2002 07:48:02 -0000 @@ -322,4 +322,5 @@ require_libraries() req_list_last = 0; while (list) { + ruby_current_node = 0; rb_require(list->name); tmp = list->next; @@ -327,12 +328,12 @@ require_libraries() free(list); list = tmp; + ruby_current_node = save[2]; + ruby_set_current_source(); } req_list_head.next = 0; ruby_eval_tree = save[0]; ruby_eval_tree_begin = save[1]; - ruby_current_node = save[2]; - ruby_set_current_source(); - ruby_current_node = 0; rb_gc_force_recycle((VALUE)save[2]); + ruby_current_node = 0; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦