summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorh2so5 <[email protected]>2013-10-30 12:52:26 +0900
committerh2so5 <[email protected]>2013-10-30 12:52:26 +0900
commit12e00f9238bf5164df98551db029a581fd25d54e (patch)
treebffef2ea906bd9f8adc3285eda155946ba6c3f83 /src
parent88758e36308492c860808ed9f7fb66e74f89e589 (diff)
downloadmruby-12e00f9238bf5164df98551db029a581fd25d54e.tar.gz
mruby-12e00f9238bf5164df98551db029a581fd25d54e.zip
implement Class.new with block
Diffstat (limited to 'src')
-rw-r--r--src/class.c15
1 files changed, 9 insertions, 6 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