summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eval.c15
-rw-r--r--test/ruby/test_class.rb6
2 files changed, 19 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index 90da22503e..1dabe2e24b 100644
--- a/eval.c
+++ b/eval.c
@@ -412,8 +412,21 @@ rb_frozen_class_p(VALUE klass)
if (OBJ_FROZEN(klass)) {
const char *desc;
- if (FL_TEST(klass, FL_SINGLETON))
+ if (FL_TEST(klass, FL_SINGLETON)) {
desc = "object";
+ klass = rb_ivar_get(klass, id__attached__);
+ if (!SPECIAL_CONST_P(klass)) {
+ switch (BUILTIN_TYPE(klass)) {
+ case T_MODULE:
+ case T_ICLASS:
+ desc = "Module";
+ break;
+ case T_CLASS:
+ desc = "Class";
+ break;
+ }
+ }
+ }
else {
switch (BUILTIN_TYPE(klass)) {
case T_MODULE:
diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb
index 9a4cdb0f58..7259594f8e 100644
--- a/test/ruby/test_class.rb
+++ b/test/ruby/test_class.rb
@@ -389,8 +389,12 @@ class TestClass < Test::Unit::TestCase
obj = Object.new
c = obj.singleton_class
obj.freeze
- assert_raise(RuntimeError, /frozen object/) {
+ assert_raise_with_message(RuntimeError, /frozen object/) {
c.class_eval {def f; end}
}
+ c = Class.new.freeze
+ assert_raise_with_message(RuntimeError, /frozen Class/) {
+ def c.f; end
+ }
end
end