mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
implement Class.new in C again
This commit is contained in:
@@ -4,11 +4,6 @@ class Class
|
||||
obj.initialize(*args,&b)
|
||||
obj
|
||||
end
|
||||
def self.new(*args)
|
||||
obj = super
|
||||
obj.inherited
|
||||
obj
|
||||
end
|
||||
end
|
||||
|
||||
class Module
|
||||
|
||||
+16
-1
@@ -1055,6 +1055,20 @@ mrb_obj_new(mrb_state *mrb, struct RClass *c, int argc, mrb_value *argv)
|
||||
return obj;
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
mrb_class_new_class(mrb_state *mrb, mrb_value cv)
|
||||
{
|
||||
mrb_value super;
|
||||
struct RClass *new_class;
|
||||
|
||||
if (mrb_get_args(mrb, "|o", &super) == 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);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_class_superclass(mrb_state *mrb, mrb_value klass)
|
||||
{
|
||||
@@ -1871,8 +1885,9 @@ mrb_init_class(mrb_state *mrb)
|
||||
mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */
|
||||
|
||||
mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */
|
||||
mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_ANY());
|
||||
mrb_define_method(mrb, cls, "alloc", mrb_instance_alloc, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */
|
||||
mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */
|
||||
mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user