From: nobu.nakada@... Date: 2002-09-11T09:49:56+09:00 Subject: [ruby-dev:18259] Re: [PATCH] source file/line of Proc なかだです。 At Wed, 11 Sep 2002 06:48:53 +0900, Koji Arai wrote: > VALUE が %lx で出力している以上(VALUEはポインタとは限らない > けど) Proc に関しても同様でいいんじゃん?っていう軽い(あさは > か?)気持ちですんで議論のレベルが違うわけですが(^^ この件に関しては、それぞれユニークな表記になることさえ保証でき れば後はどうだっていいので、%lxでもなんでもいいと思います。ただ、 %lxだと桁数が揃わないのがちょっといやかも。 つーか64bit環境だと、(%pでつく0x)-(余分なnul)の分だけオーバーフ ローしてるような気が。 > >  %p に渡す際には void * にキャストして渡すのが作法かな。 > > これはなぜなんでしょうか?よろしければ教えてください。 printf()への引数の型と書式指定との整合性は、プログラマが全面的 に責任を持たなければならない、ということ? Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.325 diff -u -2 -p -r1.325 eval.c --- eval.c 10 Sep 2002 15:44:36 -0000 1.325 +++ eval.c 11 Sep 2002 00:36:18 -0000 @@ -6631,17 +6631,18 @@ proc_to_s(self, other) struct BLOCK *data; char *cname = rb_class2name(CLASS_OF(self)); - long len = strlen(cname)+6+16+1; /* 6:tags 16:addr 1:nul */ + const int w = (SIZEOF_LONG * CHAR_BIT) / 4; + long len = strlen(cname)+6+w; /* 6:tags 16:addr */ VALUE str; Data_Get_Struct(self, struct BLOCK, data); if (data->body) { - len += strlen(data->body->nd_file)+16; + len += strlen(data->body->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-19)/3; 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, w, (VALUE)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, w, (VALUE)data->tag); } RSTRING(str)->len = strlen(RSTRING(str)->ptr); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦