From: nobu.nakada@... Date: 2002-08-02T16:28:10+09:00 Subject: [ruby-dev:17886] line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) なかだです。 At Sat, 27 Jul 2002 01:37:14 +0900, Yukihiro Matsumoto wrote: > |直接関係ないんですが、ruby_sourcelineを見て思い出しました。しば > |らく前にruby-talk(かruby-bugs?)でなにかのとき(例外?)に行番号が > |正しくないという話が出てましたが、どうしましょうか。たぶんこん > |なものだったはず。 > > むう、いかにもad hocで好みではない修正ですねえ。 > parse.yをいじってNODE_NEWLINEの具合を調整するべきでしょうか。 ad hocなのは確かですが、これ以外にも $ ruby -e 'hoge.. 1' -:2: undefined local variable or method `hoge' for # (NameError) という風に行が正しくない場合はかなりあります。もしこれをすべて NODE_NEWLINEを付与するようにすると、ノード数が倍近くになること になりそうな気がします。 実際の行と異なるところにだけNODE_NEWLINEを加えるようにするとい うことも考えられますが、結構面倒そうなので、逆にすべてのノード でnd_line()からセットするようにしてしまうとか。 > でも、まあ、このインタプリタにあまり手をかけてもしょうがない > ので、ad hocでも良いのかなあ。 気分はもうRite? Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.308 diff -u -2 -p -r1.308 eval.c --- eval.c 31 Jul 2002 05:18:43 -0000 1.308 +++ eval.c 2 Aug 2002 03:21:51 -0000 @@ -2210,4 +2210,5 @@ rb_eval(self, n) if (!node) RETURN(Qnil); + ruby_sourceline = nd_line(node); switch (nd_type(node)) { case NODE_BLOCK: @@ -2295,5 +2296,4 @@ rb_eval(self, n) case NODE_IF: - ruby_sourceline = nd_line(node); if (trace_func) { call_trace_func("line", node->nd_file, ruby_sourceline, self, @@ -2398,5 +2398,4 @@ rb_eval(self, n) switch (state = EXEC_TAG()) { case 0: - ruby_sourceline = nd_line(node); if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond))) goto while_out; @@ -2431,5 +2430,4 @@ rb_eval(self, n) switch (state = EXEC_TAG()) { case 0: - ruby_sourceline = nd_line(node); if (node->nd_state && RTEST(rb_eval(self, node->nd_cond))) goto until_out; @@ -3076,5 +3074,4 @@ rb_eval(self, n) case NODE_EVSTR: - ruby_sourceline = nd_line(node); result = rb_obj_as_string(rb_eval(self, node->nd_body)); break; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦