53 #if OPT_CALL_CFUNC_WITHOUT_FRAME
74 if (reg_cfp == th->
cfp) {
76 rb_bug(
"vm_call0_cfunc: passed_ci error (ci: %p, passed_ci: %p)", ci, th->
passed_ci);
81 if (reg_cfp != th->
cfp + 1) {
82 rb_bug(
"vm_call0_cfunc: cfp consistency error");
100 int len = cfunc->
argc;
118 val = (*cfunc->
invoker)(cfunc->
func, recv, argc, argv);
121 rb_bug(
"vm_call0_cfunc_with_frame: cfp consistency error");
164 *reg_cfp->
sp++ = ci->
recv;
165 for (i = 0; i < ci->
argc; i++) {
166 *reg_cfp->
sp++ = argv[
i];
218 case OPTIMIZED_METHOD_TYPE_SEND:
221 case OPTIMIZED_METHOD_TYPE_CALL:
247 return vm_call0(th, recv,
id, argc, argv, me, defined_class);
260 rb_bug(
"vm_call_super: should not be reached");
271 return vm_call0(th, recv,
id, argc, argv, me, klass);
295 #define NOEX_OK NOEX_NOSUPER
326 return vm_call0(th, recv, mid, argc, argv, me, defined_class);
370 if (arity < 1) arity = 2;
376 if (!
RTEST(result)) {
425 return vm_call0(th, recv, mid, argc, argv, me, defined_class);
447 return vm_call0(th, recv, mid, argc, argv, me, defined_class);
453 #define type_case(t) case t: return #t;
480 default:
return NULL;
494 "method `%s' called on unexpected immediate object (%p)",
497 flags =
RBASIC(recv)->flags;
498 klass =
RBASIC(recv)->klass;
501 "method `%s' called on terminated object"
510 "method `%s' called on hidden %s object"
512 rb_id2name(mid), typestr, (
void *)recv, flags, klass);
515 "method `%s' called on unexpected %s object"
516 " (%p flags=0x%"PRIxVALUE
" klass=0x%"PRIxVALUE
")",
517 rb_id2name(mid), typestr, (
void *)recv, flags, klass);
520 "method `%s' called on broken T_???" "(0x%02x) object"
521 " (%p flags=0x%"PRIxVALUE
" klass=0x%"PRIxVALUE
")",
522 rb_id2name(mid), type, (
void *)recv, flags, klass);
547 if (oid != idMethodMissing) {
559 defined_class =
RBASIC(defined_class)->klass;
639 #define NOEX_MISSING 0x80
649 format =
"undefined method `%s' for %s";
667 int last_call_status)
670 const char *format = 0;
672 if (argc == 0 || !
SYMBOL_P(argv[0])) {
679 format =
"private method `%s' called for %s";
682 format =
"protected method `%s' called for %s";
685 format =
"undefined local variable or method `%s' for %s";
689 format =
"super: no superclass method `%s' for %s";
711 if (
id == idMethodMissing) {
730 result =
rb_funcall2(obj, idMethodMissing, argc + 1, nargv);
793 for (i = 0; i <
n; i++) {
794 argv[
i] = va_arg(ar,
VALUE);
843 if (!
NIL_P(pass_procval)) {
849 block = &pass_proc->
block;
876 vid = *argv++; argc--;
882 recv, ++argc, --argv);
888 return rb_call0(recv,
id, argc, argv, scope,
self);
971 for (i=0; i<
n; i++) {
972 argv[
i] = va_arg(args,
VALUE);
1003 if (!
NIL_P(blockarg)) {
1006 blockptr = &blockproc->
block;
1077 blockptr->
iseq = (
void *)node;
1085 retval = (*it_proc) (data1);
1093 if (cep == escape_ep) {
1109 if (cep == escape_ep) {
1196 volatile int parse_in_eval;
1197 volatile int mild_compile_error;
1210 NODE *cref = cref_arg;
1213 volatile VALUE iseqval;
1218 absolute_path = file;
1221 if (!
NIL_P(scope)) {
1232 base_block = &env->
block;
1239 base_block = &
block;
1240 base_block->
self =
self;
1248 if ((fname = file) ==
Qundef) {
1254 if (
RTEST(absolute_path))
1264 if (!cref && base_block->
iseq) {
1267 crefval = (
VALUE) cref;
1296 VALUE mesg, errat, bt2;
1355 rb_scan_args(argc, argv,
"13", &src, &scope, &vfile, &vline);
1542 block.
self = refinement;
1547 RB_OBJ_WRITE(cref, &cref->nd_refinements, refinements);
1585 return eval_under(klass,
self, argv[0], file, line);
1746 if (tt->
tag == tag) {
1914 while (cfp->
ep != ep) {
VALUE rb_f_public_send(int argc, VALUE *argv, VALUE recv)
const rb_block_t * passed_block
#define RB_TYPE_P(obj, type)
struct rb_block_struct * blockptr
VALUE rb_ary_unshift(VALUE ary, VALUE item)
#define UNDEFINED_METHOD_ENTRY_P(me)
#define RUBY_VM_CHECK_INTS(th)
static int check_funcall_respond_to(rb_thread_t *th, VALUE klass, VALUE recv, ID mid)
int register char * block
RUBY_EXTERN VALUE rb_cBasicObject
rb_funcall2(argv[0], id_yield, argc-1, argv+1)
static int vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary)
void rb_bug(const char *fmt,...)
VALUE rb_obj_instance_exec(int, VALUE *, VALUE)
#define RB_OBJ_WRITE(a, slot, b)
static NODE * vm_cref_push(rb_thread_t *th, VALUE klass, int noex, rb_block_t *blockptr)
RUBY_EXTERN VALUE rb_cModule
static VALUE iterate_method(VALUE obj)
static VALUE rb_call0(VALUE recv, ID mid, int argc, const VALUE *argv, call_type scope, VALUE self)
static rb_control_frame_t * vm_get_ruby_level_caller_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
VALUE rb_class_new_instance(int, VALUE *, VALUE)
#define VM_FRAME_FLAG_FINISH
VALUE rb_mod_module_eval(int, VALUE *, VALUE)
static void stack_check(void)
VALUE rb_eval_cmd(VALUE, VALUE, int)
static VALUE * VM_CF_PREV_EP(rb_control_frame_t *cfp)
#define VM_FRAME_MAGIC_CFUNC
static VALUE send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope)
static rb_control_frame_t * vm_push_frame(rb_thread_t *th, const rb_iseq_t *iseq, VALUE type, VALUE self, VALUE klass, VALUE specval, const VALUE *pc, VALUE *sp, int local_size, const rb_method_entry_t *me, size_t stack_max)
void rb_throw(const char *tag, VALUE val)
#define RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)
#define GetProcPtr(obj, ptr)
VALUE rb_ary_subseq(VALUE ary, long beg, long len)
rb_funcall(memo->yielder, id_lshift, 1, rb_assoc_new(memo->prev_value, memo->prev_elts))
SSL_METHOD *(* func)(void)
VALUE rb_eval_string_wrap(const char *, int *)
Evaluates the given string under a module binding in an isolated binding.
VALUE rb_const_get(VALUE, ID)
union rb_method_definition_struct::@149 body
static void vm_set_eval_stack(rb_thread_t *th, VALUE iseqval, const NODE *cref, rb_block_t *base_block)
#define RUBY_EVENT_C_RETURN
#define GET_THROWOBJ_CATCH_POINT(obj)
struct rb_method_entry_struct * orig_me
VALUE rb_str_new_cstr(const char *)
#define new_args(f, o, r, p, t)
static void raise_method_missing(rb_thread_t *th, int argc, const VALUE *argv, VALUE obj, int last_call_status)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
void rb_check_funcall_hook(int, VALUE, ID, int, const VALUE *, VALUE)
ID rb_frame_this_func(void)
VALUE rb_name_err_mesg_new(VALUE obj, VALUE mesg, VALUE recv, VALUE method)
#define TH_JUMP_TAG(th, st)
static VALUE check_funcall_failed(struct rescue_funcall_args *args, VALUE e)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_yield_values2(int n, const VALUE *argv)
VALUE rb_ary_tmp_new(long capa)
VALUE rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE line, rb_block_t *base_block, VALUE opt)
void rb_vm_pop_cfunc_frame(void)
#define RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)
#define VM_ENVVAL_BLOCK_PTR(v)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *state)
static VALUE vm_call0_cfunc_with_frame(rb_thread_t *th, rb_call_info_t *ci, const VALUE *argv)
void rb_raise(VALUE exc, const char *fmt,...)
VALUE rb_funcall_with_block(VALUE, ID, int, const VALUE *, VALUE)
static VALUE rb_yield_0(int argc, const VALUE *argv)
VALUE rb_ary_clear(VALUE ary)
#define SafeStringValue(v)
static VALUE vm_yield(rb_thread_t *th, int argc, const VALUE *argv)
static VALUE catch_i(VALUE tag, VALUE data)
static VALUE eval_string_from_file_helper(VALUE data)
#define GetEnvPtr(obj, ptr)
VALUE rb_catch_obj(VALUE, VALUE(*)(ANYARGS), VALUE)
void rb_define_global_function(const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a global function.
VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE *)
VALUE rb_vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, int argc, const VALUE *argv, const rb_block_t *blockptr)
static VALUE * VM_CF_LEP(rb_control_frame_t *cfp)
ID rb_check_id(volatile VALUE *namep)
Returns ID for the given name if it is interned already, or 0.
VALUE rb_catch(const char *, VALUE(*)(ANYARGS), VALUE)
VALUE ruby_eval_string_from_file(const char *str, const char *filename)
VALUE rb_iterate(VALUE(*)(VALUE), VALUE, VALUE(*)(ANYARGS), VALUE)
static VALUE eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *const cref_arg, volatile VALUE file, volatile int line)
static int check_funcall_callable(rb_thread_t *th, const rb_method_entry_t *me)
VALUE rb_f_send(int argc, VALUE *argv, VALUE recv)
int ruby_stack_check(void)
#define RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, klass, id)
VALUE rb_vm_call(rb_thread_t *th, VALUE recv, VALUE id, int argc, const VALUE *argv, const rb_method_entry_t *me, VALUE defined_class)
VALUE rb_block_call_func(RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg))
void rb_exc_raise(VALUE mesg)
static VALUE vm_call0_cfunc(rb_thread_t *th, rb_call_info_t *ci, const VALUE *argv)
enum rb_method_definition_struct::@149::method_optimized_type optimize_type
VALUE rb_singleton_class(VALUE obj)
Returns the singleton class of obj.
VALUE rb_obj_instance_eval(int, VALUE *, VALUE)
void rb_str_update(VALUE, long, long, VALUE)
unsigned short first_lineno
static VALUE make_no_method_exception(VALUE exc, const char *format, VALUE obj, int argc, const VALUE *argv)
static VALUE rb_f_local_variables(void)
int rb_block_given_p(void)
static VALUE rb_f_catch(int argc, VALUE *argv)
#define StringValuePtr(v)
rb_control_frame_t * rb_vm_get_ruby_level_next_cfp(rb_thread_t *th, const rb_control_frame_t *cfp)
VALUE rb_yield_splat(VALUE)
void rb_raise_method_missing(rb_thread_t *th, int argc, VALUE *argv, VALUE obj, int call_status)
VALUE rb_funcallv(VALUE, ID, int, const VALUE *)
Calls a method.
VALUE rb_special_singleton_class(VALUE obj)
VALUE rb_eval_string_protect(const char *, int *)
Evaluates the given string in an isolated binding.
RUBY_EXTERN VALUE rb_mKernel
#define RARRAY_CONST_PTR(a)
VALUE rb_yield_refine_block(VALUE refinement, VALUE refinements)
#define RARRAY_AREF(a, i)
VALUE rb_yield_block(VALUE, VALUE, int, const VALUE *, VALUE)
static int rb_method_call_status(rb_thread_t *th, const rb_method_entry_t *me, call_type scope, VALUE self)
#define COPY_CREF(c1, c2)
#define PASS_PASSED_BLOCK()
static VALUE iterate_check_method(VALUE obj)
VALUE rb_get_backtrace(VALUE info)
VALUE rb_check_funcall_with_hook(VALUE recv, ID mid, int argc, const VALUE *argv, rb_check_funcall_hook *hook, VALUE arg)
static const char * rb_type_str(enum ruby_value_type type)
int rb_method_entry_arity(const rb_method_entry_t *me)
VALUE rb_call_super(int, const VALUE *)
const rb_data_type_t ruby_binding_data_type
VALUE rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr)
#define RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, klass, id)
static VALUE eval_under(VALUE under, VALUE self, VALUE src, VALUE file, int line)
VALUE rb_vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp)
static VALUE rb_f_loop(VALUE self)
#define ALLOCA_N(type, n)
void rb_throw_obj(VALUE tag, VALUE value)
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)
VALUE rb_check_block_call(VALUE, ID, int, const VALUE *, rb_block_call_func_t, VALUE)
VALUE rb_eval_string(const char *)
Evaluates the given string in an isolated binding.
VALUE rb_obj_clone(VALUE)
static rb_block_t * VM_CF_BLOCK_PTR(rb_control_frame_t *cfp)
static VALUE vm_exec(rb_thread_t *th)
rb_block_call(enumerable, id_each, 0, 0, chunk_ii, arg)
rb_method_entry_t * rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_flag_t noex)
#define CONST_ID(var, str)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
#define rb_thread_raised_set(th, f)
static VALUE rb_f_throw(int argc, VALUE *argv)
static void vm_pop_frame(rb_thread_t *th)
void rb_set_safe_level_force(int)
void rb_extend_object(VALUE obj, VALUE module)
static VALUE vm_yield_with_cref(rb_thread_t *th, int argc, const VALUE *argv, const NODE *cref)
static VALUE vm_call_super(rb_thread_t *th, int argc, const VALUE *argv)
VALUE rb_rescue2(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*r_proc)(ANYARGS), VALUE data2,...)
rb_iseq_location_t location
VALUE rb_attr_get(VALUE, ID)
static VALUE vm_call_bmethod_body(rb_thread_t *th, rb_call_info_t *ci, const VALUE *argv)
VALUE(* invoker)(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE vm_call0(rb_thread_t *th, VALUE recv, ID id, int argc, const VALUE *argv, const rb_method_entry_t *me, VALUE defined_class)
#define NEW_THROW_OBJECT(val, pt, st)
#define MEMCPY(p1, p2, type, n)
static VALUE rb_f_loop_size(VALUE self, VALUE args, VALUE eobj)
#define va_init_list(a, b)
static VALUE loop_i(void)
VALUE rb_funcallv_public(VALUE, ID, int, const VALUE *)
Calls a method.
VALUE rb_str_cat(VALUE, const char *, long)
#define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn)
VALUE rb_module_new(void)
VALUE rb_obj_is_kind_of(VALUE, VALUE)
int rb_method_basic_definition_p(VALUE, ID)
int mild_compile_error
Thread-local state of compiling context.
rb_method_definition_t * def
const rb_method_entry_t * me
VALUE rb_check_array_type(VALUE ary)
VALUE rb_vm_backtrace_str_ary(rb_thread_t *th, long lev, long n)
static VALUE yield_under(VALUE under, VALUE self, VALUE values)
RUBY_EXTERN VALUE rb_cObject
VALUE ruby_eval_string_from_file_protect(const char *str, const char *filename, int *state)
#define RARRAY_LENINT(ary)
int rb_respond_to(VALUE, ID)
static VALUE vm_call_iseq_setup(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
static VALUE rb_call(VALUE recv, ID mid, int argc, const VALUE *argv, call_type scope)
VALUE rb_apply(VALUE, ID, VALUE)
Calls a method.
static VALUE specific_eval(int argc, VALUE *argv, VALUE klass, VALUE self)
#define rb_thread_raised_p(th, f)
rb_ivar_set(yielder, id_memo, LONG2NUM(++count))
VALUE rb_f_block_given_p(void)
rb_call_info_t * passed_ci
#define EXEC_EVENT_HOOK(th_, flag_, self_, id_, klass_, data_)
VALUE rb_f_eval(int argc, VALUE *argv, VALUE self)
NODE * rb_vm_get_cref(const rb_iseq_t *, const VALUE *)
#define GetISeqPtr(obj, ptr)
VALUE rb_obj_alloc(VALUE)
const char * rb_id2name(ID id)
#define Check_TypedStruct(v, t)
const VALUE absolute_path
#define RBASIC_CLEAR_CLASS(obj)
static rb_method_entry_t * rb_search_method_entry(VALUE recv, ID mid, VALUE *defined_class_ptr)
#define PASS_PASSED_BLOCK_TH(th)
void rb_vm_rewind_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
static VALUE rb_method_missing(int argc, const VALUE *argv, VALUE obj)
VALUE rb_current_realfilepath(void)
union rb_call_info_struct::@189 aux
#define CHECK_VM_STACK_OVERFLOW(cfp, margin)
#define SPECIAL_CONST_P(x)
#define RARRAY_ASET(a, i, v)
return rb_yield_values(2, rb_enum_values_pack(argc, argv), INT2NUM(n))
#define NODE_FL_CREF_PUSHED_BY_EVAL
static VALUE eval_string(VALUE self, VALUE src, VALUE scope, VALUE file, int line)
int method_missing_reason
static rb_thread_t * GET_THREAD(void)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
VALUE rb_check_funcall(VALUE, ID, int, const VALUE *)
#define RUBY_EVENT_C_CALL
VALUE rb_iseq_disasm(VALUE self)
static VALUE method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status)
#define GET_THROWOBJ_VAL(obj)
static VALUE vm_yield_with_block(rb_thread_t *th, int argc, const VALUE *argv, const rb_block_t *blockargptr)
static VALUE check_funcall_missing(rb_thread_t *th, VALUE klass, VALUE recv, ID mid, int argc, const VALUE *argv)
VALUE rb_usascii_str_new_cstr(const char *)
static VALUE check_funcall_exec(struct rescue_funcall_args *args)
static VALUE vm_call0_body(rb_thread_t *th, rb_call_info_t *ci, const VALUE *argv)
VALUE rb_mod_module_exec(int, VALUE *, VALUE)
const rb_method_entry_t * me
int parse_in_eval
Thread-local state of evaluation context.
void rb_ary_set_len(VALUE ary, long len)
VALUE rb_sourcefilename(void)