From e581f2ed97f7560fe7ba8e1bf74e6395e32c6aa1 Mon Sep 17 00:00:00 2001 From: ksss Date: Sun, 9 Jul 2017 17:47:10 +0900 Subject: Should only check frozen fix #3737 --- src/array.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/array.c b/src/array.c index 8b6b9fa1e..ae2cca70c 100644 --- a/src/array.c +++ b/src/array.c @@ -106,11 +106,17 @@ ary_fill_with_nil(mrb_value *ptr, mrb_int size) } static void -ary_modify(mrb_state *mrb, struct RArray *a) +ary_modify_check(mrb_state *mrb, struct RArray *a) { if (MRB_FROZEN_P(a)) { mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen array"); } +} + +static void +ary_modify(mrb_state *mrb, struct RArray *a) +{ + ary_modify_check(mrb, a); if (ARY_SHARED_P(a)) { mrb_shared_array *shared = a->aux.shared; @@ -458,7 +464,7 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self) struct RArray *a = mrb_ary_ptr(self); mrb_value val; - ary_modify(mrb, a); + ary_modify_check(mrb, a); if (a->len == 0) return mrb_nil_value(); if (ARY_SHARED_P(a)) { L_SHIFT: -- cgit v1.2.3 From c76dc33116c1c43c0e151deceb85b66d33093c1c Mon Sep 17 00:00:00 2001 From: ksss Date: Sun, 9 Jul 2017 17:53:12 +0900 Subject: Add frozen test for Array#shift --- test/t/array.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/t/array.rb b/test/t/array.rb index 4efc5166a..8df8dedb4 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -284,6 +284,8 @@ assert('Array#shift', '15.2.12.5.27') do assert_nil([].shift) assert_equal([2,3], a) assert_equal(1, b) + + assert_raise(RuntimeError) { [].freeze.shift } end assert('Array#size', '15.2.12.5.28') do -- cgit v1.2.3 From bf48473cf6c48fca74a81ca852734254646b3b57 Mon Sep 17 00:00:00 2001 From: ksss Date: Sun, 9 Jul 2017 18:05:21 +0900 Subject: Should only check frozen for Array#pop --- src/array.c | 2 +- test/t/array.rb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/array.c b/src/array.c index ae2cca70c..f3d29faec 100644 --- a/src/array.c +++ b/src/array.c @@ -451,7 +451,7 @@ mrb_ary_pop(mrb_state *mrb, mrb_value ary) { struct RArray *a = mrb_ary_ptr(ary); - ary_modify(mrb, a); + ary_modify_check(mrb, a); if (a->len == 0) return mrb_nil_value(); return a->ptr[--a->len]; } diff --git a/test/t/array.rb b/test/t/array.rb index 8df8dedb4..7c11265a4 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -237,6 +237,8 @@ assert('Array#pop', '15.2.12.5.21') do assert_nil([].pop) assert_equal([1,2], a) assert_equal(3, b) + + assert_raise(RuntimeError) { [].freeze.pop } end assert('Array#push', '15.2.12.5.22') do -- cgit v1.2.3