[#12164] patch for ext/gdbm — Koji Arai <JCA02266@...>

新井です。

24 messages 2001/02/04
[#12168] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/05

まつもと ゆきひろです

[#12176] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/05

新井です。

[#12179] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/06

まつもと ゆきひろです

[#12219] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12220] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12256] set_trace_func — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/02/17

[#12293] crash on proc without a block — Kenichi Komiya <kom@...1.accsnet.ne.jp>

15 messages 2001/02/25

[#12323] Re: [ruby-list:28364] class definition extension — "K.Kosako" <kosako@...>

ruby-listから移動しました。

13 messages 2001/02/28
[#12324] Re: [ruby-list:28364] class definition extension — matz@... (Yukihiro Matsumoto) 2001/02/28

まつもと ゆきひろです

[ruby-dev:12313] Re: crash on proc without a block

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2001-02-27 01:25:29 UTC
List: ruby-dev #12313
なかだです。

At Tue, 27 Feb 2001 00:14:45 +0900
Kenichi Komiya <kom@mail1.accsnet.ne.jp> wrote:
> この修正でどちらでも落ちなくなりました。ただ微妙に問題が・・・
> 
> これだとproc生成時に渡されていたブロックにアクセスできなくなってし
> まうように思います。
> 
> $ ./miniruby -v -e 'def foo; proc{yield}; end; foo{puts "hello wolrd"}.call'
> /miniruby -v -e 'def foo; proc{yield}; end; foo{puts "hello wolrd"}.call'
> ruby 1.6.3 (2001-02-26) [i686-linux]
> -e:1:in `foo': yield called out of block (LocalJumpError)
> 	from -e:1:in `call'
> 	from -e:1

  なんとなく場当たり的な気がしなくもないですが。


Index: eval.c
===================================================================
RCS file: /home/cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.157
diff -u -2 -p -r1.157 eval.c
--- eval.c	2001/02/26 05:29:00	1.157
+++ eval.c	2001/02/27 01:16:32
@@ -3518,5 +3518,5 @@ rb_yield_0(val, self, klass, acheck)
     static unsigned serial = 1;
 
-    if (!ruby_frame->iter || !ruby_block) {
+    if (!(rb_block_given_p() || rb_f_block_given_p()) || !ruby_block) {
 	rb_raise(rb_eLocalJumpError, "yield called out of block");
     }
@@ -6262,17 +6262,13 @@ proc_call(proc, args)
     orphan = blk_orphan(data);
 
-    if (orphan) {/* orphan procedure */
-	if (rb_block_given_p()) {
-	    ruby_block->frame.iter = ITER_CUR;
-	}
-	else {
-	    ruby_block->frame.iter = ITER_NOT;
-	}
-    }
-
     /* PUSH BLOCK from data */
     old_block = ruby_block;
     _block = *data;
     ruby_block = &_block;
+
+    if (orphan) {/* orphan procedure */
+	struct BLOCK *blk = old_block ? old_block : ruby_block;
+	blk->frame.iter = rb_block_given_p() ? ITER_CUR : ITER_NOT;
+    }
 
     PUSH_ITER(ITER_CUR);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread