From c181d89c9dca0e722a525b871a82cbd75c59bb80 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 21 Apr 2020 13:14:10 +0900 Subject: `Kernel#clone` and `Kernel#dup` no longer raise `TypeError`; fix #4974 In ISO, those methods should raise `TypeError`, but the spec has been changed. The change was discussed in [Feature#12979]. --- test/t/kernel.rb | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'test') diff --git a/test/t/kernel.rb b/test/t/kernel.rb index c2eeee1a5..aac6373fa 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -197,17 +197,6 @@ assert('Kernel#dup', '15.3.1.3.9') do a.set(2) c = a.dup - immutables = [ 1, :foo, true, false, nil ] - error_count = 0 - immutables.each do |i| - begin - i.dup - rescue TypeError - error_count += 1 - end - end - - assert_equal immutables.size, error_count assert_equal 2, a.get assert_equal 1, b.get assert_equal 2, c.get -- cgit v1.2.3 From 81c8352179ec7cc755360e51410122f3fb664107 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 26 Apr 2020 19:57:13 +0900 Subject: Integrate class `EnsureYieldBreak` under test --- test/t/ensure.rb | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) (limited to 'test') diff --git a/test/t/ensure.rb b/test/t/ensure.rb index bef397059..bdb5bffc4 100644 --- a/test/t/ensure.rb +++ b/test/t/ensure.rb @@ -1,16 +1,16 @@ ## # ensure Test -assert('ensure - context - yield') do - class EnsureYieldBreak - attr_reader :ensure_context - def try - yield - ensure - @ensure_context = self - end +class EnsureYieldBreak + attr_reader :ensure_context + def try + yield + ensure + @ensure_context = self end +end +assert('ensure - context - yield') do yielder = EnsureYieldBreak.new yielder.try do end @@ -18,15 +18,6 @@ assert('ensure - context - yield') do end assert('ensure - context - yield and break') do - class EnsureYieldBreak - attr_reader :ensure_context - def try - yield - ensure - @ensure_context = self - end - end - yielder = EnsureYieldBreak.new yielder.try do break @@ -35,15 +26,6 @@ assert('ensure - context - yield and break') do end assert('ensure - context - yield and return') do - class EnsureYieldBreak - attr_reader :ensure_context - def try - yield - ensure - @ensure_context = self - end - end - yielder = EnsureYieldBreak.new lambda do yielder.try do -- cgit v1.2.3 From 6f4c585bd73fc43fb9e34a70d74b5a50852600ea Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Sun, 24 May 2020 01:25:03 +0900 Subject: Do not destruct rest arguments for __send__ Formerly, `__send__(*args)` modified `args` with `Array#shift`. This bug affects optcarrot. This changeset avoids the array destruction by using `args = args[1, len-1]`. --- include/mruby/array.h | 3 +++ src/array.c | 7 +++++++ src/vm.c | 2 +- test/t/kernel.rb | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/include/mruby/array.h b/include/mruby/array.h index fd4094a02..92c86a8c5 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -292,6 +292,9 @@ MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep); */ MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len); +/* helper functions */ +mrb_value mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len); + MRB_END_DECL #endif /* MRUBY_ARRAY_H */ diff --git a/src/array.c b/src/array.c index 6e73bcd8e..ad0d5b8db 100644 --- a/src/array.c +++ b/src/array.c @@ -808,6 +808,13 @@ ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len) return mrb_obj_value(b); } +mrb_value +mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len) +{ + struct RArray *a = mrb_ary_ptr(ary); + return ary_subseq(mrb, a, beg, len); +} + static mrb_int aget_index(mrb_state *mrb, mrb_value index) { diff --git a/src/vm.c b/src/vm.c index 7bb153910..bd54f3f00 100644 --- a/src/vm.c +++ b/src/vm.c @@ -625,7 +625,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self) ci->argc--; } else { /* variable length arguments */ - mrb_ary_shift(mrb, regs[0]); + regs[0] = mrb_ary_subseq(mrb, regs[0], 1, RARRAY_LEN(regs[0]) - 1); } if (MRB_METHOD_CFUNC_P(m)) { diff --git a/test/t/kernel.rb b/test/t/kernel.rb index aac6373fa..e3b9fe8ab 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -100,6 +100,10 @@ assert('Kernel#__send__', '15.3.1.3.4') do assert_true __send__(:respond_to?, :nil?) # test without argument and without block assert_equal String, __send__(:to_s).class + + args = [:respond_to?, :nil?] + assert_true __send__(*args) + assert_equal [:respond_to?, :nil?], args end assert('Kernel#block_given?', '15.3.1.3.6') do -- cgit v1.2.3