[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:8012] Re: [BUG] iterator & raise

From: matz@... (Yukihiro Matsumoto)
Date: 1999-10-13 09:31:29 UTC
List: ruby-dev #8012
まつもと ゆきひろです

In message "[ruby-dev:8009] [BUG] iterator & raise"
    on 99/10/13, Minero Aoki <aamine@dp.u-netsurf.ne.jp> writes:

|以下のスクリプトが落ちます。
|Ruby は ruby version 1.4.2 1999-09-18 [i686-linux] です。

どうもです。その周辺には他のバグもいました。
パッチです。CVSにもチェックインしておきます。

--- eval.c	1999/10/12 04:53:32	1.10
+++ eval.c	1999/10/13 09:30:25
@@ -5550,4 +5550,5 @@
     data->orig_thread = rb_thread_current();
     data->iter = data->prev?Qtrue:Qfalse;
+    data->tag = 0;		/* should not point into stack */
     frame_dup(&data->frame);
     if (data->iter) {
@@ -5590,4 +5591,5 @@
 {
     struct BLOCK * volatile old_block;
+    struct BLOCK _block;
     struct BLOCK *data;
     volatile VALUE result = Qnil;
@@ -5601,5 +5603,6 @@
     /* PUSH BLOCK from data */
     old_block = ruby_block;
-    ruby_block = data;
+    _block = *data;
+    ruby_block = &_block;
     PUSH_ITER(ITER_CUR);
     ruby_frame->iter = ITER_CUR;
@@ -5626,4 +5629,5 @@
 
     PUSH_TAG(PROT_NONE);
+    _block.tag = prot_tag;
     state = EXEC_TAG();
     if (state == 0) {
@@ -5691,4 +5695,5 @@
     VALUE block = rb_eval(self, node->nd_body);
     struct BLOCK * volatile old_block;
+    struct BLOCK _block;
     struct BLOCK *data;
     volatile VALUE result = Qnil;
@@ -5713,9 +5718,11 @@
     /* PUSH BLOCK from data */
     old_block = ruby_block;
-    ruby_block = data;
+    _block = *data;
+    ruby_block = &_block;
     PUSH_ITER(ITER_PRE);
     ruby_frame->iter = ITER_PRE;
 
     PUSH_TAG(PROT_NONE);
+    _block.tag = prot_tag;
     state = EXEC_TAG();
     if (state == 0) {
@@ -5725,5 +5732,5 @@
     POP_TAG();
     POP_ITER();
-    if (ruby_block->tag->dst == state) {
+    if (_block.tag->dst == state) {
 	state &= TAG_MASK;
 	orphan = 2;

In This Thread

Prev Next