static inline double num2dbl_with_to_f(VALUE num) { if (SPECIAL_CONST_P(num)) { if (FIXNUM_P(num)) { if (basic_to_f_p(rb_cFixnum)) return fix2dbl_without_to_f(num); } else if (FLONUM_P(num)) { return RFLOAT_VALUE(num); } } else { switch (BUILTIN_TYPE(num)) { case T_FLOAT: return RFLOAT_VALUE(num); case T_BIGNUM: if (basic_to_f_p(rb_cBignum)) return big2dbl_without_to_f(num); break; case T_RATIONAL: if (basic_to_f_p(rb_cRational)) return rat2dbl_without_to_f(num); break; } } return RFLOAT_VALUE(rb_to_float(num)); }
int rb_enc_get_index(VALUE obj) { int i = -1; VALUE tmp; if (SPECIAL_CONST_P(obj)) { if (!SYMBOL_P(obj)) return -1; obj = rb_sym2str(obj); } switch (BUILTIN_TYPE(obj)) { case T_STRING: case T_SYMBOL: case T_REGEXP: i = enc_get_index_str(obj); break; case T_FILE: tmp = rb_funcallv(obj, rb_intern("internal_encoding"), 0, 0); if (NIL_P(tmp)) { tmp = rb_funcallv(obj, rb_intern("external_encoding"), 0, 0); } if (is_obj_encoding(tmp)) { i = enc_check_encoding(tmp); } break; case T_DATA: if (is_data_encoding(obj)) { i = enc_check_encoding(obj); } break; default: break; } return i; }
static VALUE define_final(VALUE os, SEL sel, int argc, VALUE *argv) { VALUE obj, block; rb_scan_args(argc, argv, "11", &obj, &block); if (argc == 1) { block = rb_block_proc(); } else if (!rb_respond_to(block, rb_intern("call"))) { rb_raise(rb_eArgError, "wrong type argument %s (should be callable)", rb_obj_classname(block)); } if (SPECIAL_CONST_P(obj)) { rb_raise(rb_eArgError, "immediate types are not finalizable"); } rb_vm_finalizer_t *finalizer = rb_objc_get_associative_ref((void *)obj, &finalizer_key); if (finalizer == NULL) { finalizer = (rb_vm_finalizer_t *) rb_objc_newobj(sizeof(rb_vm_finalizer_t *)); finalizer->klass = rb_cFinalizer; finalizer->objid = rb_obj_id(obj, 0); GC_WB(&finalizer->finalizers, rb_ary_new()); rb_objc_set_associative_ref((void *)obj, &finalizer_key, finalizer); rb_vm_register_finalizer(finalizer); } rb_ary_push(finalizer->finalizers, block); // For RubySpec conformance. return rb_ary_new3(2, INT2FIX(rb_safe_level()), block); }
VALUE rb_enc_associate_index(VALUE obj, int idx) { rb_encoding *enc; int oldidx, oldtermlen, termlen; /* enc_check_capable(obj);*/ rb_check_frozen(obj); oldidx = rb_enc_get_index(obj); if (oldidx == idx) return obj; if (SPECIAL_CONST_P(obj)) { rb_raise(rb_eArgError, "cannot set encoding"); } enc = must_encindex(idx); if (!ENC_CODERANGE_ASCIIONLY(obj) || !rb_enc_asciicompat(enc)) { ENC_CODERANGE_CLEAR(obj); } termlen = rb_enc_mbminlen(enc); oldtermlen = rb_enc_mbminlen(rb_enc_from_index(oldidx)); if (oldtermlen < termlen && RB_TYPE_P(obj, T_STRING)) { rb_str_fill_terminator(obj, termlen); } enc_set_index(obj, idx); return obj; }
static mrb_value mrb_ary_equal(mrb_state *mrb, mrb_value ary1) { mrb_value ary2; mrb_get_args(mrb, "o", &ary2); if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); if (SPECIAL_CONST_P(ary2)) return mrb_false_value(); if (mrb_type(ary2) != MRB_TT_ARRAY) { if (!mrb_respond_to(mrb, ary2, mrb_intern(mrb, "to_ary"))) { return mrb_false_value(); } if (mrb_equal(mrb, ary2, ary1)){ return mrb_true_value(); } else { return mrb_false_value(); } } if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); else { int i; for (i=0; i<RARRAY_LEN(ary1); i++) { if (!mrb_equal(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) return mrb_false_value(); } return mrb_true_value(); } }
static int enc_check_encoding(mrb_state *mrb, mrb_value obj) { if (SPECIAL_CONST_P(obj) || !is_data_encoding(obj)) { return -1; } return check_encoding(mrb, RDATA(obj)->data); }
static int enc_check_encoding(VALUE obj) { if (SPECIAL_CONST_P(obj) || !rb_typeddata_is_kind_of(obj, &encoding_data_type)) { return -1; } return check_encoding(RDATA(obj)->data); }
int rb_typeddata_is_kind_of(VALUE obj, const rb_data_type_t *data_type) { if (SPECIAL_CONST_P(obj) || BUILTIN_TYPE(obj) != T_DATA || !RTYPEDDATA_P(obj) || RTYPEDDATA_TYPE(obj) != data_type) { return 0; } return 1; }
static int loaded_features_index_clear_i(st_data_t key, st_data_t val, st_data_t arg) { VALUE obj = (VALUE)val; if (!SPECIAL_CONST_P(obj)) { rb_ary_free(obj); ruby_sized_xfree((void *)obj, sizeof(struct RArray)); } return ST_DELETE; }
VALUE Looksee_singleton_instance(VALUE self, VALUE klass) { if (!SPECIAL_CONST_P(klass) && BUILTIN_TYPE(klass) == T_CLASS && FL_TEST(klass, FL_SINGLETON)) { VALUE object; if (!Looksee_method_table_lookup(RCLASS_IV_TBL(klass), rb_intern("__attached__"), (st_data_t *)&object)) rb_raise(rb_eRuntimeError, "[looksee bug] can't find singleton object"); return object; } else { return Qnil; } }
/* * Return the class or module that the given internal class * represents. * * If a class is given, this is the class. If an iclass is given, * this is the module it represents in the lookup chain. */ VALUE Looksee_internal_class_to_module(VALUE self, VALUE internal_class) { if (!SPECIAL_CONST_P(internal_class)) { switch (BUILTIN_TYPE(internal_class)) { case T_ICLASS: return RBASIC(internal_class)->klass; case T_CLASS: return internal_class; } } rb_raise(rb_eArgError, "not an internal class: %s", RSTRING_PTR(rb_inspect(internal_class))); }
void * mrb_get_datatype(mrb_state *mrb, mrb_value obj, const struct mrb_data_type *type) { if (SPECIAL_CONST_P(obj) || (mrb_type(obj) != MRB_TT_DATA)) { return NULL; } if (DATA_TYPE(obj) != type) { return NULL; } return DATA_PTR(obj); }
static int loaded_features_index_clear_i(st_data_t key, st_data_t val, st_data_t arg) { VALUE obj = (VALUE)val; if (!SPECIAL_CONST_P(obj)) { rb_ary_free(obj); xfree((void *)obj); } xfree((char *)key); return ST_DELETE; }
VALUE rb_obj_instance_exec(int argc, VALUE *argv, VALUE self) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = Qnil; } else { klass = rb_singleton_class(self); } return yield_under(klass, self, rb_ary_new4(argc, argv)); }
VALUE rb_obj_instance_eval(int argc, VALUE *argv, VALUE self) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = Qnil; } else { klass = rb_singleton_class(self); } return specific_eval(argc, argv, klass, self); }
static VALUE rb_obj_instance_eval(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = 0; } else { klass = CLASS_OF(self); } return specific_eval(argc, argv, klass, self); }
/*! * Returns the singleton class of \a obj, or nil if obj is not a * singleton object. * * \param obj an arbitrary object. * \return the singleton class or nil. */ VALUE rb_singleton_class_get(VALUE obj) { VALUE klass; if (SPECIAL_CONST_P(obj)) { return rb_special_singleton_class(obj); } klass = RBASIC(obj)->klass; if (!FL_TEST(klass, FL_SINGLETON)) return Qnil; if (rb_ivar_get(klass, id_attached) != obj) return Qnil; return klass; }
static VALUE rb_obj_instance_eval_imp(VALUE self, SEL sel, VALUE top, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self) || CLASS_OF(self) == rb_cSymbol) { klass = Qnil; } else { klass = rb_singleton_class(self); } return specific_eval(argc, argv, klass, self); }
static VALUE rb_obj_instance_exec(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = 0; } else { klass = rb_singleton_class(self); } return rb_vm_yield_under(klass, self, argc, argv); }
static int linear_object_p(VALUE obj) { if (FIXNUM_P(obj) || FLONUM_P(obj)) return TRUE; if (SPECIAL_CONST_P(obj)) return FALSE; switch (BUILTIN_TYPE(obj)) { case T_FLOAT: case T_BIGNUM: return TRUE; } if (rb_obj_is_kind_of(obj, rb_cNumeric)) return TRUE; if (rb_obj_is_kind_of(obj, rb_cTime)) return TRUE; return FALSE; }
void * mrb_check_datatype(mrb_state *mrb, mrb_value obj, const struct mrb_data_type *type) { static const char mesg[] = "wrong argument type %s (expected %s)"; if (SPECIAL_CONST_P(obj) || (mrb_type(obj) != MRB_TT_DATA)) { mrb_check_type(mrb, obj, MRB_TT_DATA); } if (DATA_TYPE(obj) != type) { const char *etype = DATA_TYPE(obj)->struct_name; mrb_raise(mrb, E_TYPE_ERROR, mesg, etype, type->struct_name); } return DATA_PTR(obj); }
void rb_cmperr(VALUE x, VALUE y) { VALUE classname; if (SPECIAL_CONST_P(y) || BUILTIN_TYPE(y) == T_FLOAT) { classname = rb_inspect(y); } else { classname = rb_obj_class(y); } rb_raise(rb_eArgError, "comparison of %"PRIsVALUE" with %"PRIsVALUE" failed", rb_obj_class(x), classname); }
void rb_cmperr(VALUE x, VALUE y) { const char *classname; if (SPECIAL_CONST_P(y)) { y = rb_inspect(y); classname = StringValuePtr(y); } else { classname = rb_obj_classname(y); } rb_raise(rb_eArgError, "comparison of %s with %s failed", rb_obj_classname(x), classname); }
static VALUE undefine_final(VALUE os, SEL sel, VALUE obj) { if (SPECIAL_CONST_P(obj)) { rb_raise(rb_eArgError, "immediate types are not finalizable"); } rb_vm_finalizer_t *finalizer = rb_objc_get_associative_ref((void *)obj, &finalizer_key); if (finalizer != NULL) { rb_ary_clear(finalizer->finalizers); rb_vm_unregister_finalizer(finalizer); rb_objc_set_associative_ref((void *)obj, &finalizer_key, NULL); } return obj; }
static inline int enc_capable(VALUE obj) { if (SPECIAL_CONST_P(obj)) return SYMBOL_P(obj); switch (BUILTIN_TYPE(obj)) { case T_STRING: case T_REGEXP: case T_FILE: return TRUE; case T_DATA: if (is_data_encoding(obj)) return TRUE; default: return FALSE; } }
static VALUE rb_obj_instance_exec(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = Qnil; } else { klass = rb_singleton_class(self); } if (!rb_block_given_p()) { rb_raise(rb_eLocalJumpError, "no block given"); } return rb_vm_yield_under(klass, self, argc, argv); }
PRIMITIVE VALUE vm_fast_shift(VALUE obj, VALUE other, unsigned char overriden) { if (overriden == 0 && !SPECIAL_CONST_P(obj)) { VALUE klass = *(VALUE *)obj; if (klass == rb_cRubyArray) { rary_modify(obj); rary_push(obj, other); return obj; } else if (klass == rb_cRubyString) { return rstr_concat(obj, 0, other); } } return vm_dispatch(0, obj, selLTLT, NULL, 0, 1, &other); }
PRIMITIVE VALUE vm_fast_aref(VALUE obj, VALUE other, unsigned char overriden) { if (overriden == 0 && !SPECIAL_CONST_P(obj)) { VALUE klass = *(VALUE *)obj; if (klass == rb_cRubyArray) { if (FIXNUM_P(other)) { return rary_entry(obj, FIX2LONG(other)); } } else if (klass == rb_cRubyHash) { return rhash_aref(obj, 0, other); } } return vm_dispatch(0, obj, selAREF, NULL, 0, 1, &other); }
void mrb_cmperr(mrb_state *mrb, mrb_value x, mrb_value y) { const char *classname; if (SPECIAL_CONST_P(y)) { y = mrb_inspect(mrb, y); //classname = StringValuePtr(y); classname = mrb_string_value_ptr(mrb, y); } else { classname = mrb_obj_classname(mrb, y); } mrb_raise(mrb, E_ARGUMENT_ERROR, "comparison of %s with %s failed", mrb_obj_classname(mrb, x), classname); }
VALUE rb_enc_associate_index(VALUE obj, int idx) { /* enc_check_capable(obj);*/ if (rb_enc_get_index(obj) == idx) return obj; if (SPECIAL_CONST_P(obj)) { rb_raise(rb_eArgError, "cannot set encoding"); } if (!ENC_CODERANGE_ASCIIONLY(obj) || !rb_enc_asciicompat(rb_enc_from_index(idx))) { ENC_CODERANGE_CLEAR(obj); } rb_enc_set_index(obj, idx); return obj; }