mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #1505 from ktaobo/return-breaks-self
Fixed self value in a block is changed with return value
This commit is contained in:
+5
-8
@@ -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);
|
||||
return;
|
||||
case OP_LOADI:
|
||||
s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, 0, GETARG_sBx(i0));
|
||||
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
||||
genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
|
||||
return;
|
||||
case OP_ARRAY:
|
||||
case OP_HASH:
|
||||
case OP_RANGE:
|
||||
case OP_AREF:
|
||||
case OP_GETUPVAR:
|
||||
s->iseq[s->pc-1] = MKOP_ABC(c0, 0, GETARG_B(i0), GETARG_C(i0));
|
||||
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
||||
genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
|
||||
return;
|
||||
case OP_SETIV:
|
||||
case OP_SETCV:
|
||||
@@ -308,8 +306,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
|
||||
case OP_GETSPECIAL:
|
||||
case OP_LOADL:
|
||||
case OP_STRING:
|
||||
s->iseq[s->pc-1] = MKOP_ABx(c0, 0, GETARG_Bx(i0));
|
||||
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
||||
s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i0), GETARG_Bx(i0));
|
||||
genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
|
||||
return;
|
||||
case OP_SCLASS:
|
||||
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)
|
||||
case OP_LOADT:
|
||||
case OP_LOADF:
|
||||
case OP_OCLASS:
|
||||
s->iseq[s->pc-1] = MKOP_A(c0, 0);
|
||||
genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
|
||||
genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
|
||||
return;
|
||||
#if 0
|
||||
case OP_SEND:
|
||||
|
||||
@@ -54,3 +54,40 @@ assert('Proc#call', '15.2.17.4.3') do
|
||||
assert_equal 1, a
|
||||
assert_equal 5, a2
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user