diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-12-12 18:41:18 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-12-12 18:41:18 +0900 |
| commit | bbb088234395efda23540d30ab5d1cb40f220d82 (patch) | |
| tree | 4f66588878264c0d2a17529629d7d183d6a49d29 | |
| parent | d4ff92bcf65ce140495014f40d22b93a1b1fb957 (diff) | |
| download | mruby-bbb088234395efda23540d30ab5d1cb40f220d82.tar.gz mruby-bbb088234395efda23540d30ab5d1cb40f220d82.zip | |
Modifying frozen objects will raise `FrozenError`.
`FrozenError` is a subclass of `RuntimeError` which used to be
raised. [Ruby2.5]
| -rw-r--r-- | include/mruby.h | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-string-ext/mrblib/string.rb | 6 | ||||
| -rw-r--r-- | mrbgems/mruby-struct/src/struct.c | 2 | ||||
| -rw-r--r-- | mrblib/10error.rb | 3 | ||||
| -rw-r--r-- | mrblib/string.rb | 4 | ||||
| -rw-r--r-- | src/array.c | 2 | ||||
| -rw-r--r-- | src/class.c | 4 | ||||
| -rw-r--r-- | src/hash.c | 2 | ||||
| -rw-r--r-- | src/string.c | 2 | ||||
| -rw-r--r-- | src/variable.c | 2 |
10 files changed, 16 insertions, 12 deletions
diff --git a/include/mruby.h b/include/mruby.h index fc9656fbe..114b58cf4 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -1164,6 +1164,7 @@ MRB_API void mrb_print_error(mrb_state *mrb); #define E_SYNTAX_ERROR (mrb_exc_get(mrb, "SyntaxError")) #define E_LOCALJUMP_ERROR (mrb_exc_get(mrb, "LocalJumpError")) #define E_REGEXP_ERROR (mrb_exc_get(mrb, "RegexpError")) +#define E_FROZEN_ERROR (mrb_exc_get(mrb, "FrozenError")) #define E_NOTIMP_ERROR (mrb_exc_get(mrb, "NotImplementedError")) #ifndef MRB_WITHOUT_FLOAT diff --git a/mrbgems/mruby-string-ext/mrblib/string.rb b/mrbgems/mruby-string-ext/mrblib/string.rb index cb36d9a48..0da84daed 100644 --- a/mrbgems/mruby-string-ext/mrblib/string.rb +++ b/mrbgems/mruby-string-ext/mrblib/string.rb @@ -95,7 +95,7 @@ class String # "hello".lstrip! #=> nil # def lstrip! - raise RuntimeError, "can't modify frozen String" if frozen? + raise FrozenError, "can't modify frozen String" if frozen? s = self.lstrip (s == self) ? nil : self.replace(s) end @@ -125,7 +125,7 @@ class String # <code>nil</code> if <i>str</i> was not altered. # def strip! - raise RuntimeError, "can't modify frozen String" if frozen? + raise FrozenError, "can't modify frozen String" if frozen? s = self.strip (s == self) ? nil : self.replace(s) end @@ -199,7 +199,7 @@ class String # string #=> "thsa sting" # def slice!(arg1, arg2=nil) - raise RuntimeError, "can't modify frozen String" if frozen? + raise FrozenError, "can't modify frozen String" if frozen? raise "wrong number of arguments (for 1..2)" if arg1.nil? && arg2.nil? if !arg1.nil? && !arg2.nil? diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index 8de4b6c52..adeb09bc1 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -89,7 +89,7 @@ static void mrb_struct_modify(mrb_state *mrb, mrb_value strct) { if (MRB_FROZEN_P(mrb_basic_ptr(strct))) { - mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen struct"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen struct"); } mrb_write_barrier(mrb, mrb_basic_ptr(strct)); diff --git a/mrblib/10error.rb b/mrblib/10error.rb index 22a8d1ad7..0d9f38d58 100644 --- a/mrblib/10error.rb +++ b/mrblib/10error.rb @@ -51,6 +51,9 @@ end class NotImplementedError < ScriptError end +class FrozenError < RuntimeError +end + class StopIteration < IndexError attr_accessor :result end diff --git a/mrblib/string.rb b/mrblib/string.rb index 4c6114ecb..ee98cfa0c 100644 --- a/mrblib/string.rb +++ b/mrblib/string.rb @@ -96,7 +96,7 @@ class String # # ISO 15.2.10.5.19 def gsub!(*args, &block) - raise RuntimeError, "can't modify frozen String" if frozen? + raise FrozenError, "can't modify frozen String" if frozen? return to_enum(:gsub!, *args) if args.length == 1 && !block str = self.gsub(*args, &block) return nil if str == self @@ -159,7 +159,7 @@ class String # # ISO 15.2.10.5.37 def sub!(*args, &block) - raise RuntimeError, "can't modify frozen String" if frozen? + raise FrozenError, "can't modify frozen String" if frozen? str = self.sub(*args, &block) return nil if str == self self.replace(str) diff --git a/src/array.c b/src/array.c index 47a582ffc..285e48a0f 100644 --- a/src/array.c +++ b/src/array.c @@ -114,7 +114,7 @@ static void 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"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen array"); } } diff --git a/src/class.c b/src/class.c index 986af5531..9cb2a9a3a 100644 --- a/src/class.c +++ b/src/class.c @@ -430,9 +430,9 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_ if (MRB_FROZEN_P(c)) { if (c->tt == MRB_TT_MODULE) - mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen module"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen module"); else - mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen class"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen class"); } if (!h) h = c->mt = kh_init(mt, mrb); k = kh_put(mt, mrb, h, mid); diff --git a/src/hash.c b/src/hash.c index feb06d843..d58706954 100644 --- a/src/hash.c +++ b/src/hash.c @@ -286,7 +286,7 @@ static void mrb_hash_modify(mrb_state *mrb, mrb_value hash) { if (MRB_FROZEN_P(mrb_hash_ptr(hash))) { - mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen hash"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen hash"); } mrb_hash_tbl(mrb, hash); } diff --git a/src/string.c b/src/string.c index da475839c..d4dc517cf 100644 --- a/src/string.c +++ b/src/string.c @@ -494,7 +494,7 @@ static void check_frozen(mrb_state *mrb, struct RString *s) { if (MRB_FROZEN_P(s)) { - mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen string"); + mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen string"); } } diff --git a/src/variable.c b/src/variable.c index f0bfa19cc..968fc2fc1 100644 --- a/src/variable.c +++ b/src/variable.c @@ -261,7 +261,7 @@ mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) iv_tbl *t = obj->iv; if (MRB_FROZEN_P(obj)) { - mrb_raisef(mrb, E_RUNTIME_ERROR, "can't modify frozen %S", mrb_obj_value(obj)); + mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %S", mrb_obj_value(obj)); } if (!t) { t = obj->iv = iv_new(mrb); |
