diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-22 08:29:58 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-06-22 08:29:58 +0000 |
commit | 44cf56d6e70dbe06a160b004494ba40dd4cfb426 (patch) | |
tree | 10e665c60414c3070ce957e5c534e30ed499bc2d /eval.c | |
parent | 4b4cad81e7d2bdc4750ea5043ce44bf37adb3997 (diff) |
2000-06-22
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@775 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -1420,6 +1420,28 @@ rb_mod_s_constants() return ary; } +static void +frozen_class_p(klass) + VALUE klass; +{ + char *desc = "something(?!)"; + + if (OBJ_FROZEN(klass)) { + if (FL_TEST(klass, FL_SINGLETON)) + desc = "object"; + else { + switch (TYPE(klass)) { + case T_MODULE: + case T_ICLASS: + desc = "module"; break; + case T_CLASS: + desc = "class"; break; + } + } + rb_error_frozen(desc); + } +} + void rb_undef(klass, id) VALUE klass; @@ -1434,7 +1456,7 @@ rb_undef(klass, id) if (rb_safe_level() >= 4 && !OBJ_TAINTED(klass)) { rb_raise(rb_eSecurityError, "Insecure: can't undef"); } - if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); + frozen_class_p(klass); body = search_method(ruby_class, id, &origin); if (!body || !body->nd_body) { char *s0 = " class"; @@ -1476,6 +1498,7 @@ rb_alias(klass, name, def) VALUE origin; NODE *orig, *body; + frozen_class_p(klass); if (name == def) return; if (klass == rb_cObject) { rb_secure(4); @@ -2757,6 +2780,7 @@ rb_eval(self, n) if (ruby_class == rb_cObject && node->nd_mid == init) { rb_warn("re-defining Object#initialize may cause infinite loop"); } + frozen_class_p(ruby_class); body = search_method(ruby_class, node->nd_mid, &origin); if (body){ if (RTEST(ruby_verbose) && ruby_class == origin) { @@ -2975,7 +2999,6 @@ rb_eval(self, n) } if (rb_safe_level() >= 4 && !OBJ_TAINTED(klass)) rb_raise(rb_eSecurityError, "Insecure: can't extend object"); - if (OBJ_FROZEN(klass)) rb_error_frozen("object"); if (FL_TEST(CLASS_OF(klass), FL_SINGLETON)) { rb_clear_cache(); } |