VALUE rb_define_class(const char *name, VALUE super) { VALUE klass; ID id; id = rb_intern(name); if (rb_const_defined(rb_cObject, id)) { klass = rb_const_get(rb_cObject, id); if (TYPE(klass) != T_CLASS) { rb_raise(rb_eTypeError, "%s is not a class", name); } if (rb_class_real(RCLASS_SUPER(klass)) != super) { rb_name_error(id, "%s is already defined", name); } return klass; } if (!super) { rb_warn("no super class for `%s', Object assumed", name); } klass = rb_define_class_id(id, super); st_add_direct(rb_class_tbl, id, klass); rb_name_class(klass, id); rb_const_set(rb_cObject, id, klass); rb_class_inherited(super, klass); return klass; }
/*! * Defines a top-level class. * \param name name of the class * \param super a class from which the new class will derive. * NULL means \c Object class. * \return the created class * \throw TypeError if the constant name \a name is already taken but * the constant is not a \c Class. * \throw NameError if the class is already defined but the class can not * be reopened because its superclass is not \a super. * \post top-level constant named \a name refers the returned class. * * \note if a class named \a name is already defined and its superclass is * \a super, the function just returns the defined class. */ VALUE rb_define_class(const char *name, VALUE super) { VALUE klass; ID id; id = rb_intern(name); if (rb_const_defined(rb_cObject, id)) { klass = rb_const_get(rb_cObject, id); if (!RB_TYPE_P(klass, T_CLASS)) { rb_raise(rb_eTypeError, "%s is not a class", name); } if (rb_class_real(RCLASS_SUPER(klass)) != super) { rb_raise(rb_eTypeError, "superclass mismatch for class %s", name); } return klass; } if (!super) { rb_warn("no super class for `%s', Object assumed", name); } klass = rb_define_class_id(id, super); rb_vm_add_root_module(id, klass); rb_name_class(klass, id); rb_const_set(rb_cObject, id, klass); rb_class_inherited(super, klass); return klass; }
VALUE rb_define_module_id(ID id) { VALUE mdl; mdl = rb_module_new(); rb_name_class(mdl, id); return mdl; }
static VALUE boot_defclass(const char *name, VALUE super) { VALUE obj = rb_class_boot(super); ID id = rb_intern(name); rb_name_class(obj, id); rb_const_set((rb_cObject ? rb_cObject : obj), id, obj); return obj; }
static VALUE boot_defclass(const char *name, VALUE super) { extern st_table *rb_class_tbl; VALUE obj = rb_class_boot(super); ID id = rb_intern(name); rb_name_class(obj, id); st_add_direct(rb_class_tbl, id, obj); rb_const_set((rb_cObject ? rb_cObject : obj), id, obj); return obj; }
void Init_with_ext() { VALUE super = rb_class_boot(0); rb_cCallWith = rb_class_boot(super); rb_name_class(rb_cCallWith, rb_intern("CallWith")); rb_const_set(rb_cObject, rb_intern("CallWith"), rb_cCallWith); rb_global_variable(&rb_cCallWith); rb_undef_alloc_func(rb_cCallWith); rb_define_singleton_method(rb_cCallWith, "create", callwith_s_create, 2); rb_define_method(rb_cCallWith, "__instance_eval__", rb_obj_instance_eval, -1); rb_define_method(rb_cCallWith, "__callwith__obj__", callwith_obj, 0); rb_define_method(rb_cCallWith, "__callwith__self_obj__", callwith_self_obj, 0); rb_define_method(rb_cCallWith, "__callwith__cleanup__", callwith_cleanup, 0); }