14#include "ruby/internal/config.h"
25#include "internal/array.h"
26#include "internal/class.h"
27#include "internal/error.h"
28#include "internal/eval.h"
29#include "internal/inits.h"
30#include "internal/numeric.h"
31#include "internal/object.h"
32#include "internal/struct.h"
33#include "internal/string.h"
34#include "internal/st.h"
35#include "internal/symbol.h"
36#include "internal/variable.h"
75static VALUE rb_cNilClass_to_s;
76static VALUE rb_cTrueClass_to_s;
77static VALUE rb_cFalseClass_to_s;
83#define id_match idEqTilde
84#define id_inspect idInspect
85#define id_init_copy idInitialize_copy
86#define id_init_clone idInitialize_clone
87#define id_init_dup idInitialize_dup
88#define id_const_missing idConst_missing
91#define CLASS_OR_MODULE_P(obj) \
92 (!SPECIAL_CONST_P(obj) && \
93 (BUILTIN_TYPE(obj) == T_CLASS || BUILTIN_TYPE(obj) == T_MODULE))
100 return offsetof(
struct RObject, as.ary) + (
sizeof(
VALUE) * numiv);
107 RBASIC_CLEAR_CLASS(obj);
116 RBASIC_SET_CLASS(obj, klass);
122rb_class_allocate_instance(
VALUE klass)
124 uint32_t index_tbl_num_entries = RCLASS_EXT(klass)->max_iv_count;
127 if (!rb_gc_size_allocatable_p(size)) {
131 NEWOBJ_OF(o,
struct RObject, klass,
138 ROBJECT_SET_SHAPE_ID(obj, (shape_id_t)(rb_gc_heap_id_for_size(size) + FIRST_T_OBJECT_SHAPE_ID));
143 for (
size_t i = 0; i < ROBJECT_IV_CAPACITY(obj); i++) {
155 RBASIC(obj)->flags = (
type & ~ignored_flags) | (
RBASIC(obj)->flags & ignored_flags);
156 RBASIC_SET_CLASS(obj, klass);
174#define case_equal rb_equal
183 if (obj1 == obj2)
return Qtrue;
184 result = rb_equal_opt(obj1, obj2);
185 if (UNDEF_P(result)) {
188 return RBOOL(
RTEST(result));
196 if (obj1 == obj2)
return TRUE;
197 result = rb_eql_opt(obj1, obj2);
198 if (UNDEF_P(result)) {
201 return RTEST(result);
210 return RBOOL(obj1 == obj2);
222 return RBOOL(!
RTEST(obj));
233 return rb_obj_not(result);
270rb_obj_singleton_class(
VALUE obj)
282 rb_shape_t * src_shape = rb_shape_get_shape(obj);
284 if (rb_shape_obj_too_complex(obj)) {
286 st_table *table = st_copy(ROBJECT_IV_HASH(obj));
287 rb_obj_convert_to_too_complex(dest, table);
292 uint32_t src_num_ivs = RBASIC_IV_COUNT(obj);
293 rb_shape_t * shape_to_set_on_dest = src_shape;
302 if (rb_shape_frozen_shape_p(src_shape)) {
303 shape_to_set_on_dest = rb_shape_get_parent(src_shape);
309 rb_shape_t * initial_shape = rb_shape_get_shape(dest);
311 if (initial_shape->heap_index != src_shape->heap_index) {
312 RUBY_ASSERT(initial_shape->type == SHAPE_T_OBJECT);
314 shape_to_set_on_dest = rb_shape_rebuild_shape(initial_shape, src_shape);
315 if (UNLIKELY(rb_shape_id(shape_to_set_on_dest) == OBJ_TOO_COMPLEX_SHAPE_ID)) {
316 st_table * table = rb_st_init_numtable_with_size(src_num_ivs);
317 rb_obj_copy_ivs_to_hash_table(obj, table);
318 rb_obj_convert_to_too_complex(dest, table);
324 RUBY_ASSERT(src_num_ivs <= shape_to_set_on_dest->capacity || rb_shape_id(shape_to_set_on_dest) == OBJ_TOO_COMPLEX_SHAPE_ID);
325 if (initial_shape->capacity < shape_to_set_on_dest->capacity) {
326 rb_ensure_iv_list_size(dest, initial_shape->capacity, shape_to_set_on_dest->capacity);
333 for (uint32_t i = 0; i < src_num_ivs; i++) {
337 rb_shape_set_shape(dest, shape_to_set_on_dest);
349 rb_gc_copy_attributes(dest, obj);
352 rb_obj_copy_ivar(dest, obj);
358PUREFUNC(
static inline int special_object_p(
VALUE obj));
360special_object_p(
VALUE obj)
377obj_freeze_opt(
VALUE freeze)
385 rb_raise(rb_eArgError,
"unexpected value for freeze: %"PRIsVALUE,
rb_obj_class(freeze));
394 VALUE kwfreeze = obj_freeze_opt(freeze);
395 if (!special_object_p(obj))
396 return mutable_obj_clone(obj, kwfreeze);
397 return immutable_obj_clone(obj, kwfreeze);
402rb_immutable_obj_clone(
int argc,
VALUE *argv,
VALUE obj)
404 VALUE kwfreeze = rb_get_freeze_opt(argc, argv);
405 return immutable_obj_clone(obj, kwfreeze);
409rb_get_freeze_opt(
int argc,
VALUE *argv)
411 static ID keyword_ids[1];
415 if (!keyword_ids[0]) {
421 if (!UNDEF_P(kwfreeze))
422 kwfreeze = obj_freeze_opt(kwfreeze);
431 rb_raise(rb_eArgError,
"can't unfreeze %"PRIsVALUE,
441 VALUE singleton = rb_singleton_class_clone_and_attach(obj, clone);
442 RBASIC_SET_CLASS(clone, singleton);
443 if (RCLASS_SINGLETON_P(singleton)) {
447 init_copy(clone, obj);
459 rb_shape_t * next_shape = rb_shape_transition_shape_frozen(clone);
460 if (!rb_shape_obj_too_complex(clone) && next_shape->type == SHAPE_OBJ_TOO_COMPLEX) {
461 rb_evict_ivars_to_hash(clone);
464 rb_shape_set_shape(clone, next_shape);
469 static VALUE freeze_true_hash;
470 if (!freeze_true_hash) {
471 freeze_true_hash = rb_hash_new();
472 rb_vm_register_global_object(freeze_true_hash);
473 rb_hash_aset(freeze_true_hash,
ID2SYM(idFreeze),
Qtrue);
478 argv[1] = freeze_true_hash;
481 rb_shape_t * next_shape = rb_shape_transition_shape_frozen(clone);
484 if (!rb_shape_obj_too_complex(clone) && next_shape->type == SHAPE_OBJ_TOO_COMPLEX) {
485 rb_evict_ivars_to_hash(clone);
488 rb_shape_set_shape(clone, next_shape);
493 static VALUE freeze_false_hash;
494 if (!freeze_false_hash) {
495 freeze_false_hash = rb_hash_new();
496 rb_vm_register_global_object(freeze_false_hash);
497 rb_hash_aset(freeze_false_hash,
ID2SYM(idFreeze),
Qfalse);
502 argv[1] = freeze_false_hash;
507 rb_bug(
"invalid kwfreeze passed to mutable_obj_clone");
517 return rb_obj_clone_setup(obj, clone, kwfreeze);
523 if (special_object_p(obj))
return obj;
524 return mutable_obj_clone(obj,
Qnil);
580 if (special_object_p(obj)) {
584 return rb_obj_dup_setup(obj, dup);
599rb_obj_itself(
VALUE obj)
618 if (obj == orig)
return obj;
619 rb_check_frozen(obj);
621 rb_raise(
rb_eTypeError,
"initialize_copy should take same class object");
650 if (
rb_scan_args(argc, argv,
"1:", &orig, &opts) < argc) {
652 rb_get_freeze_opt(1, &opts);
674 str = rb_sprintf(
"#<%"PRIsVALUE
":%p>", cname, (
void*)obj);
685 if (enc == NULL) enc = rb_default_external_encoding();
686 if (!rb_enc_asciicompat(enc)) {
688 return rb_str_escape(str);
692 return rb_str_escape(str);
697inspect_i(
ID id,
VALUE value, st_data_t a)
702 if (
CLASS_OF(value) == 0)
return ST_CONTINUE;
704 if (RSTRING_PTR(str)[0] ==
'-') {
705 RSTRING_PTR(str)[0] =
'#';
711 rb_str_catf(str,
"%"PRIsVALUE
"=", rb_id2str(
id));
727 RSTRING_PTR(str)[0] =
'#';
760rb_obj_inspect(
VALUE obj)
766 str = rb_sprintf(
"-<%"PRIsVALUE
":%p", c, (
void*)obj);
775class_or_module_required(
VALUE c)
777 switch (OBJ_BUILTIN_TYPE(c)) {
811 c = class_or_module_required(c);
823 size_t c_depth = RCLASS_SUPERCLASS_DEPTH(c);
824 size_t cl_depth = RCLASS_SUPERCLASS_DEPTH(cl);
825 VALUE *classes = RCLASS_SUPERCLASSES(cl);
829 if (cl_depth <= c_depth)
833 return RBOOL(classes[c_depth] == c);
873 if (cl == c)
return Qtrue;
880 return class_search_class_ancestor(cl, c);
885 VALUE includer = RCLASS_INCLUDER(c);
886 if (cl == includer)
return Qtrue;
892 if (
RB_TYPE_P(includer,
T_CLASS) && class_search_class_ancestor(cl, includer))
897 return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c)));
901 return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c)));
914 if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
925 cl = class_or_module_required(cl);
926 c = class_or_module_required(c);
927 return class_search_ancestor(cl, RCLASS_ORIGIN(c));
958#define rb_obj_class_inherited rb_obj_dummy1
981#define rb_obj_mod_method_added rb_obj_dummy1
1008#define rb_obj_mod_method_removed rb_obj_dummy1
1035#define rb_obj_mod_method_undefined rb_obj_dummy1
1062#define rb_obj_singleton_method_added rb_obj_dummy1
1091#define rb_obj_singleton_method_removed rb_obj_dummy1
1116#define rb_obj_singleton_method_undefined rb_obj_dummy1
1162#define rb_obj_mod_const_added rb_obj_dummy1
1182#define rb_obj_mod_extended rb_obj_dummy1
1205#define rb_obj_mod_included rb_obj_dummy1
1225#define rb_obj_mod_prepended rb_obj_dummy1
1235#define rb_obj_initialize rb_obj_dummy0
1250 return rb_obj_dummy();
1256 return rb_obj_dummy();
1289 rb_bug(
"special consts should be frozen.");
1350rb_nil_to_s(
VALUE obj)
1352 return rb_cNilClass_to_s;
1388 return rb_hash_new();
1402nil_inspect(
VALUE obj)
1459rb_true_to_s(
VALUE obj)
1461 return rb_cTrueClass_to_s;
1480 return RBOOL(
RTEST(obj2));
1524 return rb_obj_not(obj2);
1546rb_false_to_s(
VALUE obj)
1548 return rb_cFalseClass_to_s;
1586#define false_or true_and
1601#define false_xor true_and
1646 return rb_obj_not(result);
1714rb_mod_to_s(
VALUE klass)
1717 VALUE refined_class, defined_at;
1719 if (RCLASS_SINGLETON_P(klass)) {
1721 VALUE v = RCLASS_ATTACHED_OBJECT(klass);
1723 if (CLASS_OR_MODULE_P(v)) {
1733 refined_class = rb_refinement_module_get_refined_class(klass);
1734 if (!
NIL_P(refined_class)) {
1739 CONST_ID(id_defined_at,
"__defined_at__");
1740 defined_at = rb_attr_get(klass, id_defined_at);
1758rb_mod_freeze(
VALUE mod)
1794 if (mod == arg)
return Qtrue;
1798 size_t mod_depth = RCLASS_SUPERCLASS_DEPTH(mod);
1799 size_t arg_depth = RCLASS_SUPERCLASS_DEPTH(arg);
1800 if (arg_depth < mod_depth) {
1802 return RCLASS_SUPERCLASSES(mod)[arg_depth] == arg ?
1806 else if (arg_depth > mod_depth) {
1808 return RCLASS_SUPERCLASSES(arg)[mod_depth] == mod ?
1821 if (class_search_ancestor(mod, RCLASS_ORIGIN(arg))) {
1825 if (class_search_ancestor(arg, mod)) {
1848 if (mod == arg)
return Qfalse;
1868 if (!CLASS_OR_MODULE_P(arg)) {
1891 if (mod == arg)
return Qfalse;
1892 return rb_mod_ge(mod, arg);
1912 if (mod == arg)
return INT2FIX(0);
1913 if (!CLASS_OR_MODULE_P(arg)) {
1925static VALUE rb_mod_initialize_exec(
VALUE module);
1954rb_mod_initialize(
VALUE module)
1956 return rb_mod_initialize_exec(module);
1960rb_mod_initialize_exec(
VALUE module)
1970rb_mod_initialize_clone(
int argc,
VALUE* argv,
VALUE clone)
1972 VALUE ret, orig, opts;
2011rb_class_initialize(
int argc,
VALUE *argv,
VALUE klass)
2025 rb_raise(
rb_eTypeError,
"can't inherit uninitialized class");
2028 RCLASS_SET_SUPER(klass, super);
2029 rb_make_metaclass(klass,
RBASIC(super)->klass);
2031 rb_mod_initialize_exec(klass);
2038rb_undefined_alloc(
VALUE klass)
2040 rb_raise(
rb_eTypeError,
"allocator undefined for %"PRIsVALUE,
2070rb_class_alloc_m(
VALUE klass)
2074 rb_raise(
rb_eTypeError,
"calling %"PRIsVALUE
".allocate is prohibited",
2077 return class_call_alloc_func(allocator, klass);
2081rb_class_alloc(
VALUE klass)
2084 return class_call_alloc_func(allocator, klass);
2088class_get_alloc_func(
VALUE klass)
2093 rb_raise(
rb_eTypeError,
"can't instantiate uninitialized class");
2095 if (RCLASS_SINGLETON_P(klass)) {
2096 rb_raise(
rb_eTypeError,
"can't create instance of singleton class");
2100 rb_undefined_alloc(klass);
2112 obj = (*allocator)(klass);
2124 return rb_class_alloc(klass);
2143 obj = rb_class_alloc(klass);
2155 obj = rb_class_alloc(klass);
2156 rb_obj_call_init_kw(obj, argc, argv, kw_splat);
2188 if (!RCLASS_SUPERCLASS_DEPTH(klass)) {
2192 super = RCLASS_SUPERCLASSES(klass)[RCLASS_SUPERCLASS_DEPTH(klass) - 1];
2201 return RCLASS(klass)->super;
2204static const char bad_instance_name[] =
"'%1$s' is not allowed as an instance variable name";
2205static const char bad_class_name[] =
"'%1$s' is not allowed as a class variable name";
2206static const char bad_const_name[] =
"wrong constant name %1$s";
2207static const char bad_attr_name[] =
"invalid attribute name '%1$s'";
2208#define wrong_constant_name bad_const_name
2211#define id_for_var(obj, name, type) id_for_setter(obj, name, type, bad_##type##_name)
2213#define id_for_setter(obj, name, type, message) \
2214 check_setter_id(obj, &(name), rb_is_##type##_id, rb_is_##type##_name, message, strlen(message))
2217 int (*valid_id_p)(
ID),
int (*valid_name_p)(
VALUE),
2218 const char *message,
size_t message_len)
2221 VALUE name = *pname;
2223 if (
id ? !valid_id_p(
id) : !valid_name_p(name)) {
2224 rb_name_err_raise_str(rb_fstring_new(message, message_len),
2231rb_is_attr_name(
VALUE name)
2233 return rb_is_local_name(name) || rb_is_const_name(name);
2245 ID id = id_for_var(obj, name, attr);
2246 if (!
id)
id = rb_intern_str(name);
2265rb_mod_attr_reader(
int argc,
VALUE *argv,
VALUE klass)
2270 for (i=0; i<argc; i++) {
2271 ID id = id_for_attr(klass, argv[i]);
2272 rb_attr(klass,
id, TRUE, FALSE, TRUE);
2273 rb_ary_push(names,
ID2SYM(
id));
2283rb_mod_attr(
int argc,
VALUE *argv,
VALUE klass)
2285 if (argc == 2 && (argv[1] ==
Qtrue || argv[1] ==
Qfalse)) {
2286 ID id = id_for_attr(klass, argv[0]);
2287 VALUE names = rb_ary_new();
2291 rb_ary_push(names,
ID2SYM(
id));
2292 if (argv[1] ==
Qtrue) rb_ary_push(names,
ID2SYM(rb_id_attrset(
id)));
2295 return rb_mod_attr_reader(argc, argv, klass);
2310rb_mod_attr_writer(
int argc,
VALUE *argv,
VALUE klass)
2315 for (i=0; i<argc; i++) {
2316 ID id = id_for_attr(klass, argv[i]);
2317 rb_attr(klass,
id, FALSE, TRUE, TRUE);
2318 rb_ary_push(names,
ID2SYM(rb_id_attrset(
id)));
2342rb_mod_attr_accessor(
int argc,
VALUE *argv,
VALUE klass)
2347 for (i=0; i<argc; i++) {
2348 ID id = id_for_attr(klass, argv[i]);
2350 rb_attr(klass,
id, TRUE, TRUE, TRUE);
2351 rb_ary_push(names,
ID2SYM(
id));
2352 rb_ary_push(names,
ID2SYM(rb_id_attrset(
id)));
2398rb_mod_const_get(
int argc,
VALUE *argv,
VALUE mod)
2402 const char *pbeg, *p, *path, *pend;
2407 recur = (argc == 1) ?
Qtrue : argv[1];
2410 if (!rb_is_const_sym(name))
goto wrong_name;
2412 if (!
id)
return rb_const_missing(mod, name);
2417 enc = rb_enc_get(name);
2419 if (!rb_enc_asciicompat(enc)) {
2420 rb_raise(rb_eArgError,
"invalid class path encoding (non ASCII)");
2424 pend = path + RSTRING_LEN(name);
2426 if (p >= pend || !*p) {
2430 if (p + 2 < pend && p[0] ==
':' && p[1] ==
':') {
2440 while (p < pend && *p !=
':') p++;
2442 if (pbeg == p)
goto wrong_name;
2447 if (p < pend && p[0] ==
':') {
2448 if (p + 2 >= pend || p[1] !=
':')
goto wrong_name;
2454 rb_raise(
rb_eTypeError,
"%"PRIsVALUE
" does not refer to class/module",
2461 if (!rb_is_const_name(part)) {
2465 else if (!rb_method_basic_definition_p(
CLASS_OF(mod), id_const_missing)) {
2467 mod = rb_const_missing(mod, part);
2471 rb_mod_const_missing(mod, part);
2479 mod = rb_const_get_0(mod,
id, beglen > 0 || !
RTEST(recur),
RTEST(recur), FALSE);
2481 if (!
RTEST(recur)) {
2484 else if (beglen == 0) {
2496 rb_name_err_raise(wrong_constant_name, mod, name);
2522 ID id = id_for_var(mod, name,
const);
2523 if (!
id)
id = rb_intern_str(name);
2571rb_mod_const_defined(
int argc,
VALUE *argv,
VALUE mod)
2575 const char *pbeg, *p, *path, *pend;
2580 recur = (argc == 1) ?
Qtrue : argv[1];
2583 if (!rb_is_const_sym(name))
goto wrong_name;
2590 enc = rb_enc_get(name);
2592 if (!rb_enc_asciicompat(enc)) {
2593 rb_raise(rb_eArgError,
"invalid class path encoding (non ASCII)");
2597 pend = path + RSTRING_LEN(name);
2599 if (p >= pend || !*p) {
2603 if (p + 2 < pend && p[0] ==
':' && p[1] ==
':') {
2613 while (p < pend && *p !=
':') p++;
2615 if (pbeg == p)
goto wrong_name;
2620 if (p < pend && p[0] ==
':') {
2621 if (p + 2 >= pend || p[1] !=
':')
goto wrong_name;
2629 if (!rb_is_const_name(part)) {
2643 mod = rb_const_search(mod,
id, beglen > 0 || !
RTEST(recur),
RTEST(recur), FALSE);
2644 if (UNDEF_P(mod))
return Qfalse;
2646 if (!
RTEST(recur)) {
2649 if (p == pend)
return Qtrue;
2652 else if (beglen == 0) {
2655 if (p == pend)
return Qtrue;
2661 if (p == pend)
return Qtrue;
2667 rb_raise(
rb_eTypeError,
"%"PRIsVALUE
" does not refer to class/module",
2675 rb_name_err_raise(wrong_constant_name, mod, name);
2731rb_mod_const_source_location(
int argc,
VALUE *argv,
VALUE mod)
2735 const char *pbeg, *p, *path, *pend;
2740 recur = (argc == 1) ?
Qtrue : argv[1];
2743 if (!rb_is_const_sym(name))
goto wrong_name;
2745 if (!
id)
return Qnil;
2746 return RTEST(recur) ? rb_const_source_location(mod,
id) : rb_const_source_location_at(mod, id);
2750 enc = rb_enc_get(name);
2752 if (!rb_enc_asciicompat(enc)) {
2753 rb_raise(rb_eArgError,
"invalid class path encoding (non ASCII)");
2757 pend = path + RSTRING_LEN(name);
2759 if (p >= pend || !*p) {
2763 if (p + 2 < pend && p[0] ==
':' && p[1] ==
':') {
2773 while (p < pend && *p !=
':') p++;
2775 if (pbeg == p)
goto wrong_name;
2780 if (p < pend && p[0] ==
':') {
2781 if (p + 2 >= pend || p[1] !=
':')
goto wrong_name;
2789 if (!rb_is_const_name(part)) {
2809 rb_raise(
rb_eTypeError,
"%"PRIsVALUE
" does not refer to class/module",
2815 loc = rb_const_source_location(mod,
id);
2818 loc = rb_const_source_location_at(mod,
id);
2828 rb_name_err_raise(wrong_constant_name, mod, name);
2857 ID id = id_for_var(obj, iv, instance);
2891 ID id = id_for_var(obj, iv, instance);
2892 if (!
id)
id = rb_intern_str(iv);
2919 ID id = id_for_var(obj, iv, instance);
2946 ID id = id_for_var(obj, iv,
class);
2949 rb_name_err_raise(
"uninitialized class variable %1$s in %2$s",
2978 ID id = id_for_var(obj, iv,
class);
2979 if (!
id)
id = rb_intern_str(iv);
3003 ID id = id_for_var(obj, iv,
class);
3025rb_mod_singleton_p(
VALUE klass)
3027 return RBOOL(RCLASS_SINGLETON_P(klass));
3031static const struct conv_method_tbl {
3032 const char method[6];
3034} conv_method_names[] = {
3035#define M(n) {#n, (unsigned short)idTo_##n}
3050#define IMPLICIT_CONVERSIONS 7
3053conv_method_index(
const char *method)
3055 static const char prefix[] =
"to_";
3057 if (strncmp(prefix, method,
sizeof(prefix)-1) == 0) {
3058 const char *
const meth = &method[
sizeof(prefix)-1];
3060 for (i=0; i < numberof(conv_method_names); i++) {
3061 if (conv_method_names[i].method[0] == meth[0] &&
3062 strcmp(conv_method_names[i].method, meth) == 0) {
3067 return numberof(conv_method_names);
3071convert_type_with_id(
VALUE val,
const char *tname,
ID method,
int raise,
int index)
3077 ((index < 0 ? conv_method_index(rb_id2name(method)) : index)
3078 < IMPLICIT_CONVERSIONS) ?
3079 "no implicit conversion of" :
"can't convert";
3080 const char *cname =
NIL_P(val) ?
"nil" :
3081 val ==
Qtrue ?
"true" :
3082 val ==
Qfalse ?
"false" :
3085 rb_raise(
rb_eTypeError,
"%s %s into %s", msg, cname, tname);
3096convert_type(
VALUE val,
const char *tname,
const char *method,
int raise)
3098 int i = conv_method_index(method);
3099 ID m = i < numberof(conv_method_names) ?
3100 conv_method_names[i].id : rb_intern(method);
3101 return convert_type_with_id(val, tname, m, raise, i);
3105NORETURN(
static void conversion_mismatch(
VALUE,
const char *,
const char *,
VALUE));
3107conversion_mismatch(
VALUE val,
const char *tname,
const char *method,
VALUE result)
3111 "can't convert %"PRIsVALUE
" to %s (%"PRIsVALUE
"#%s gives %"PRIsVALUE
")",
3121 v = convert_type(val, tname, method, TRUE);
3123 conversion_mismatch(val, tname, method, v);
3130rb_convert_type_with_id(
VALUE val,
int type,
const char *tname,
ID method)
3135 v = convert_type_with_id(val, tname, method, TRUE, -1);
3137 conversion_mismatch(val, tname, RSTRING_PTR(rb_id2str(method)), v);
3149 v = convert_type(val, tname, method, FALSE);
3152 conversion_mismatch(val, tname, method, v);
3159rb_check_convert_type_with_id(
VALUE val,
int type,
const char *tname,
ID method)
3165 v = convert_type_with_id(val, tname, method, FALSE, -1);
3168 conversion_mismatch(val, tname, RSTRING_PTR(rb_id2str(method)), v);
3173#define try_to_int(val, mid, raise) \
3174 convert_type_with_id(val, "Integer", mid, raise, -1)
3176ALWAYS_INLINE(
static VALUE rb_to_integer_with_id_exception(
VALUE val,
const char *method,
ID mid,
int raise));
3179rb_to_integer_with_id_exception(
VALUE val,
const char *method,
ID mid,
int raise)
3186 current_cfp = GET_EC()->cfp;
3187 rb_yjit_lazy_push_frame(GET_EC()->cfp->pc);
3188 v = try_to_int(val, mid, raise);
3189 if (!raise &&
NIL_P(v)) {
3190 GET_EC()->cfp = current_cfp;
3194 conversion_mismatch(val,
"Integer", method, v);
3196 GET_EC()->cfp = current_cfp;
3199#define rb_to_integer(val, method, mid) \
3200 rb_to_integer_with_id_exception(val, method, mid, TRUE)
3208 v = convert_type(val,
"Integer", method, FALSE);
3218 return rb_to_integer(val,
"to_int", idTo_int);
3225 val = try_to_int(val, idTo_int, FALSE);
3231rb_check_to_i(
VALUE val)
3234 val = try_to_int(val, idTo_i, FALSE);
3240rb_convert_to_integer(
VALUE val,
int base,
int raise_exception)
3250 else if (! raise_exception) {
3254 rb_raise(rb_eArgError,
"base specified for non string value");
3259 if (!raise_exception && !isfinite(f))
return Qnil;
3261 return rb_dbl2big(f);
3267 return rb_str_convert_to_inum(val, base, TRUE, raise_exception);
3269 else if (
NIL_P(val)) {
3270 if (!raise_exception)
return Qnil;
3276 rb_set_errinfo(
Qnil);
3278 return rb_str_convert_to_inum(tmp, base, TRUE, raise_exception);
3281 if (!raise_exception) {
3282 VALUE result = rb_protect(rb_check_to_i, val, NULL);
3283 rb_set_errinfo(
Qnil);
3287 return rb_to_integer(val,
"to_i", idTo_i);
3293 return rb_convert_to_integer(val, 0, TRUE);
3297rb_check_integer_type(
VALUE val)
3299 return rb_to_integer_with_id_exception(val,
"to_int", idTo_int, FALSE);
3303rb_bool_expected(
VALUE obj,
const char *flagname,
int raise)
3311 static const char message[] =
"expected true or false as %s: %+"PRIsVALUE;
3313 rb_raise(rb_eArgError, message, flagname, obj);
3322rb_opts_exception_p(
VALUE opts,
int default_value)
3324 static const ID kwds[1] = {idException};
3327 return rb_bool_expected(exception,
"exception", TRUE);
3328 return default_value;
3334 return rb_convert_to_integer(arg, 0, TRUE);
3340 int exc = rb_bool_expected(exception,
"exception", TRUE);
3341 return rb_convert_to_integer(arg,
NUM2INT(base), exc);
3345is_digit_char(
unsigned char c,
int base)
3348 return (i >= 0 && i < base);
3352rb_cstr_to_dbl_raise(
const char *p,
rb_encoding *enc,
int badcheck,
int raise,
int *error)
3357 const char *ellipsis =
"";
3359 enum {max_width = 20};
3360#define OutOfRange() ((end - p > max_width) ? \
3361 (w = max_width, ellipsis = "...") : \
3362 (w = (int)(end - p), ellipsis = ""))
3369 if (!badcheck && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3374 if (
errno == ERANGE) {
3376 rb_warning(
"Float %.*s%s out of range", w, p, ellipsis);
3386 char buf[DBL_DIG * 4 + 10];
3388 char *
const init_e = buf + DBL_DIG * 4;
3391 int dot_seen = FALSE;
3393 char exp_letter =
'e';
3395 switch (*p) {
case '+':
case '-': prev = *n++ = *p++;}
3403 if (*++p !=
'0')
break;
3406 while (*++p ==
'0');
3410 while (p < end && n < e) prev = *n++ = *p++;
3415 !is_digit_char(prev, base) ||
3416 !is_digit_char(*++p, base)) {
3417 if (badcheck)
goto bad;
3422 if (e == init_e && (
rb_tolower(prev) == exp_letter)) {
3423 e = buf +
sizeof(buf) - 1;
3425 switch (*p) {
case '+':
case '-': prev = *n++ = *p++;}
3428 while (*++p ==
'0');
3439 if (badcheck)
goto bad;
3443 else if (prev ==
'.' ? dot_seen++ : !is_digit_char(prev, base)) {
3444 if (badcheck)
goto bad;
3447 if (n < e) *n++ = prev;
3452 if (!badcheck && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3457 if (
errno == ERANGE) {
3459 rb_warning(
"Float %.*s%s out of range", w, p, ellipsis);
3463 if (!end || p == end)
goto bad;
3464 while (*end &&
ISSPACE(*end)) end++;
3468 if (
errno == ERANGE) {
3471 rb_raise(rb_eArgError,
"Float %.*s%s out of range", w, q, ellipsis);
3478 rb_raise(rb_eArgError,
"invalid value for Float(): %+"PRIsVALUE, s);
3482 if (error) *error = 1;
3490 return rb_cstr_to_dbl_raise(p, NULL, badcheck, TRUE, NULL);
3494rb_str_to_dbl_raise(
VALUE str,
int badcheck,
int raise,
int *error)
3503 s = RSTRING_PTR(str);
3504 len = RSTRING_LEN(str);
3506 if (badcheck && memchr(s,
'\0',
len)) {
3508 rb_raise(rb_eArgError,
"string for Float contains null byte");
3510 if (error) *error = 1;
3521 ret = rb_cstr_to_dbl_raise(s, rb_enc_get(str), badcheck, raise, error);
3534 return rb_str_to_dbl_raise(str, badcheck, TRUE, NULL);
3538#define fix2dbl_without_to_f(x) (double)FIX2LONG(x)
3539#define big2dbl_without_to_f(x) rb_big2dbl(x)
3540#define int2dbl_without_to_f(x) \
3541 (FIXNUM_P(x) ? fix2dbl_without_to_f(x) : big2dbl_without_to_f(x))
3542#define num2dbl_without_to_f(x) \
3543 (FIXNUM_P(x) ? fix2dbl_without_to_f(x) : \
3544 RB_BIGNUM_TYPE_P(x) ? big2dbl_without_to_f(x) : \
3545 (Check_Type(x, T_FLOAT), RFLOAT_VALUE(x)))
3547rat2dbl_without_to_f(
VALUE x)
3551 return num2dbl_without_to_f(num) / num2dbl_without_to_f(den);
3554#define special_const_to_float(val, pre, post) \
3557 rb_raise_static(rb_eTypeError, pre "nil" post); \
3559 rb_raise_static(rb_eTypeError, pre "true" post); \
3561 rb_raise_static(rb_eTypeError, pre "false" post); \
3566conversion_to_float(
VALUE val)
3568 special_const_to_float(val,
"can't convert ",
" into Float");
3572implicit_conversion_to_float(
VALUE val)
3574 special_const_to_float(val,
"no implicit conversion to float from ",
"");
3578to_float(
VALUE *valp,
int raise_exception)
3583 *valp =
DBL2NUM(fix2dbl_without_to_f(val));
3589 else if (raise_exception) {
3590 conversion_to_float(val);
3599 *valp =
DBL2NUM(big2dbl_without_to_f(val));
3602 *valp =
DBL2NUM(rat2dbl_without_to_f(val));
3612convert_type_to_float_protected(
VALUE val)
3614 return rb_convert_type_with_id(val,
T_FLOAT,
"Float", id_to_f);
3618rb_convert_to_float(
VALUE val,
int raise_exception)
3620 switch (to_float(&val, raise_exception)) {
3624 if (!raise_exception) {
3626 double x = rb_str_to_dbl_raise(val, TRUE, raise_exception, &e);
3635 if (!raise_exception) {
3637 VALUE result = rb_protect(convert_type_to_float_protected, val, &state);
3638 if (state) rb_set_errinfo(
Qnil);
3642 return rb_convert_type_with_id(val,
T_FLOAT,
"Float", id_to_f);
3650 return rb_convert_to_float(val, TRUE);
3656 return rb_convert_to_float(arg, TRUE);
3662 int exception = rb_bool_expected(opts,
"exception", TRUE);
3663 return rb_convert_to_float(arg, exception);
3667numeric_to_float(
VALUE val)
3670 rb_raise(
rb_eTypeError,
"can't convert %"PRIsVALUE
" into Float",
3673 return rb_convert_type_with_id(val,
T_FLOAT,
"Float", id_to_f);
3679 switch (to_float(&val, TRUE)) {
3683 return numeric_to_float(val);
3693 return rb_check_convert_type_with_id(val,
T_FLOAT,
"Float", id_to_f);
3697basic_to_f_p(
VALUE klass)
3699 return rb_method_basic_definition_p(klass, id_to_f);
3704rb_num_to_dbl(
VALUE val)
3709 return fix2dbl_without_to_f(val);
3712 return rb_float_flonum_value(val);
3715 conversion_to_float(val);
3721 return rb_float_noflonum_value(val);
3724 return big2dbl_without_to_f(val);
3728 return rat2dbl_without_to_f(val);
3734 val = numeric_to_float(val);
3743 return fix2dbl_without_to_f(val);
3746 return rb_float_flonum_value(val);
3749 implicit_conversion_to_float(val);
3755 return rb_float_noflonum_value(val);
3757 return big2dbl_without_to_f(val);
3759 return rat2dbl_without_to_f(val);
3761 rb_raise(
rb_eTypeError,
"no implicit conversion to float from string");
3766 val = rb_convert_type_with_id(val,
T_FLOAT,
"Float", id_to_f);
3775 tmp = rb_convert_type_with_id(val,
T_STRING,
"String", idTo_s);
3805 VALUE tmp = rb_check_array_type(val);
3808 tmp = rb_check_to_array(val);
3850 if (
NIL_P(val))
return rb_hash_new();
3851 tmp = rb_check_hash_type(val);
3854 return rb_hash_new();
3897dig_basic_p(
VALUE obj,
struct dig_method *cache)
3900 if (klass != cache->klass) {
3901 cache->klass = klass;
3902 cache->basic = rb_method_basic_definition_p(klass, id_dig);
3904 return cache->basic;
3908no_dig_method(
int found,
VALUE recv,
ID mid,
int argc,
const VALUE *argv,
VALUE data)
3911 rb_raise(
rb_eTypeError,
"%"PRIsVALUE
" does not have #dig method",
3920 struct dig_method hash = {
Qnil}, ary = {
Qnil}, strt = {
Qnil};
3922 for (; argc > 0; ++argv, --argc) {
3923 if (
NIL_P(obj))
return notfound;
3927 if (dig_basic_p(obj, &hash)) {
3928 obj = rb_hash_aref(obj, *argv);
3933 if (dig_basic_p(obj, &ary)) {
3934 obj = rb_ary_at(obj, *argv);
3939 if (dig_basic_p(obj, &strt)) {
3940 obj = rb_struct_lookup(obj, *argv);
3948 return rb_check_funcall_with_hook_kw(obj, id_dig, argc, argv,
4211 Init_class_hierarchy();
4428 rb_cNilClass_to_s = rb_fstring_enc_lit(
"", rb_usascii_encoding());
4429 rb_vm_register_global_object(rb_cNilClass_to_s);
4478 rb_class_undefined_instance_methods, 0);
4488 rb_mod_const_missing, 1);
4514 rb_cTrueClass_to_s = rb_fstring_enc_lit(
"true", rb_usascii_encoding());
4515 rb_vm_register_global_object(rb_cTrueClass_to_s);
4526 rb_cFalseClass_to_s = rb_fstring_enc_lit(
"false", rb_usascii_encoding());
4527 rb_vm_register_global_object(rb_cFalseClass_to_s);
4538#include "kernel.rbinc"
4539#include "nilclass.rbinc"
#define RUBY_ASSERT(...)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
static int rb_tolower(int c)
Our own locale-insensitive version of tolower(3).
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_private_method(klass, mid, func, arity)
Defines klass#mid and makes it private.
#define rb_define_global_function(mid, func, arity)
Defines rb_mKernel #mid.
static bool RB_OBJ_FROZEN(VALUE obj)
Checks if an object is frozen.
@ RUBY_FL_PROMOTED
Ruby objects are "generational".
@ RUBY_FL_SEEN_OBJ_ID
This flag has something to do with object IDs.
VALUE rb_class_protected_instance_methods(int argc, const VALUE *argv, VALUE mod)
Identical to rb_class_instance_methods(), except it returns names of methods that are protected only.
void rb_include_module(VALUE klass, VALUE module)
Includes a module to a class.
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
VALUE rb_class_subclasses(VALUE klass)
Queries the class's direct descendants.
VALUE rb_singleton_class(VALUE obj)
Finds or creates the singleton class of the passed object.
VALUE rb_class_attached_object(VALUE klass)
Returns the attached object for a singleton class.
VALUE rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
Identical to rb_class_instance_methods(), except it returns names of singleton methods instead of ins...
VALUE rb_class_instance_methods(int argc, const VALUE *argv, VALUE mod)
Generates an array of symbols, which are the list of method names defined in the passed class.
void rb_check_inheritable(VALUE super)
Asserts that the given class can derive a child class.
VALUE rb_class_public_instance_methods(int argc, const VALUE *argv, VALUE mod)
Identical to rb_class_instance_methods(), except it returns names of methods that are public only.
VALUE rb_define_module(const char *name)
Defines a top-level module.
void rb_singleton_class_attached(VALUE klass, VALUE obj)
Attaches a singleton class to its corresponding object.
VALUE rb_mod_included_modules(VALUE mod)
Queries the list of included modules.
VALUE rb_mod_ancestors(VALUE mod)
Queries the module's ancestors.
VALUE rb_class_inherited(VALUE super, VALUE klass)
Calls Class::inherited.
VALUE rb_mod_include_p(VALUE mod, VALUE mod2)
Queries if the passed module is included by the module.
VALUE rb_class_private_instance_methods(int argc, const VALUE *argv, VALUE mod)
Identical to rb_class_instance_methods(), except it returns names of methods that are private only.
VALUE rb_mod_init_copy(VALUE clone, VALUE orig)
The comment that comes with this function says :nodoc:.
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)
Defines an undef of a method.
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
Retrieves argument from argc and argv to given VALUE references according to the format string.
int rb_block_given_p(void)
Determines if the current method is given a block.
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
Keyword argument deconstructor.
#define T_COMPLEX
Old name of RUBY_T_COMPLEX.
#define TYPE(_)
Old name of rb_type.
#define RB_INTEGER_TYPE_P
Old name of rb_integer_type_p.
#define FL_EXIVAR
Old name of RUBY_FL_EXIVAR.
#define ALLOCV
Old name of RB_ALLOCV.
#define ISSPACE
Old name of rb_isspace.
#define RFLOAT_VALUE
Old name of rb_float_value.
#define T_STRING
Old name of RUBY_T_STRING.
#define T_MASK
Old name of RUBY_T_MASK.
#define Qundef
Old name of RUBY_Qundef.
#define INT2FIX
Old name of RB_INT2FIX.
#define OBJ_FROZEN
Old name of RB_OBJ_FROZEN.
#define rb_str_cat2
Old name of rb_str_cat_cstr.
#define T_FLOAT
Old name of RUBY_T_FLOAT.
#define ID2SYM
Old name of RB_ID2SYM.
#define T_BIGNUM
Old name of RUBY_T_BIGNUM.
#define SPECIAL_CONST_P
Old name of RB_SPECIAL_CONST_P.
#define T_STRUCT
Old name of RUBY_T_STRUCT.
#define OBJ_FREEZE
Old name of RB_OBJ_FREEZE.
#define UNREACHABLE_RETURN
Old name of RBIMPL_UNREACHABLE_RETURN.
#define T_DATA
Old name of RUBY_T_DATA.
#define CLASS_OF
Old name of rb_class_of.
#define T_NONE
Old name of RUBY_T_NONE.
#define FIXABLE
Old name of RB_FIXABLE.
#define LONG2FIX
Old name of RB_INT2FIX.
#define T_MODULE
Old name of RUBY_T_MODULE.
#define T_RATIONAL
Old name of RUBY_T_RATIONAL.
#define T_ICLASS
Old name of RUBY_T_ICLASS.
#define T_HASH
Old name of RUBY_T_HASH.
#define FL_TEST_RAW
Old name of RB_FL_TEST_RAW.
#define rb_ary_new3
Old name of rb_ary_new_from_args.
#define rb_usascii_str_new2
Old name of rb_usascii_str_new_cstr.
#define FLONUM_P
Old name of RB_FLONUM_P.
#define Qtrue
Old name of RUBY_Qtrue.
#define NUM2INT
Old name of RB_NUM2INT.
#define Qnil
Old name of RUBY_Qnil.
#define Qfalse
Old name of RUBY_Qfalse.
#define T_ARRAY
Old name of RUBY_T_ARRAY.
#define T_OBJECT
Old name of RUBY_T_OBJECT.
#define NIL_P
Old name of RB_NIL_P.
#define FL_WB_PROTECTED
Old name of RUBY_FL_WB_PROTECTED.
#define T_SYMBOL
Old name of RUBY_T_SYMBOL.
#define DBL2NUM
Old name of rb_float_new.
#define T_CLASS
Old name of RUBY_T_CLASS.
#define BUILTIN_TYPE
Old name of RB_BUILTIN_TYPE.
#define FL_FREEZE
Old name of RUBY_FL_FREEZE.
#define FIXNUM_P
Old name of RB_FIXNUM_P.
#define CONST_ID
Old name of RUBY_CONST_ID.
#define rb_ary_new2
Old name of rb_ary_new_capa.
#define FL_SET_RAW
Old name of RB_FL_SET_RAW.
#define ALLOCV_END
Old name of RB_ALLOCV_END.
#define SYMBOL_P
Old name of RB_SYMBOL_P.
void rb_category_warning(rb_warning_category_t category, const char *fmt,...)
Identical to rb_warning(), except it takes additional "category" parameter.
VALUE rb_eTypeError
TypeError exception.
void rb_warning(const char *fmt,...)
Issues a warning.
@ RB_WARN_CATEGORY_DEPRECATED
Warning is for deprecated features.
VALUE rb_cClass
Class class.
VALUE rb_cRational
Rational class.
VALUE rb_class_superclass(VALUE klass)
Returns the superclass of klass.
size_t rb_obj_embedded_size(uint32_t numiv)
Internal header for Object.
VALUE rb_class_get_superclass(VALUE klass)
Returns the superclass of a class.
VALUE rb_convert_type(VALUE val, int type, const char *tname, const char *method)
Converts an object into another type.
VALUE rb_Float(VALUE val)
This is the logic behind Kernel#Float.
VALUE rb_mKernel
Kernel module.
VALUE rb_check_to_int(VALUE val)
Identical to rb_check_to_integer(), except it uses #to_int for conversion.
VALUE rb_obj_reveal(VALUE obj, VALUE klass)
Make a hidden object visible again.
VALUE rb_check_convert_type(VALUE val, int type, const char *tname, const char *method)
Identical to rb_convert_type(), except it returns RUBY_Qnil instead of raising exceptions,...
VALUE rb_cObject
Documented in include/ruby/internal/globals.h.
VALUE rb_any_to_s(VALUE obj)
Generates a textual representation of the given object.
VALUE rb_obj_alloc(VALUE klass)
Allocates an instance of the given class.
VALUE rb_class_new_instance(int argc, const VALUE *argv, VALUE klass)
Allocates, then initialises an instance of the given class.
VALUE rb_class_new_instance_kw(int argc, const VALUE *argv, VALUE klass, int kw_splat)
Identical to rb_class_new_instance(), except you can specify how to handle the last element of the gi...
VALUE rb_cRefinement
Refinement class.
VALUE rb_cInteger
Module class.
VALUE rb_obj_hide(VALUE obj)
Make the object invisible from Ruby code.
VALUE rb_class_new_instance_pass_kw(int argc, const VALUE *argv, VALUE klass)
Identical to rb_class_new_instance(), except it passes the passed keywords if any to the #initialize ...
VALUE rb_check_to_float(VALUE val)
This is complicated.
static VALUE rb_obj_init_clone(int argc, VALUE *argv, VALUE obj)
Default implementation of #initialize_clone
VALUE rb_cNilClass
NilClass class.
VALUE rb_Hash(VALUE val)
Equivalent to Kernel#Hash in Ruby.
VALUE rb_obj_frozen_p(VALUE obj)
Just calls RB_OBJ_FROZEN() inside.
VALUE rb_obj_init_copy(VALUE obj, VALUE orig)
Default implementation of #initialize_copy
int rb_eql(VALUE obj1, VALUE obj2)
Checks for equality of the passed objects, in terms of Object#eql?.
double rb_str_to_dbl(VALUE str, int badcheck)
Identical to rb_cstr_to_dbl(), except it accepts a Ruby's string instead of C's.
VALUE rb_Integer(VALUE val)
This is the logic behind Kernel#Integer.
VALUE rb_cFalseClass
FalseClass class.
VALUE rb_cNumeric
Numeric class.
VALUE rb_Array(VALUE val)
This is the logic behind Kernel#Array.
VALUE rb_obj_class(VALUE obj)
Queries the class of an object.
VALUE rb_obj_dup(VALUE obj)
Duplicates the given object.
VALUE rb_inspect(VALUE obj)
Generates a human-readable textual representation of the given object.
VALUE rb_cBasicObject
BasicObject class.
VALUE rb_cModule
Module class.
VALUE rb_class_inherited_p(VALUE mod, VALUE arg)
Determines if the given two modules are relatives.
VALUE rb_obj_is_instance_of(VALUE obj, VALUE c)
Queries if the given object is a direct instance of the given class.
VALUE rb_class_real(VALUE cl)
Finds a "real" class.
VALUE rb_obj_init_dup_clone(VALUE obj, VALUE orig)
Default implementation of #initialize_dup
VALUE rb_to_float(VALUE val)
Identical to rb_check_to_float(), except it raises on error.
double rb_num2dbl(VALUE val)
Converts an instance of rb_cNumeric into C's double.
VALUE rb_equal(VALUE obj1, VALUE obj2)
This function is an optimised version of calling #==.
VALUE rb_obj_clone(VALUE obj)
Produces a shallow copy of the given object.
VALUE rb_obj_is_kind_of(VALUE obj, VALUE c)
Queries if the given object is an instance (of possibly descendants) of the given class.
double rb_cstr_to_dbl(const char *p, int badcheck)
Converts a textual representation of a real number into a numeric, which is the nearest value that th...
VALUE rb_obj_freeze(VALUE obj)
Just calls rb_obj_freeze_inline() inside.
VALUE rb_check_to_integer(VALUE val, const char *method)
Identical to rb_check_convert_type(), except the return value type is fixed to rb_cInteger.
VALUE rb_String(VALUE val)
This is the logic behind Kernel#String.
VALUE rb_cTrueClass
TrueClass class.
VALUE rb_to_int(VALUE val)
Identical to rb_check_to_int(), except it raises in case of conversion mismatch.
VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type)
Fills common fields in the object.
#define RB_OBJ_WRITTEN(old, oldv, young)
Identical to RB_OBJ_WRITE(), except it doesn't write any values, but only a WB declaration.
VALUE rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc)
Identical to rb_enc_str_new(), except it assumes the passed pointer is a pointer to a C string.
int rb_enc_str_asciionly_p(VALUE str)
Queries if the passed string is "ASCII only".
ID rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc)
Identical to rb_check_id(), except it takes a pointer to a memory region instead of Ruby's string.
VALUE rb_funcall(VALUE recv, ID mid, int n,...)
Calls a method.
VALUE rb_funcallv_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat)
Identical to rb_funcallv(), except you can specify how to handle the last element of the given array.
#define RGENGC_WB_PROTECTED_OBJECT
This is a compile-time flag to enable/disable write barrier for struct RObject.
Defines RBIMPL_HAS_BUILTIN.
static int rb_check_arity(int argc, int min, int max)
Ensures that the passed integer is in the passed range.
int rb_is_instance_id(ID id)
Classifies the given ID, then sees if it is an instance variable.
int rb_is_const_id(ID id)
Classifies the given ID, then sees if it is a constant.
int rb_is_local_id(ID id)
Classifies the given ID, then sees if it is a local variable.
VALUE rb_rational_num(VALUE rat)
Queries the numerator of the passed Rational.
VALUE rb_rational_den(VALUE rat)
Queries the denominator of the passed Rational.
VALUE rb_str_append(VALUE dst, VALUE src)
Identical to rb_str_buf_append(), except it converts the right hand side before concatenating.
VALUE rb_str_subseq(VALUE str, long beg, long len)
Identical to rb_str_substr(), except the numbers are interpreted as byte offsets instead of character...
VALUE rb_str_buf_append(VALUE dst, VALUE src)
Identical to rb_str_cat_cstr(), except it takes Ruby's string instead of C's.
void rb_must_asciicompat(VALUE obj)
Asserts that the given string's encoding is (Ruby's definition of) ASCII compatible.
VALUE rb_str_concat(VALUE dst, VALUE src)
Identical to rb_str_append(), except it also accepts an integer as a codepoint.
VALUE rb_check_string_type(VALUE obj)
Try converting an object to its stringised representation using its to_str method,...
VALUE rb_str_intern(VALUE str)
Identical to rb_to_symbol(), except it assumes the receiver being an instance of RString.
VALUE rb_obj_as_string(VALUE obj)
Try converting an object to its stringised representation using its to_s method, if any.
VALUE rb_exec_recursive(VALUE(*f)(VALUE g, VALUE h, int r), VALUE g, VALUE h)
"Recursion" API entry point.
VALUE rb_mod_remove_cvar(VALUE mod, VALUE name)
Resembles Module#remove_class_variable.
VALUE rb_obj_instance_variables(VALUE obj)
Resembles Object#instance_variables.
VALUE rb_const_get(VALUE space, ID name)
Identical to rb_const_defined(), except it returns the actual defined value.
VALUE rb_ivar_set(VALUE obj, ID name, VALUE val)
Identical to rb_iv_set(), except it accepts the name as an ID instead of a C string.
VALUE rb_mod_remove_const(VALUE space, VALUE name)
Resembles Module#remove_const.
void rb_cvar_set(VALUE klass, ID name, VALUE val)
Assigns a value to a class variable.
VALUE rb_cvar_get(VALUE klass, ID name)
Obtains a value from a class variable.
VALUE rb_mod_constants(int argc, const VALUE *argv, VALUE recv)
Resembles Module#constants.
VALUE rb_ivar_get(VALUE obj, ID name)
Identical to rb_iv_get(), except it accepts the name as an ID instead of a C string.
void rb_const_set(VALUE space, ID name, VALUE val)
Names a constant.
VALUE rb_mod_name(VALUE mod)
Queries the name of a module.
VALUE rb_class_name(VALUE obj)
Queries the name of the given object's class.
VALUE rb_const_get_at(VALUE space, ID name)
Identical to rb_const_defined_at(), except it returns the actual defined value.
VALUE rb_obj_remove_instance_variable(VALUE obj, VALUE name)
Resembles Object#remove_instance_variable.
st_index_t rb_ivar_count(VALUE obj)
Number of instance variables defined on an object.
VALUE rb_const_get_from(VALUE space, ID name)
Identical to rb_const_defined_at(), except it returns the actual defined value.
VALUE rb_ivar_defined(VALUE obj, ID name)
Queries if the instance variable is defined at the object.
int rb_const_defined_at(VALUE space, ID name)
Identical to rb_const_defined(), except it doesn't look for parent classes.
VALUE rb_mod_class_variables(int argc, const VALUE *argv, VALUE recv)
Resembles Module#class_variables.
VALUE rb_cvar_defined(VALUE klass, ID name)
Queries if the given class has the given class variable.
int rb_const_defined_from(VALUE space, ID name)
Identical to rb_const_defined(), except it returns false for private constants.
int rb_const_defined(VALUE space, ID name)
Queries if the constant is defined at the namespace.
VALUE(* rb_alloc_func_t)(VALUE klass)
This is the type of functions that ruby calls when trying to allocate an object.
void rb_undef_alloc_func(VALUE klass)
Deletes the allocator function of a class.
void rb_attr(VALUE klass, ID name, int need_reader, int need_writer, int honour_visibility)
This function resembles now-deprecated Module#attr.
VALUE rb_check_funcall(VALUE recv, ID mid, int argc, const VALUE *argv)
Identical to rb_funcallv(), except it returns RUBY_Qundef instead of raising rb_eNoMethodError.
rb_alloc_func_t rb_get_alloc_func(VALUE klass)
Queries the allocator function of a class.
VALUE rb_mod_module_exec(int argc, const VALUE *argv, VALUE mod)
Identical to rb_obj_instance_exec(), except it evaluates within the context of module.
void rb_define_alloc_func(VALUE klass, rb_alloc_func_t func)
Sets the allocator function of a class.
int rb_obj_respond_to(VALUE obj, ID mid, int private_p)
Identical to rb_respond_to(), except it additionally takes the visibility parameter.
static ID rb_intern_const(const char *str)
This is a "tiny optimisation" over rb_intern().
ID rb_check_id(volatile VALUE *namep)
Detects if the given name is already interned or not.
int len
Length of the buffer.
const signed char ruby_digit36_to_number_table[]
Character to number mapping like ‘'a’->10,'b'->11etc.
#define strtod(s, e)
Just another name of ruby_strtod.
VALUE rb_f_sprintf(int argc, const VALUE *argv)
Identical to rb_str_format(), except how the arguments are arranged.
#define MEMCPY(p1, p2, type, n)
Handy macro to call memcpy.
#define RB_GC_GUARD(v)
Prevents premature destruction of local objects.
VALUE type(ANYARGS)
ANYARGS-ed function type.
void rb_ivar_foreach(VALUE q, int_type *w, VALUE e)
Iteration over each instance variable of the object.
void rb_copy_generic_ivar(VALUE clone, VALUE obj)
Copies the list of instance variables.
#define RARRAY_LEN
Just another name of rb_array_len.
static VALUE RBASIC_CLASS(VALUE obj)
Queries the class of an object.
#define RBASIC(obj)
Convenient casting macro.
#define RCLASS_SUPER
Just another name of rb_class_get_superclass.
#define RCLASS(obj)
Convenient casting macro.
static VALUE * ROBJECT_IVPTR(VALUE obj)
Queries the instance variables.
#define StringValue(v)
Ensures that the parameter object is a String.
#define StringValuePtr(v)
Identical to StringValue, except it returns a char*.
const char * rb_class2name(VALUE klass)
Queries the name of the passed class.
const char * rb_obj_classname(VALUE obj)
Queries the name of the class of the passed object.
#define errno
Ractor-aware version of errno.
#define InitVM(ext)
This macro is for internal use.
#define RB_PASS_KEYWORDS
Pass keywords, final argument should be a hash of keywords.
#define RB_PASS_CALLED_KEYWORDS
Pass keywords if current method is called with keywords, useful for argument delegation.
#define RB_NO_KEYWORDS
Do not pass keywords.
#define RTEST
This is an old name of RB_TEST.
#define _(args)
This was a transition path from K&R to ANSI.
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
uintptr_t VALUE
Type that represents a Ruby object.
static bool RB_FLOAT_TYPE_P(VALUE obj)
Queries if the object is an instance of rb_cFloat.
static void Check_Type(VALUE v, enum ruby_value_type t)
Identical to RB_TYPE_P(), except it raises exceptions on predication failure.
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.