diff options
| -rw-r--r-- | src/class.c | 15 | ||||
| -rw-r--r-- | test/t/class.rb | 10 |
2 files changed, 18 insertions, 7 deletions
diff --git a/src/class.c b/src/class.c index bcbd42c53..4e2af8e99 100644 --- a/src/class.c +++ b/src/class.c @@ -1056,15 +1056,18 @@ mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv) static mrb_value mrb_class_new_class(mrb_state *mrb, mrb_value cv) { - mrb_value super; - struct RClass *new_class; + mrb_value super, blk; + mrb_value new_class; - if (mrb_get_args(mrb, "|o", &super) == 0) { + if (mrb_get_args(mrb, "|o&", &super, &blk) == 0) { super = mrb_obj_value(mrb->object_class); } - new_class = mrb_class_new(mrb, mrb_class_ptr(super)); - mrb_funcall(mrb, super, "inherited", 1, mrb_obj_value(new_class)); - return mrb_obj_value(new_class); + new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super))); + if (!mrb_nil_p(blk)) { + mrb_funcall_with_block(mrb, new_class, mrb_intern_cstr(mrb, "class_eval"), 0, NULL, blk); + } + mrb_funcall(mrb, super, "inherited", 1, new_class); + return new_class; } mrb_value diff --git a/test/t/class.rb b/test/t/class.rb index 403a95f10..d6c0f1c9a 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -9,7 +9,15 @@ assert('Class superclass', '15.2.3.2') do assert_equal(Module, Class.superclass) end -# Class#initialize '15.2.3.3.1' is tested in Class#new +assert('Class#initialize', '15.2.3.3.1') do + c = Class.new do + def test + :test + end + end.new + + assert_equal(c.test, :test) +end assert('Class#initialize_copy', '15.2.3.3.2') do class TestClass |
