From: "NAKAMURA, Hiroshi" Date: 2002-11-14T10:50:15+09:00 Subject: [ruby-dev:18776] Re: Different caller(0) in trace_func when NameError from toplevel between 1.6 and 1.7 なひです。 > From: > Sent: Wednesday, November 13, 2002 1:02 PM この件(および若干の追加)のまとめです。全部1.7のみです。 ・トップレベルでNameErrorを起こしたときにruby_frameの nodeが空になるのを修正。 ・begin、procによるブロックの位置を、begin、do、{がある 行にする(1.6ではブロック内の最後のline、1.7現状は ブロック内の最初のline)。 ・Proc#to_sの修正 です。最後のはなひはよくわかってないかも。 patchは全部中田さんによるものです。^^; Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.351 diff -u -2 -p -r1.351 eval.c --- eval.c 9 Nov 2002 02:52:55 -0000 1.351 +++ eval.c 13 Nov 2002 23:27:38 -0000 @@ -2101,4 +2101,6 @@ call_trace_func(event, node, self, id, k if (node) { ruby_current_node = node; + ruby_frame->node = node; ruby_sourcefile = node->nd_file; ruby_sourceline = nd_line(node); @@ -6684,4 +6710,5 @@ proc_to_s(self, other) { struct BLOCK *data; + NODE *node; char *cname = rb_class2name(CLASS_OF(self)); const int w = (SIZEOF_LONG * CHAR_BIT) / 4; @@ -6690,9 +6717,9 @@ proc_to_s(self, other) Data_Get_Struct(self, struct BLOCK, data); - if (data->body) { - len += strlen(data->body->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3; + if ((node = data->frame.node) || (node = data->body)) { + len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3; str = rb_str_new(0, len); sprintf(RSTRING(str)->ptr, "#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->tag, - data->body->nd_file, nd_line(data->body)); + node->nd_file, nd_line(node)); } else { Index: parse.y =================================================================== RCS file: /src/ruby/parse.y,v retrieving revision 1.226 diff -u -2 -p -r1.226 parse.y --- parse.y 7 Nov 2002 23:01:45 -0000 1.226 +++ parse.y 13 Nov 2002 23:27:40 -0000 @@ -1302,8 +1302,12 @@ primary : literal } | kBEGIN + { + $1 = ruby_sourceline; + } bodystmt kEND { - $$ = NEW_BEGIN($2); + $$ = NEW_BEGIN($3); + nd_set_line($$, $1); } | tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} ')' @@ -1589,4 +1593,5 @@ do_block : kDO_BLOCK { $$ = dyna_push(); + $1 = ruby_sourceline; } opt_block_var @@ -1595,8 +1600,12 @@ do_block : kDO_BLOCK { $$ = NEW_ITER($3, 0, $4); - fixpos($$, $3?$3:$4); + nd_set_line($$, $1); dyna_pop($2); } - | tLBRACE_ARG {$$ = dyna_push();} + | tLBRACE_ARG + { + $$ = dyna_push(); + $1 = ruby_sourceline; + } opt_block_var compstmt @@ -1604,5 +1613,5 @@ do_block : kDO_BLOCK { $$ = NEW_ITER($3, 0, $4); - fixpos($$, $3?$3:$4); + nd_set_line($$, $1); dyna_pop($2); } @@ -1661,4 +1670,5 @@ brace_block : '{' { $$ = dyna_push(); + $1 = ruby_sourceline; } opt_block_var @@ -1666,5 +1676,5 @@ brace_block : '{' { $$ = NEW_ITER($3, 0, $4); - fixpos($$, $4); + nd_set_line($$, $1); dyna_pop($2); } @@ -1672,4 +1682,5 @@ brace_block : '{' { $$ = dyna_push(); + $1 = ruby_sourceline; } opt_block_var @@ -1677,5 +1688,5 @@ brace_block : '{' { $$ = NEW_ITER($3, 0, $4); - fixpos($$, $4); + nd_set_line($$, $1); dyna_pop($2); }