Commit e7082a50 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1505 from ktaobo/return-breaks-self

Fixed self value in a block is changed with return value
parents f65a39f4 c4e5a8b1
...@@ -278,16 +278,14 @@ genop_peep(codegen_scope *s, mrb_code i, int val) ...@@ -278,16 +278,14 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL); s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL);
return; return;
case OP_LOADI: case OP_LOADI:
s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, 0, GETARG_sBx(i0)); genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
return; return;
case OP_ARRAY: case OP_ARRAY:
case OP_HASH: case OP_HASH:
case OP_RANGE: case OP_RANGE:
case OP_AREF: case OP_AREF:
case OP_GETUPVAR: case OP_GETUPVAR:
s->iseq[s->pc-1] = MKOP_ABC(c0, 0, GETARG_B(i0), GETARG_C(i0)); genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
return; return;
case OP_SETIV: case OP_SETIV:
case OP_SETCV: case OP_SETCV:
...@@ -308,8 +306,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val) ...@@ -308,8 +306,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
case OP_GETSPECIAL: case OP_GETSPECIAL:
case OP_LOADL: case OP_LOADL:
case OP_STRING: case OP_STRING:
s->iseq[s->pc-1] = MKOP_ABx(c0, 0, GETARG_Bx(i0)); s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i0), GETARG_Bx(i0));
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
return; return;
case OP_SCLASS: case OP_SCLASS:
s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0)); s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0));
...@@ -320,8 +318,7 @@ genop_peep(codegen_scope *s, mrb_code i, int val) ...@@ -320,8 +318,7 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
case OP_LOADT: case OP_LOADT:
case OP_LOADF: case OP_LOADF:
case OP_OCLASS: case OP_OCLASS:
s->iseq[s->pc-1] = MKOP_A(c0, 0); genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
return; return;
#if 0 #if 0
case OP_SEND: case OP_SEND:
......
...@@ -54,3 +54,40 @@ assert('Proc#call', '15.2.17.4.3') do ...@@ -54,3 +54,40 @@ assert('Proc#call', '15.2.17.4.3') do
assert_equal 1, a assert_equal 1, a
assert_equal 5, a2 assert_equal 5, a2
end end
assert('Proc#return_does_not_break_self') do
class TestClass
attr_accessor :block
def initialize
end
def return_array
@block = Proc.new { self }
return []
end
def return_instance_variable
@block = Proc.new { self }
return @block
end
def return_const_fixnum
@block = Proc.new { self }
return 123
end
def return_nil
@block = Proc.new { self }
return nil
end
end
c = TestClass.new
assert_equal [], c.return_array
assert_equal c, c.block.call
c.return_instance_variable
assert_equal c, c.block.call
assert_equal 123, c.return_const_fixnum
assert_equal c, c.block.call
assert_equal nil, c.return_nil
assert_equal c, c.block.call
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment