Yukihiro Matsumotoさんの
<984473457.590774.1166.nullmailer / ev.netlab.zetabits.com>から
> |class Fixnum; X = 200; end
> |100.instance_eval { p X }
>
> |修正は、特異クラスを生成するのが、
> |一番簡単なのではないでしょうか?
> 
> たぶん、ev_const_definedとev_const_getにselfを引数として渡す
> の方が簡単、かつ効率が良いでしょう。

そうですね。

上記の修正が行われたもので動作確認をしてみると、
falseに対してinstance_evalしたときがまだ変でした。
別のバグのようです。selfの値がおかしいです。

class FalseClass; X = 200; end
false.instance_eval { p self; p X }

# =>
# main
# ../test/single3.rb:2: uninitialized constant Object::X (NameError)
# 	from ../test/single3.rb:2:in `instance_eval'
# 	from ../test/single3.rb:2:in `instance_eval'
# 	from ../test/single3.rb:2


rb_yield_0の中で、
if (!self) self = block->self;
としているために、falseのときにselfの値が
置き換わってしまうことが原因のようです。

--- eval.c.orig	Tue Mar 13 00:00:01 2001
+++ eval.c	Tue Mar 13 19:23:20 2001
@@ -2324,7 +2324,7 @@
 	else {
 	    result = Qnil;
 	}
-	result = rb_yield_0(result, 0, 0, 0);
+	result = rb_yield_0(result, Qundef, 0, 0);
 	break;
 
       case NODE_RESCUE:
@@ -3530,7 +3530,7 @@
 	ruby_dyna_vars = block->dyna_vars;
     }
     ruby_class = klass?klass:block->klass;
-    if (!self) self = block->self;
+    if (self == Qundef) self = block->self;
     node = block->body;
 
     if (block->var) {
@@ -3637,14 +3637,14 @@
 rb_yield(val)
     VALUE val;
 {
-    return rb_yield_0(val, 0, 0, 0);
+    return rb_yield_0(val, Qundef, 0, 0);
 }
 
 static VALUE
 rb_f_loop()
 {
     for (;;) {
-	rb_yield_0(Qnil, 0, 0, 0);
+	rb_yield_0(Qnil, Qundef, 0, 0);
 	CHECK_INTS;
     }
     return Qnil;		/* dummy */
@@ -6269,7 +6269,7 @@
     state = EXEC_TAG();
     if (state == 0) {
 	proc_set_safe_level(proc);
-	result = rb_yield_0(args, 0, 0, Qtrue);
+	result = rb_yield_0(args, Qundef, 0, Qtrue);
     }
     POP_TAG();
 
@@ -8105,7 +8105,7 @@
     rb_thread_t th;
 {
     scope_dup(ruby_block->scope);
-    return rb_yield_0(callargs(arg), 0, 0, Qtrue);
+    return rb_yield_0(callargs(arg), Qundef, 0, Qtrue);
 }
 
 static VALUE
@@ -8672,7 +8672,7 @@
     t = rb_to_id(tag);
     PUSH_TAG(t);
     if ((state = EXEC_TAG()) == 0) {
-	val = rb_yield_0(tag, 0, 0, 0);
+	val = rb_yield_0(tag, Qundef, 0, 0);
     }
     else if (state == TAG_THROW && t == prot_tag->dst) {
 	val = prot_tag->retval;
----
小迫@ソフネック   渋谷区恵比寿1-15-1