From: matz@... (Yukihiro Matsumoto) Date: 1998-10-30T14:47:19+09:00 Subject: [ruby-list:10496] Re: Enumerable#collect bug? まつもと ゆきひろです In message "[ruby-list:10481] Enumerable#collect bug?" on 98/10/30, Kazuhiro HIWADA writes: |ひわだです。 | |以下の script で collect がちょっと予想外の動作をします。 |1.1c0, 1.1c6 を使っています。 ええと,予想された答えでしょうがバグです.^^;;; で,これはブロック引数の受渡しのバグでした. 今試した範囲内では大丈夫そうだったのですが,以下のパッチを試 してみて下さい. なんか他の修正も混じってますが,便利なものばかりなので一緒に しておきます.というか,これらが1.1c7の変更の本質的な部分の ような気がする. --- eval.c 1998/09/08 09:17:32 1.1.1.2.2.80 +++ eval.c 1998/10/30 05:42:26 @@ -424,8 +424,2 @@ -#define PUSH_BLOCK2(b) { \ - struct BLOCK _block; \ - _block = *b; \ - _block.prev = the_block; \ - the_block = &_block; - #define POP_BLOCK() \ @@ -532,3 +526,3 @@ else { - dyna_var_push(id, value); + dyna_var_asgn(id, value); } @@ -706,6 +700,2 @@ } - if (verbose) { - Warning("Insecure operation - %s", - rb_id2name(the_frame->last_func)); - } } @@ -1614,2 +1604,6 @@ case NODE_BLOCK: + if (!node->nd_next) { + node = node->nd_head; + goto again; + } while (node) { @@ -2339,2 +2333,3 @@ str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len); + if (str_tainted(str2)) str_taint(str); } @@ -3355,3 +3350,3 @@ - if ((++tick & 0xfff) == 0 && stack_length() > STACK_LEVEL_MAX) + if ((++tick & 0x3ff) == 0 && stack_length() > STACK_LEVEL_MAX) Raise(eSysStackError, "stack level too deep"); @@ -5016,2 +5011,3 @@ { + struct BLOCK * volatile old_block; struct BLOCK *data; @@ -5037,3 +5033,4 @@ /* PUSH BLOCK from data */ - PUSH_BLOCK2(data); + old_block = the_block; + the_block = data; PUSH_ITER(ITER_CUR); @@ -5075,3 +5072,3 @@ } - POP_BLOCK(); + the_block = old_block; safe_level = safe; @@ -5103,2 +5100,3 @@ VALUE block = rb_eval(self, node->nd_body); + struct BLOCK * volatile old_block; struct BLOCK *data; @@ -5124,3 +5122,4 @@ /* PUSH BLOCK from data */ - PUSH_BLOCK2(data); + old_block = the_block; + the_block = data; PUSH_ITER(ITER_PRE); @@ -5153,3 +5152,3 @@ } - POP_BLOCK(); + the_block = old_block; safe_level = safe;