Ruby
2.7.2p137(2020-10-01revision5445e0435260b449decf2ac16f9d09bae3cafe72)
|
Go to the documentation of this file.
33 #define id_attached id__attached__
40 if (super && super !=
Qundef) {
57 rb_module_add_to_subclasses_list(
VALUE module,
VALUE iclass)
62 entry->
klass = iclass;
186 RCLASS_M_TBL_INIT(
VALUE c)
205 RCLASS_SET_SUPER(
klass, super);
206 RCLASS_M_TBL_INIT(
klass);
267 clone_method_i(
ID key,
VALUE value,
void *data)
292 clone_const_i(
ID key,
VALUE value,
void *data)
298 class_init_copy_check(
VALUE clone,
VALUE orig)
322 class_init_copy_check(clone, orig);
360 arg.old_klass = orig;
361 arg.new_klass = clone;
362 RCLASS_M_TBL_INIT(clone);
407 RCLASS_M_TBL_INIT(clone);
411 arg.new_klass = clone;
438 #define METACLASS_OF(k) RBASIC(k)->klass
439 #define SET_METACLASS_OF(k, cls) RBASIC_SET_CLASS(k, cls)
446 #define META_CLASS_OF_CLASS_CLASS_P(k) (METACLASS_OF(k) == (k))
449 rb_singleton_class_has_metaclass_p(
VALUE sklass)
458 !rb_singleton_class_has_metaclass_p(sklass));
466 #define HAVE_METACLASS_P(k) \
467 (FL_TEST(METACLASS_OF(k), FL_SINGLETON) && \
468 rb_singleton_class_has_metaclass_p(k))
477 #define ENSURE_EIGENCLASS(klass) \
478 (HAVE_METACLASS_P(klass) ? METACLASS_OF(klass) : make_metaclass(klass))
538 boot_defclass(
const char *
name,
VALUE super)
583 return make_metaclass(
obj);
586 return make_singleton_class(
obj);
761 RCLASS_M_TBL_INIT(mdl);
834 module =
RBASIC(module)->klass;
845 RCLASS_SET_SUPER(
klass, super);
863 if (!
NIL_P(rb_refinement_module_get_refined_class(module))) {
873 ensure_includable(
klass, module);
881 add_refined_method_entry_i(
ID key,
VALUE value,
void *data)
893 int method_changed = 0, constant_changed = 0;
897 ensure_origin(module);
901 int superclass_seen =
FALSE;
911 if (!superclass_seen) {
918 if (!search_super)
break;
919 superclass_seen =
TRUE;
923 c = RCLASS_SET_SUPER(c, iclass);
924 RCLASS_SET_INCLUDER(iclass,
klass);
929 rb_module_add_to_subclasses_list(m, iclass);
933 VALUE refined_class =
934 rb_refinement_module_get_refined_class(
klass);
952 return method_changed;
956 move_refined_method(
ID key,
VALUE value,
void *data)
986 if (origin ==
klass) {
990 RCLASS_SET_SUPER(
klass, origin);
991 RCLASS_SET_ORIGIN(
klass, origin);
993 RCLASS_M_TBL_INIT(
klass);
1003 ensure_includable(
klass, module);
1004 ensure_origin(
klass);
1129 ins_methods_push(
name, ary);
1139 ins_methods_push(
name, ary);
1148 ins_methods_push(
name, ary);
1157 ins_methods_push(
name, ary);
1168 method_entry_i(
ID key,
VALUE value,
void *data)
1203 if (!
mod)
return false;
1223 add_instance_method_list(
mod, &me_arg);
1233 add_instance_method_list(
mod, &me_arg);
1274 return class_instance_method_list(
argc,
argv,
mod, 0, ins_methods_i);
1289 return class_instance_method_list(
argc,
argv,
mod, 0, ins_methods_prot_i);
1312 return class_instance_method_list(
argc,
argv,
mod, 0, ins_methods_priv_i);
1327 return class_instance_method_list(
argc,
argv,
mod, 0, ins_methods_pub_i);
1538 #ifdef rb_define_method_id
1539 #undef rb_define_method_id
1547 #ifdef rb_define_method
1548 #undef rb_define_method
1556 #ifdef rb_define_protected_method
1557 #undef rb_define_protected_method
1565 #ifdef rb_define_private_method
1566 #undef rb_define_private_method
1605 #define SPECIAL_SINGLETON(x,c) do {\
1612 special_singleton_class_of(
VALUE obj)
1623 return special_singleton_class_of(
obj);
1645 klass = special_singleton_class_of(
obj);
1647 rb_bug(
"unknown immediate %p", (
void *)
obj);
1744 #ifdef rb_define_singleton_method
1745 #undef rb_define_singleton_method
1760 #ifdef rb_define_module_function
1761 #undef rb_define_module_function
1777 #ifdef rb_define_global_function
1778 #undef rb_define_global_function
1829 if (++
i >=
len)
break;
1846 unknown_keyword_error(
VALUE hash,
const ID *table,
int keywords)
1849 for (
i = 0;
i < keywords;
i++) {
1870 VALUE parthash[2] = {0, 0};
1871 VALUE hash = *orighash;
1878 *orighash = parthash[1];
1893 #define extract_kwarg(keyword, val) \
1894 (key = (st_data_t)(keyword), values ? \
1895 (rb_hash_stlike_delete(keyword_hash, &key, &(val)) || ((val) = Qundef, 0)) : \
1896 rb_hash_stlike_lookup(keyword_hash, key, NULL))
1898 if (
NIL_P(keyword_hash)) keyword_hash = 0;
1905 for (;
i < required;
i++) {
1915 if (!
NIL_P(missing)) {
1916 rb_keyword_error(
"missing", missing);
1927 if (!rest && keyword_hash) {
1928 if (
RHASH_SIZE(keyword_hash) > (
unsigned int)(values ? 0 : j)) {
1929 unknown_keyword_error(keyword_hash, table, required+
optional);
1932 if (values && !keyword_hash) {
1938 #undef extract_kwarg
1962 const char *p =
fmt;
1963 VALUE *tmp_buffer =
arg->tmp_buffer;
1964 int keyword_given = 0;
1965 int empty_keyword_given = 0;
1966 int last_hash_keyword = 0;
1982 empty_keyword_given = 1;
1985 last_hash_keyword = 1;
1990 arg->n_lead = *p -
'0';
1993 arg->n_opt = *p -
'0';
2002 arg->n_trail = *p -
'0';
2016 arg->n_mand =
arg->n_lead +
arg->n_trail;
2020 if (
argc > 0 && !(
arg->f_hash && empty_keyword_given)) {
2024 if (keyword_given) {
2026 rb_warn(
"Keyword flag set when calling rb_scan_args, but last entry is not a hash");
2038 rb_warn(
"The last argument is nil, treating as empty keywords");
2050 if (!(
arg->last_hash =
arg->hash)) {
2051 if (!keyword_given && !last_hash_keyword) {
2054 rb_warn(
"Using the last argument as keyword parameters is deprecated");
2061 rb_warn(
"The last argument is split into positional and keyword parameters");
2064 arg->hash = opts ? opts :
Qnil;
2067 else if (
arg->f_hash && keyword_given &&
arg->n_mand ==
argc) {
2069 rb_warn(
"Passing the keyword argument as the last hash parameter is deprecated");
2072 if (
arg->f_hash &&
arg->n_mand ==
argc+1 && empty_keyword_given) {
2078 rb_warn(
"Passing the keyword argument as the last hash parameter is deprecated");
2092 if (
arg->argc <
arg->n_mand) {
2097 for (
i =
arg->n_lead;
i-- > 0; ) {
2099 if (var) *var = (argi ==
arg->last_idx) ?
arg->last_hash :
arg->argv[argi];
2103 for (
i =
arg->n_opt;
i-- > 0; ) {
2105 if (argi < arg->
argc -
arg->n_trail) {
2106 if (var) *var = (argi ==
arg->last_idx) ?
arg->last_hash :
arg->argv[argi];
2110 if (var) *var =
Qnil;
2115 int n_var =
arg->argc - argi -
arg->n_trail;
2120 int f_last = (
arg->last_idx + 1 ==
arg->argc -
arg->n_trail);
2131 for (
i =
arg->n_trail;
i-- > 0; ) {
2133 if (var) *var = (argi ==
arg->last_idx) ?
arg->last_hash :
arg->argv[argi];
2139 if (var) *var =
arg->hash;
2152 if (argi < arg->
argc)
return 1;
2163 VALUE tmp_buffer = 0;
void Init_class_hierarchy(void)
void rb_prepend_module(VALUE klass, VALUE module)
rb_subclass_entry_t * next
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
void rb_define_method_id(VALUE klass, ID mid, VALUE(*func)(ANYARGS), int argc)
void rb_include_module(VALUE klass, VALUE module)
MJIT_FUNC_EXPORTED VALUE rb_class_inherited(VALUE super, VALUE klass)
Calls Class::inherited.
VALUE rb_exc_new_str(VALUE etype, VALUE str)
void rb_class_modify_check(VALUE klass)
Asserts that klass is not a frozen class.
int rb_const_defined(VALUE, ID)
@ VM_METHOD_TYPE_REFINED
refinement
int rb_class_has_methods(VALUE c)
NORETURN(static void rb_keyword_error(const char *error, VALUE keys))
@ RMODULE_INCLUDED_INTO_REFINEMENT
void rb_gc_register_mark_object(VALUE obj)
VALUE rb_define_module_under(VALUE outer, const char *name)
size_t rb_id_table_size(const struct rb_id_table *tbl)
void rb_warn(const char *fmt,...)
int rb_block_given_p(void)
Determines if the current method is given a block.
void rb_add_method_iseq(VALUE klass, ID mid, const rb_iseq_t *iseq, rb_cref_t *cref, rb_method_visibility_t visi)
int rb_singleton_class_internal_p(VALUE sklass)
void rb_define_attr(VALUE klass, const char *name, int read, int write)
Defines (a) public accessor method(s) for an attribute.
rb_cref_t * cref
class reference, should be marked
#define st_is_member(table, key)
#define RB_FL_SET_RAW(x, f)
void rb_class_remove_from_module_subclasses(VALUE klass)
int rb_class_ivar_set(VALUE klass, ID vid, VALUE value)
int rb_empty_keyword_given_p(void)
VALUE rb_attr_get(VALUE, ID)
void rb_iv_tbl_copy(VALUE dst, VALUE src)
st_table * st_init_numtable(void)
VALUE rb_singleton_class_clone(VALUE obj)
VALUE rb_module_new(void)
void rb_clear_method_cache_by_class(VALUE)
VALUE rb_mod_init_copy(VALUE clone, VALUE orig)
#define ENSURE_EIGENCLASS(klass)
ensures klass belongs to its own eigenclass.
int st_delete(st_table *tab, st_data_t *key, st_data_t *value)
#define RB_TYPE_P(obj, type)
#define rb_intern_const(str)
RUBY_EXTERN VALUE rb_cModule
void st_add_direct(st_table *tab, st_data_t key, st_data_t value)
void rb_free_const_table(struct rb_id_table *tbl)
VALUE rb_define_module(const char *name)
rb_id_table_iterator_result
VALUE rb_const_get_at(VALUE, ID)
void rb_define_global_function(const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a global function.
VALUE rb_inspect(VALUE)
Convenient wrapper of Object::inspect.
int rb_id_table_insert(struct rb_id_table *tbl, ID id, VALUE val)
rb_method_refined_t refined
void rb_class_detach_module_subclasses(VALUE klass)
struct rb_method_entry_struct * orig_me
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
VALUE rb_singleton_class_get(VALUE obj)
Returns the singleton class of obj, or nil if obj is not a singleton object.
void rb_const_set(VALUE, ID, VALUE)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
MJIT_FUNC_EXPORTED VALUE rb_hash_keys(VALUE hash)
void rb_freeze_singleton_class(VALUE x)
void rb_define_protected_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
void rb_class_subclass_add(VALUE super, VALUE klass)
rb_iseq_t * iseqptr
iseq pointer, should be separated from iseqval
void rb_method_entry_copy(rb_method_entry_t *dst, const rb_method_entry_t *src)
RUBY_EXTERN VALUE rb_cClass
void rb_add_method_cfunc(VALUE klass, ID mid, VALUE(*func)(ANYARGS), int argc, rb_method_visibility_t visi)
#define SPECIAL_CONST_P(x)
int rb_scan_args_kw(int kw_flag, int argc, const VALUE *argv, const char *fmt,...)
void rb_class_remove_from_super_subclasses(VALUE klass)
#define RBASIC_SET_CLASS(obj, cls)
rb_method_entry_t * rb_method_entry_set(VALUE klass, ID mid, const rb_method_entry_t *, rb_method_visibility_t noex)
void rb_fatal(const char *fmt,...)
const rb_method_entry_t * rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me)
void rb_free_tmp_buffer(volatile VALUE *store)
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
void rb_undef_method(VALUE klass, const char *name)
#define RMODULE_CONST_TBL(m)
#define UNLIMITED_ARGUMENTS
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_ivar_get(VALUE, ID)
VALUE rb_obj_class(VALUE)
Equivalent to Object#class in Ruby.
VALUE rb_special_singleton_class(VALUE obj)
void rb_alias(VALUE, ID, ID)
VALUE rb_define_class_id(ID id, VALUE super)
Defines a new class.
RUBY_EXTERN VALUE rb_cNilClass
#define OBJ_WB_UNPROTECT(x)
VALUE rb_define_module_id_under(VALUE outer, ID id)
void rb_id_table_foreach(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, void *data)
void rb_undef_methods_from(VALUE klass, VALUE super)
RUBY_EXTERN VALUE rb_cBasicObject
#define RB_SCAN_ARGS_LAST_HASH_KEYWORDS
#define RCLASS_CONST_TBL(c)
VALUE rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj)
#define METHOD_ENTRY_VISI(me)
int rb_hash_stlike_delete(VALUE hash, st_data_t *pkey, st_data_t *pval)
VALUE rb_ary_tmp_new(long capa)
unsigned long rb_serial_t
void rb_singleton_class_attached(VALUE klass, VALUE obj)
Attach a object to a singleton class.
#define RB_OBJ_WRITTEN(a, oldv, b)
void rb_clear_constant_cache(void)
VALUE rb_class_private_instance_methods(int argc, const VALUE *argv, VALUE mod)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_include_class_new(VALUE module, VALUE super)
VALUE rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
int rb_vm_add_root_module(ID id, VALUE module)
#define RARRAY_AREF(a, i)
#define RBASIC_CLASS(obj)
RUBY_EXTERN VALUE rb_cFalseClass
VALUE rb_class_boot(VALUE super)
A utility function that wraps class_alloc.
void rb_add_refined_method_entry(VALUE refined_class, ID mid)
VALUE rb_mod_included_modules(VALUE mod)
void rb_hash_foreach(VALUE hash, rb_foreach_func *func, VALUE farg)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
MJIT_STATIC void rb_error_arity(int argc, int min, int max)
#define RB_OBJ_WRITE(a, slot, b)
#define CONST_ID(var, str)
void rb_set_class_path_string(VALUE, VALUE, VALUE)
const rb_method_entry_t * rb_method_entry_clone(const rb_method_entry_t *me)
#define RCLASS_REFINED_CLASS(c)
void rb_vm_rewrite_cref(rb_cref_t *node, VALUE old_klass, VALUE new_klass, rb_cref_t **new_cref_ptr)
VALUE rb_class_new(VALUE super)
Creates a new class.
int st_foreach(st_table *tab, st_foreach_callback_func *func, st_data_t arg)
void rb_define_module_function(VALUE module, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a module function for module.
VALUE rb_check_hash_type(VALUE hash)
#define FL_TEST_RAW(x, f)
RUBY_EXTERN VALUE rb_cObject
VALUE rb_extract_keywords(VALUE *orighash)
void rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_visibility_t visi)
void rb_exc_raise(VALUE mesg)
Raises an exception in the current thread.
VALUE rb_str_append(VALUE, VALUE)
void rb_bug(const char *fmt,...)
#define OBJ_INIT_COPY(obj, orig)
RUBY_EXTERN VALUE rb_mKernel
#define SET_METACLASS_OF(k, cls)
VALUE rb_class_protected_instance_methods(int argc, const VALUE *argv, VALUE mod)
VALUE rb_sprintf(const char *format,...)
rb_serial_t rb_next_class_serial(void)
union rb_method_definition_struct::@0 body
void rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE, VALUE), VALUE arg)
#define MEMCPY(p1, p2, type, n)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
#define OBJ_FREEZE_RAW(x)
struct rb_id_table * rb_id_table_create(size_t capa)
@ VM_METHOD_TYPE_ISEQ
Ruby method.
VALUE rb_singleton_class(VALUE obj)
Returns the singleton class of obj.
RUBY_EXTERN VALUE rb_cTrueClass
VALUE rb_define_module_id(ID id)
VALUE rb_make_metaclass(VALUE obj, VALUE unused)
#define RGENGC_WB_PROTECTED_CLASS
VALUE rb_obj_private_methods(int argc, const VALUE *argv, VALUE obj)
#define MJIT_FUNC_EXPORTED
VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
struct rb_method_definition_struct *const def
VALUE rb_class_path(VALUE)
int rb_keyword_given_p(void)
void rb_vm_check_redefinition_by_prepend(VALUE klass)
void rb_class_detach_subclasses(VALUE klass)
#define RCLASS_REFINED_BY_ANY
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
int rb_const_defined_at(VALUE, ID)
VALUE rb_mod_include_p(VALUE mod, VALUE mod2)
#define RB_SCAN_ARGS_PASS_CALLED_KEYWORDS
#define NEWOBJ_OF(obj, type, klass, flags)
VALUE rb_class_instance_methods(int argc, const VALUE *argv, VALUE mod)
#define META_CLASS_OF_CLASS_CLASS_P(k)
whether k is a meta^(n)-class of Class class
#define RB_SCAN_ARGS_KEYWORDS
#define rb_fstring_lit(str)
VALUE rb_define_class_id_under(VALUE outer, ID id, VALUE super)
Defines a class under the namespace of outer.
MJIT_FUNC_EXPORTED VALUE rb_keyword_error_new(const char *error, VALUE keys)
void st_free_table(st_table *tab)
VALUE rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
VALUE rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
#define SPECIAL_SINGLETON(x, c)
#define extract_kwarg(keyword, val)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
#define RB_OBJ_FROZEN_RAW(x)
void rb_attr(VALUE, ID, int, int, int)
VALUE type(ANYARGS)
ANYARGS-ed function type.
VALUE rb_class_public_instance_methods(int argc, const VALUE *argv, VALUE mod)
VALUE rb_mod_ancestors(VALUE mod)
#define UNDEFINED_METHOD_ENTRY_P(me)
void rb_check_inheritable(VALUE super)
Ensures a class can be derived from super.
VALUE rb_class_real(VALUE cl)
Looks up the nearest ancestor of cl, skipping singleton classes or module inclusions.
#define RB_SCAN_ARGS_EMPTY_KEYWORDS
VALUE rb_block_proc(void)
VALUE rb_const_get(VALUE, ID)