37 #define id_attached id__attached__
44 if (super && super !=
Qundef) {
45 entry =
xmalloc(
sizeof(*entry));
65 entry =
xmalloc(
sizeof(*entry));
66 entry->
klass = iclass;
103 entry = *
RCLASS_EXT(klass)->module_subclasses;
240 if (node->nd_clss == old_klass) {
242 RB_OBJ_WRITE(new_node, &new_node->nd_next, node->nd_next);
243 *new_cref_ptr = new_node;
247 node = node->nd_next;
248 *new_cref_ptr = new_node;
249 new_cref_ptr = &new_node->nd_next;
251 *new_cref_ptr =
NULL;
435 #define METACLASS_OF(k) RBASIC(k)->klass
436 #define SET_METACLASS_OF(k, cls) RBASIC_SET_CLASS(k, cls)
443 #define META_CLASS_OF_CLASS_CLASS_P(k) (METACLASS_OF(k) == (k))
450 #define HAVE_METACLASS_P(k) \
451 (FL_TEST(METACLASS_OF(k), FL_SINGLETON) && \
452 rb_ivar_get(METACLASS_OF(k), id_attached) == (k))
461 #define ENSURE_EIGENCLASS(klass) \
462 (HAVE_METACLASS_P(klass) ? METACLASS_OF(klass) : make_metaclass(klass))
609 return rb_funcall(super, inherited, 1, klass);
647 rb_warn(
"no super class for `%s', Object assumed", name);
714 rb_warn(
"no super class for `%s::%s', Object assumed",
797 module =
RBASIC(module)->klass;
855 int method_changed = 0, constant_changed = 0;
859 int superclass_seen =
FALSE;
870 if (!superclass_seen) {
877 superclass_seen =
TRUE;
891 VALUE refined_class =
901 constant_changed = 1;
909 return method_changed;
953 if (origin == klass) {
1071 #define VISI(x) ((x)&NOEX_MASK)
1072 #define VISI_CHECK(x,f) (VISI(x) == (f))
1083 visi = (type == visi);
1146 int recur, prepended = 0;
1412 if (klass != origin && (mtbl =
RCLASS_M_TBL(klass)) != 0)
1519 #define SPECIAL_SINGLETON(x,c) do {\
1560 rb_bug(
"unknown immediate %p", (
void *)obj);
1572 klass =
RBASIC(obj)->klass;
1604 klass =
RBASIC(obj)->klass;
1731 const char *p = fmt;
1734 int f_var = 0, f_hash = 0, f_block = 0;
1735 int n_lead = 0, n_opt = 0, n_trail = 0, n_mand;
1770 rb_fatal(
"bad scan arg format: %s", fmt);
1772 n_mand = n_lead + n_trail;
1777 va_start(vargs, fmt);
1780 if (f_hash && n_mand < argc) {
1787 if (!f_var && n_mand + n_opt < argc)
1795 hash = opts ? opts :
Qnil;
1800 for (i = n_lead; i-- > 0; ) {
1801 var = va_arg(vargs,
VALUE *);
1802 if (var) *var = argv[argi];
1806 for (i = n_opt; i-- > 0; ) {
1807 var = va_arg(vargs,
VALUE *);
1808 if (argi < argc - n_trail) {
1809 if (var) *var = argv[argi];
1813 if (var) *var =
Qnil;
1818 int n_var = argc - argi - n_trail;
1820 var = va_arg(vargs,
VALUE *);
1830 for (i = n_trail; i-- > 0; ) {
1831 var = va_arg(vargs,
VALUE *);
1832 if (var) *var = argv[argi];
1837 var = va_arg(vargs,
VALUE *);
1838 if (var) *var =
hash;
1842 var = va_arg(vargs,
VALUE *);
1864 const char *
msg =
"";
1881 for (i = 0; i < keywords; i++) {
1903 VALUE parthash[2] = {0, 0};
1911 *orighash = parthash[1];
1923 #define extract_kwarg(keyword, val) \
1924 (key = (st_data_t)(keyword), values ? \
1925 st_delete(rb_hash_tbl_raw(keyword_hash), &key, (val)) : \
1926 st_lookup(rb_hash_tbl_raw(keyword_hash), key, (val)))
1930 optional = -1-optional;
1933 for (j = 0; j < required + optional; j++) {
1938 for (; i < required; i++) {
1943 if (values) values[i] = (
VALUE)val;
1950 if (!
NIL_P(missing)) {
1955 if (optional && keyword_hash) {
1956 for (i = 0; i < optional; i++) {
1959 if (values) values[required+i] = (
VALUE)val;
1964 if (!rest && keyword_hash) {
1965 if (
RHASH_SIZE(keyword_hash) > (
unsigned int)j) {
1970 #undef extract_kwarg
static VALUE make_metaclass(VALUE klass)
Creates a metaclass of klass.
static void rb_module_add_to_subclasses_list(VALUE module, VALUE iclass)
static void rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
int rb_st_insert_id_and_value(VALUE obj, st_table *tbl, ID key, VALUE value)
void rb_class_remove_from_super_subclasses(VALUE klass)
#define UNDEFINED_METHOD_ENTRY_P(me)
void rb_class_detach_subclasses(VALUE klass)
VALUE rb_define_module_id_under(VALUE outer, ID id)
void rb_vm_check_redefinition_by_prepend(VALUE klass)
RUBY_EXTERN VALUE rb_cFalseClass
VALUE rb_mod_include_p(VALUE mod, VALUE mod2)
void rb_bug(const char *fmt,...)
int rb_vm_add_root_module(ID id, VALUE module)
void rb_check_inheritable(VALUE super)
Ensures a class can be derived from super.
static int ins_methods_push(ID name, long type, VALUE ary, long visi)
#define RCLASS_CONST_TBL(c)
VALUE rb_obj_private_methods(int argc, VALUE *argv, VALUE obj)
#define RB_OBJ_WRITTEN(a, oldv, b)
rb_subclass_entry_t * next
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
void rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE))
#define rb_usascii_str_new2
VALUE rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
VALUE rb_define_class_id_under(VALUE outer, ID id, VALUE super)
Defines a class under the namespace of outer.
void rb_class_remove_from_module_subclasses(VALUE klass)
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
int st_insert(st_table *, st_data_t, st_data_t)
static VALUE class_alloc(VALUE flags, VALUE klass)
Allocates a struct RClass for a new class.
#define OBJ_INIT_COPY(obj, orig)
struct rb_method_entry_struct * orig_me
VALUE rb_mod_ancestors(VALUE mod)
VALUE rb_refinement_module_get_refined_class(VALUE module)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_singleton_class_clone(VALUE obj)
void st_free_table(st_table *)
struct st_table * rb_hash_tbl_raw(VALUE hash)
VALUE rb_mod_init_copy(VALUE clone, VALUE orig)
VALUE rb_ary_tmp_new(long capa)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
void Init_class_hierarchy(void)
#define RBASIC_SET_CLASS(obj, cls)
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
static int ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_ivar_get(VALUE, ID)
#define SET_METACLASS_OF(k, cls)
static int clone_const_i(st_data_t key, st_data_t value, st_data_t data)
void rb_clear_constant_cache(void)
int rb_const_defined(VALUE, ID)
#define RCLASS_M_TBL_WRAPPER(c)
union rb_method_definition_struct::@126 body
void rb_include_module(VALUE klass, VALUE module)
void rb_define_protected_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
void rb_define_global_function(const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a global function.
void rb_undef_method(VALUE klass, const char *name)
const char * rb_obj_classname(VALUE)
RUBY_SYMBOL_EXPORT_BEGIN typedef unsigned long st_data_t
void rb_name_error(ID id, const char *fmt,...)
#define NEWOBJ_OF(obj, type, klass, flags)
void rb_free_m_tbl_wrapper(struct method_table_wrapper *wrapper)
void rb_prepend_module(VALUE klass, VALUE module)
VALUE rb_singleton_class(VALUE obj)
Returns the singleton class of obj.
VALUE rb_extract_keywords(VALUE *orighash)
#define RB_TYPE_P(obj, type)
int st_lookup(st_table *, st_data_t, st_data_t *)
VALUE rb_class_inherited(VALUE super, VALUE klass)
Calls Class::inherited.
NORETURN(static void keyword_error(const char *error, VALUE keys))
int rb_block_given_p(void)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
RUBY_EXTERN VALUE rb_cObject
VALUE rb_special_singleton_class(VALUE obj)
#define RMODULE_IS_REFINEMENT
#define RGENGC_WB_PROTECTED_CLASS
void rb_attr(VALUE, ID, int, int, int)
static VALUE boot_defclass(const char *name, VALUE super)
VALUE rb_class_real(VALUE)
RUBY_EXTERN VALUE rb_cBasicObject
static void clone_method(VALUE klass, ID mid, const rb_method_entry_t *me)
#define RMODULE_CONST_TBL(m)
#define OBJ_WB_UNPROTECT(x)
RUBY_EXTERN VALUE rb_mKernel
static VALUE RCLASS_SET_SUPER(VALUE klass, VALUE super)
void st_add_direct(st_table *, st_data_t, st_data_t)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
RUBY_EXTERN VALUE rb_cTrueClass
static VALUE special_singleton_class_of(VALUE obj)
int st_delete(st_table *, st_data_t *, st_data_t *)
void rb_class_subclass_add(VALUE super, VALUE klass)
VALUE rb_define_module_id(ID id)
#define META_CLASS_OF_CLASS_CLASS_P(k)
whether k is a meta^(n)-class of Class class
static void RCLASS_M_TBL_INIT(VALUE c)
RUBY_EXTERN VALUE rb_cModule
void rb_gc_register_mark_object(VALUE obj)
#define MEMCPY(p1, p2, type, n)
VALUE rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj)
rb_method_entry_t * rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me, VALUE *defined_class_ptr)
rb_method_entry_t * rb_method_entry(VALUE klass, ID id, VALUE *define_class_ptr)
int rb_obj_basic_to_s_p(VALUE obj)
#define RCLASS_REFINED_CLASS(c)
VALUE rb_const_get(VALUE, ID)
VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase)
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
void rb_define_module_function(VALUE module, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a module function for module.
static int add_refined_method_entry_i(st_data_t key, st_data_t value, st_data_t data)
SSL_METHOD *(* func)(void)
static VALUE class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int(*func)(st_data_t, st_data_t, st_data_t))
VALUE rb_hash_delete(VALUE hash, VALUE key)
VALUE rb_include_class_new(VALUE module, VALUE super)
void rb_fatal(const char *fmt,...)
rb_method_entry_t * rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_flag_t noex)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_check_hash_type(VALUE hash)
static int separate_symbol(st_data_t key, st_data_t value, st_data_t arg)
static int ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
void rb_clear_method_cache_by_class(VALUE)
void rb_const_set(VALUE, ID, VALUE)
#define extract_kwarg(keyword, val)
static int include_modules_at(const VALUE klass, VALUE c, VALUE module)
VALUE rb_obj_public_methods(int argc, VALUE *argv, VALUE obj)
static int ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
void rb_name_class(VALUE, ID)
const char * rb_class2name(VALUE)
VALUE rb_make_metaclass(VALUE obj, VALUE unused)
void rb_alias(VALUE, ID, ID)
static int clone_const(ID key, const rb_const_entry_t *ce, struct clone_const_arg *arg)
RUBY_EXTERN VALUE rb_cClass
st_table * st_init_numtable(void)
void rb_class_detach_module_subclasses(VALUE klass)
VALUE rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
void rb_free_const_table(st_table *tbl)
VALUE rb_define_module_under(VALUE outer, const char *name)
VALUE rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
int rb_const_defined_at(VALUE, ID)
void rb_define_method_id(VALUE klass, ID mid, VALUE(*func)(ANYARGS), int argc)
VALUE rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
void rb_singleton_class_attached(VALUE klass, VALUE obj)
Attach a object to a singleton class.
static void unknown_keyword_error(VALUE hash, const ID *table, int keywords)
#define UNLIMITED_ARGUMENTS
VALUE rb_module_new(void)
#define RARRAY_AREF(a, i)
#define ENSURE_EIGENCLASS(klass)
ensures klass belongs to its own eigenclass.
VALUE rb_block_proc(void)
VALUE rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
rb_method_definition_t * def
void rb_define_attr(VALUE klass, const char *name, int read, int write)
Defines (a) public accessor method(s) for an attribute.
void rb_error_arity(int argc, int min, int max)
#define RCLASS_IV_INDEX_TBL(c)
static VALUE make_singleton_class(VALUE obj)
Creates a singleton class for obj.
VALUE rb_singleton_class_get(VALUE obj)
Returns the singleton class of obj, or nil if obj is not a singleton object.
static int method_entry_i(st_data_t key, st_data_t value, st_data_t data)
st_table * rb_st_copy(VALUE obj, struct st_table *orig_tbl)
struct rb_encoding_entry * list
VALUE rb_obj_methods(int argc, VALUE *argv, VALUE obj)
void rb_add_refined_method_entry(VALUE refined_class, ID mid)
static int ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
static unsigned int hash(const char *str, unsigned int len)
VALUE rb_ary_join(VALUE ary, VALUE sep)
static int move_refined_method(st_data_t key, st_data_t value, st_data_t data)
VALUE rb_const_get_at(VALUE, ID)
void rb_frozen_class_p(VALUE klass)
static void class_init_copy_check(VALUE clone, VALUE orig)
#define GetISeqPtr(obj, ptr)
#define RMODULE_INCLUDED_INTO_REFINEMENT
const char * rb_id2name(ID id)
VALUE rb_mod_included_modules(VALUE mod)
VALUE rb_define_class_id(ID id, VALUE super)
Defines a new class.
rb_serial_t rb_next_class_serial(void)
#define SPECIAL_SINGLETON(x, c)
rb_method_entry_t * rb_method_entry_set(VALUE klass, ID mid, const rb_method_entry_t *, rb_method_flag_t noex)
#define CONST_ID(var, str)
#define SPECIAL_CONST_P(x)
VALUE rb_define_module(const char *name)
static void keyword_error(const char *error, VALUE keys)
static VALUE singleton_class_of(VALUE obj)
static int clone_method_i(st_data_t key, st_data_t value, st_data_t data)
void rb_add_method_cfunc(VALUE klass, ID mid, VALUE(*func)(ANYARGS), int argc, rb_method_flag_t noex)
VALUE rb_class_new(VALUE super)
Creates a new class.
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
int st_foreach(st_table *, int(*)(ANYARGS), st_data_t)
void rb_warn(const char *fmt,...)
VALUE rb_class_boot(VALUE super)
A utility function that wraps class_alloc.
RUBY_EXTERN VALUE rb_cNilClass
void rb_set_class_path_string(VALUE, VALUE, VALUE)
#define RB_OBJ_WRITE(a, slot, b)
VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)