From: nobu.nakada@... Date: 2002-08-12T19:45:52+09:00 Subject: [ruby-dev:17979] Re: line number(Re: Re: [ruby-cvs] ruby: * random.c: replace with Mersenne Twister RNG.) なかだです。 At Mon, 12 Aug 2002 10:08:25 +0900, Yukihiro Matsumoto wrote: > |一応[ruby-dev:17886]をコミットしてみたものの、やはり遅くなった > |ので(2002-08-06比1〜2%)、これを試してみました。2002-08-11版より > |は速いものの、やっぱりやや遅いです。ちょうど中間くらい。 > > そりゃそうでしょうねえ。遅かったから今のようになっているわけ > ですし。このパッチで心配なのは動かなくなる拡張ライブラリとか > あるんじゃないかってことですが、どうなんでしょう? ruby_frameを直接見てるようなものはダメでしょうが、さすがにそこ までは。 NODE_CFUNCと代入で正しくセットされてなかったので、追加のパッチ です。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.311.100.1 retrieving revision 1.311.100.2 diff -u -2 -p -r1.311.100.1 -r1.311.100.2 --- eval.c 12 Aug 2002 09:18:48 -0000 1.311.100.1 +++ eval.c 12 Aug 2002 09:35:58 -0000 1.311.100.2 @@ -898,4 +898,7 @@ static int tracing = 0; static void call_trace_func _((char*,NODE*,VALUE,ID,VALUE)); +#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \ + ruby_sourceline = nd_line(ruby_current_node)) + void ruby_set_current_source() @@ -2212,4 +2215,5 @@ rb_eval(self, n) NODE *n; { + NODE *old = ruby_current_node; NODE * volatile node = n; int state; @@ -2492,4 +2496,5 @@ rb_eval(self, n) END_CALLARGS; ruby_current_node = node; + SET_CURRENT_SOURCE(); result = rb_call(CLASS_OF(recv),recv,each,0,0,0); } @@ -2570,4 +2575,5 @@ rb_eval(self, n) result = Qundef; /* no arg */ } + SET_CURRENT_SOURCE(); result = rb_yield_0(result, 0, 0, 0); break; @@ -2739,4 +2745,5 @@ rb_eval(self, n) END_CALLARGS; + SET_CURRENT_SOURCE(); result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0); } @@ -2752,4 +2759,5 @@ rb_eval(self, n) END_CALLARGS; + SET_CURRENT_SOURCE(); result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1); } @@ -2757,4 +2765,5 @@ rb_eval(self, n) case NODE_VCALL: + SET_CURRENT_SOURCE(); result = rb_call(CLASS_OF(self),self,node->nd_mid,0,0,2); break; @@ -2787,4 +2796,5 @@ rb_eval(self, n) PUSH_ITER(ruby_iter->iter?ITER_PRE:ITER_NOT); + SET_CURRENT_SOURCE(); result = rb_call(RCLASS(ruby_frame->last_class)->super, ruby_frame->self, ruby_frame->orig_func, @@ -3001,9 +3011,10 @@ rb_eval(self, n) case T_CLASS: case T_MODULE: + result = rb_const_get(klass, node->nd_mid); break; default: - return rb_funcall(klass, node->nd_mid, 0, 0); + result = rb_funcall(klass, node->nd_mid, 0, 0); + break; } - result = rb_const_get(klass, node->nd_mid); } break; @@ -3404,4 +3415,5 @@ rb_eval(self, n) finish: CHECK_INTS; + ruby_current_node = old; return result; } @@ -3958,4 +3970,5 @@ assign(self, lhs, val, pcall) int pcall; { + ruby_current_node = lhs; if (val == Qundef) { rb_warning("assigning void value"); @@ -4010,4 +4023,6 @@ assign(self, lhs, val, pcall) if (!lhs->nd_args) { /* attr set */ + ruby_current_node = lhs; + SET_CURRENT_SOURCE(); rb_call(CLASS_OF(recv), recv, lhs->nd_mid, 1, &val, 0); } @@ -4018,4 +4033,6 @@ assign(self, lhs, val, pcall) args = rb_eval(self, lhs->nd_args); rb_ary_push(args, val); + ruby_current_node = lhs; + SET_CURRENT_SOURCE(); rb_call(CLASS_OF(recv), recv, lhs->nd_mid, RARRAY(args)->len, RARRAY(args)->ptr, 0); Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.204.100.1 retrieving revision 1.204.100.2 diff -u -2 -p -r1.204.100.1 -r1.204.100.2 --- parse.y 12 Aug 2002 08:53:58 -0000 1.204.100.1 +++ parse.y 12 Aug 2002 09:15:18 -0000 1.204.100.2 @@ -476,5 +476,4 @@ stmt : kALIAS fitem {lex_state = EXPR_F $$->nd_value = call_op(gettable(vid),$2,1,$3); } - fixpos($$, $3); } else { @@ -843,5 +842,4 @@ arg : lhs '=' arg $$->nd_value = call_op(gettable(vid),$2,1,$3); } - fixpos($$, $3); } else { @@ -4742,5 +4740,4 @@ node_assign(lhs, rhs) } - if (rhs) fixpos(lhs, rhs); return lhs; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦