From: matz@... (Yukihiro Matsumoto) Date: 1998-06-30T10:11:03+09:00 Subject: [ruby-dev:3099] Re: collect{}.sort{} bug? まつもと ゆきひろです In message "[ruby-dev:3088] Re: collect{}.sort{} bug?" on 98/06/29, Yukihiro Matsumoto writes: ||バグだと思いますが、何がわるいんでしょう? | |ブロック付きメソッドの連鎖で外側のブロックでなく,後ろのブロッ |クを評価してます.すぐに対策を思い付きませんが,バグである事 |は確かなのでなんとかして直します. 昨夜直してみました.とりあえず希望通り動いているようです. --- eval.c 1998/06/26 09:44:15 1.1.1.2.2.67 +++ eval.c 1998/06/30 01:00:20 @@ -403,3 +403,3 @@ }; -static struct BLOCK *the_block; +static struct BLOCK *the_block; @@ -1314,2 +1314,14 @@ +#define BEGIN_CALLARGS {\ + struct BLOCK *tmp_block = the_block;\ + if (the_iter->iter == ITER_PRE) {\ + the_block = the_block->prev;\ + }\ + PUSH_ITER(ITER_NOT); + +#define END_CALLARGS \ + the_block = tmp_block;\ + POP_ITER();\ +} + #define MATCH_DATA the_scope->local_vars[node->nd_cnt] @@ -1963,6 +1975,7 @@ - PUSH_ITER(ITER_NOT); + BEGIN_CALLARGS; recv = rb_eval(self, node->nd_recv); SETUP_ARGS(node->nd_args); - POP_ITER(); + END_CALLARGS; + result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0); @@ -1976,5 +1989,6 @@ - PUSH_ITER(ITER_NOT); + BEGIN_CALLARGS; SETUP_ARGS(node->nd_args); - POP_ITER(); + END_CALLARGS; + result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1); @@ -2002,5 +2016,5 @@ else { - PUSH_ITER(ITER_NOT); + BEGIN_CALLARGS; SETUP_ARGS(node->nd_args); - POP_ITER(); + END_CALLARGS; } @@ -3074,5 +3088,6 @@ - PUSH_ITER(ITER_NOT); + BEGIN_CALLARGS; SETUP_ARGS(node->nd_args); - POP_ITER(); + END_CALLARGS; + while (argc--) {