From: Koji Arai Date: 2002-09-07T20:23:46+09:00 Subject: [ruby-dev:18215] Re: [PATCH] source file/line of Proc 新井です。 In message "[ruby-dev:17968] [PATCH] source file/line of Proc" on Fri, 9 Aug 2002 21:51:16 +0900, nobu.nakada@nifty.ne.jp wrote: > なかだです。 > > Procを使うスクリプトをデバッグしていると、一体どれがどのブロッ > クに対応するのか分からなくなることがないでしょうか。ということ > でProc#to_sにファイル名と行番号を追加するパッチです。 > Data_Get_Struct(self, struct BLOCK, data); > - str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:nul */ > - sprintf(RSTRING(str)->ptr, "#<%s:0x%p>", cname, data->tag); > + if (data->body) { > + len += strlen(data->body->nd_file)+16; > + str = rb_str_new(0, len); > + sprintf(RSTRING(str)->ptr, "#<%s:0x%p@%s:%d>", cname, data->tag, > + data->body->nd_file, nd_line(data->body)); > + } > + else { > + str = rb_str_new(0, len); > + sprintf(RSTRING(str)->ptr, "#<%s:0x%p>", cname, data->tag); > + } > RSTRING(str)->len = strlen(RSTRING(str)->ptr); > if (OBJ_TAINTED(self)) OBJ_TAINT(str); sprintf(3) の %p は、システムによって 0x が付いたり付かなかっ たりしますから使わない方がよいと思います。(確か、HP-UX 11.0 だと 0x が付かなかった) p Proc.new { true }.to_s => ruby 1.7.3 (2002-09-06) [i586-linux] "#" ^^^^^ Index: eval.c =================================================================== RCS file: /usr/local/cvsup/ruby/ruby/eval.c,v retrieving revision 1.324 diff -u -r1.324 eval.c --- eval.c 5 Sep 2002 04:15:50 -0000 1.324 +++ eval.c 7 Sep 2002 11:18:18 -0000 @@ -6637,12 +6637,12 @@ if (data->body) { len += strlen(data->body->nd_file)+16; str = rb_str_new(0, len); - sprintf(RSTRING(str)->ptr, "#<%s:0x%p@%s:%d>", cname, data->tag, + sprintf(RSTRING(str)->ptr, "#<%s:0x%lx@%s:%d>", cname, data->tag, data->body->nd_file, nd_line(data->body)); } else { str = rb_str_new(0, len); - sprintf(RSTRING(str)->ptr, "#<%s:0x%p>", cname, data->tag); + sprintf(RSTRING(str)->ptr, "#<%s:0x%lx>", cname, data->tag); } RSTRING(str)->len = strlen(RSTRING(str)->ptr); if (OBJ_TAINTED(self)) OBJ_TAINT(str); -- 新井康司 (Koji Arai)