57 for (i=0; i < local_size; i++) {
69 cfp->bp_check = sp + 1;
114 err_mess =
rb_sprintf(
"wrong number of arguments (%d for %d)",
argc, min);
117 err_mess =
rb_sprintf(
"wrong number of arguments (%d for %d+)",
argc, min);
120 err_mess =
rb_sprintf(
"wrong number of arguments (%d for %d..%d)",
argc, min,
max);
170 return (
NODE *)*svar;
245 rb_bug(
"unexpected back-ref");
263 else if (ep[-1] !=
Qnil) {
264 return (
NODE *)ep[-1];
276 rb_bug(
"rb_vm_get_cref: unreachable");
286 if (node->nd_clss == old_klass) {
289 RB_OBJ_WRITE(new_node, &new_node->nd_next, node->nd_next);
290 *new_cref_ptr = new_node;
295 node = node->nd_next;
296 *new_cref_ptr = new_node;
297 new_cref_ptr = &new_node->nd_next;
299 *new_cref_ptr =
NULL;
307 cref->nd_refinements =
Qnil;
308 cref->nd_visi = noex;
317 if (cref->nd_next && cref->nd_next != (
void *) 1 &&
318 !
NIL_P(cref->nd_next->nd_refinements)) {
332 if ((klass = cref->nd_clss) != 0) {
335 cref = cref->nd_next;
349 (klass = cref->nd_clss) != 0) {
352 cref = cref->nd_next;
385 VALUE orig_klass,
ID id,
int is_defined)
389 if (orig_klass ==
Qnil) {
393 VALUE klass = orig_klass;
396 root_cref = root_cref->nd_next;
399 while (cref && cref->nd_next) {
404 klass = cref->nd_clss;
406 cref = cref->nd_next;
416 if (am == klass)
break;
418 if (is_defined)
return 1;
421 goto search_continue;
436 if (root_cref && !
NIL_P(root_cref->nd_clss)) {
467 rb_bug(
"vm_get_cvar_base: no cref");
470 while (cref->nd_next &&
473 cref = cref->nd_next;
475 if (!cref->nd_next) {
476 rb_warn(
"class variable access from toplevel");
501 #ifndef USE_IC_FOR_IVAR 502 #define USE_IC_FOR_IVAR 1 530 if (
st_lookup(iv_index_tbl,
id, &index)) {
531 if ((
long)index < len) {
614 int state = (int)(throw_state & 0xff);
615 int flag = (int)(throw_state & 0x8000);
631 if (cfp->
iseq->
type != ISEQ_TYPE_BLOCK) {
632 if (cfp->
iseq->
type == ISEQ_TYPE_CLASS) {
646 rb_bug(
"VM (throw): can't find break base.");
668 entry->
start < epc && entry->
end >= epc) {
669 if (entry->
cont == epc) {
695 for (i = 0; i <
level; i++) {
703 int in_class_frame = 0;
713 if (lep == target_lep && cfp->
iseq->
type == ISEQ_TYPE_CLASS) {
718 if (lep == target_lep) {
722 if (in_class_frame) {
728 while (target_lep != tep) {
729 if (cfp->
ep == tep) {
739 if (cfp->
ep == target_lep && cfp->
iseq->
type == ISEQ_TYPE_METHOD) {
753 rb_bug(
"isns(throw): unsupport throw type");
783 int is_splat = flag & 0x01;
784 rb_num_t space_size = num + is_splat;
793 cfp->
sp += space_size;
803 for (i=0; i<num-len; i++) {
807 for (j=0; i<num; i++, j++) {
808 VALUE v = ptr[len - j - 1];
818 VALUE *bptr = &base[space_size - 1];
820 for (i=0; i<num; i++) {
848 #if OPT_INLINE_METHOD_CACHE 858 #if OPT_INLINE_METHOD_CACHE 877 #ifndef NO_BIG_INLINE 959 rb_bug(
"check_match: unreachable");
964 #if defined(_MSC_VER) && _MSC_VER < 1300 965 #define CHECK_CMP_NAN(a, b) if (isnan(a) || isnan(b)) return Qfalse; 967 #define CHECK_CMP_NAN(a, b) 1004 if (cfp->
iseq->
type == ISEQ_TYPE_METHOD) {
1009 #if VM_DEBUG_BP_CHECK 1010 if (
bp != cfp->bp_check) {
1011 fprintf(stderr,
"bp_check: %ld, bp: %ld\n",
1014 rb_bug(
"vm_base_ptr: unreachable");
1026 #define SAVE_RESTORE_CI(expr, ci) do { \ 1027 int saved_argc = (ci)->argc; rb_block_t *saved_blockptr = (ci)->blockptr; \ 1029 (ci)->argc = saved_argc; (ci)->blockptr = saved_blockptr; \ 1036 proc = *(--cfp->
sp);
1046 "wrong argument type %s (expected Proc)",
1082 for (i = 0; i < len; i++) {
1083 *cfp->
sp++ = ptr[i];
1093 VALUE keyword_hash = 0, orig_hash;
1094 int optional =
iseq->arg_keywords -
iseq->arg_keyword_required;
1108 orig_argv[
argc-1] = orig_hash;
1112 (
iseq->arg_keyword_check ? optional : -1-optional),
1115 if (!keyword_hash) {
1122 *kwd = keyword_hash;
1130 const int m =
iseq->argc;
1131 const int opts =
iseq->arg_opts - (
iseq->arg_opts > 0);
1132 const int min = m +
iseq->arg_post_len;
1134 const int orig_argc = ci->
argc;
1135 int argc = orig_argc;
1143 if (
iseq->arg_keyword != -1) {
1156 if (
iseq->arg_post_len) {
1157 if (!(orig_argc < iseq->arg_post_start)) {
1168 if (
iseq->arg_opts) {
1172 opt_pc =
iseq->arg_opt_table[opts];
1176 for (i =
argc; i<opts; i++) {
1177 orig_argv[i + m] =
Qnil;
1179 opt_pc =
iseq->arg_opt_table[
argc];
1185 if (
iseq->arg_rest != -1) {
1191 if (
iseq->arg_keyword != -1) {
1193 int arg_keywords_end =
iseq->arg_keyword - (
iseq->arg_block != -1);
1194 for (i =
iseq->arg_keywords; 0 < i; i--) {
1195 orig_argv[arg_keywords_end - i] =
Qnil;
1197 orig_argv[
iseq->arg_keyword] = keyword_hash;
1201 if (
iseq->arg_block != -1) {
1207 if (blockptr->
proc == 0) {
1214 blockval = blockptr->
proc;
1218 orig_argv[
iseq->arg_block] = blockval;
1279 for (i =
iseq->arg_size, local_size =
iseq->local_size; i < local_size; i++) {
1305 sp_orig =
sp = cfp->
sp;
1312 for (i=0; i <
iseq->arg_size; i++) {
1313 *
sp++ = src_argv[i];
1317 for (i = 0; i <
iseq->local_size -
iseq->arg_size; i++) {
1344 return (*
func)(recv);
1404 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9]);
1410 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9],
argv[10]);
1416 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9],
argv[10],
argv[11]);
1422 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9],
argv[10],
argv[11],
argv[12]);
1428 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9],
argv[10],
argv[11],
argv[12],
argv[13]);
1434 return (*
func)(recv,
argv[0],
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
argv[6],
argv[7],
argv[8],
argv[9],
argv[10],
argv[11],
argv[12],
argv[13],
argv[14]);
1438 #define VM_PROFILE 0 1442 static int vm_profile_counter[4];
1443 #define VM_PROFILE_UP(x) (vm_profile_counter[x]++) 1444 #define VM_PROFILE_ATEXIT() atexit(vm_profile_show_result) 1446 vm_profile_show_result(
void)
1448 fprintf(stderr,
"VM Profile results: \n");
1449 fprintf(stderr,
"r->c call: %d\n", vm_profile_counter[0]);
1450 fprintf(stderr,
"r->c popf: %d\n", vm_profile_counter[1]);
1451 fprintf(stderr,
"c->c call: %d\n", vm_profile_counter[2]);
1452 fprintf(stderr,
"r->c popf: %d\n", vm_profile_counter[3]);
1455 #define VM_PROFILE_UP(x) 1456 #define VM_PROFILE_ATEXIT() 1463 #if VM_DEBUG_VERIFY_METHOD_CACHE 1468 # define METHOD_BUG(t) case VM_METHOD_TYPE_##t: rb_bug("wrong method type: " #t) 1470 METHOD_BUG(ATTRSET);
1472 METHOD_BUG(BMETHOD);
1475 METHOD_BUG(OPTIMIZED);
1476 METHOD_BUG(MISSING);
1477 METHOD_BUG(REFINED);
1492 int len = cfunc->
argc;
1512 if (reg_cfp != th->
cfp + 1) {
1513 rb_bug(
"vm_call_cfunc - cfp consistency error");
1524 #if OPT_CALL_CFUNC_WITHOUT_FRAME 1540 if (reg_cfp == th->
cfp) {
1542 rb_bug(
"vm_call_cfunc_latter: passed_ci error (ci: %p, passed_ci: %p)", ci, th->
passed_ci);
1548 rb_bug(
"vm_call_cfunc_latter: cfp consistency error (%p, %p)", reg_cfp, th->
cfp+1);
1574 val = vm_call_cfunc_latter(th, reg_cfp, ci);
1639 cfp->
sp += - ci->
argc - 1;
1655 int i = ci->
argc - 1;
1659 if (ci->
argc == 0) {
1715 ci_entry.
mid = idMethodMissing;
1735 if (
NIL_P(refinements)) {
1757 }
while (cfp->
iseq != local_iseq);
1771 int enable_fastpath = 1;
1774 start_method_dispatch:
1776 if ((ci->
me->
flag == 0)) {
1779 normal_method_dispatch:
1813 zsuper_method_dispatch:
1817 goto start_method_dispatch;
1825 goto normal_method_dispatch;
1828 goto start_method_dispatch;
1833 case OPTIMIZED_METHOD_TYPE_SEND:
1836 case OPTIMIZED_METHOD_TYPE_CALL:
1840 rb_bug(
"vm_call_method: unsupported optimized method type (%d)",
1849 VALUE refinements = cref ? cref->nd_refinements :
Qnil;
1850 VALUE refinement, defined_class;
1855 if (
NIL_P(refinement)) {
1856 goto no_refinement_dispatch;
1864 goto no_refinement_dispatch;
1870 goto start_method_dispatch;
1874 no_refinement_dispatch:
1880 goto start_method_dispatch;
1884 goto zsuper_method_dispatch;
1888 rb_bug(
"vm_call_method: unsupported method type (%d)", ci->
me->
def->
type);
1903 enable_fastpath = 0;
1909 goto normal_method_dispatch;
1916 goto normal_method_dispatch;
1929 if (ci->
mid == idMethodMissing) {
1941 rb_bug(
"vm_call_method: unreachable");
1963 klass =
RBASIC(klass)->klass;
1986 ci->
mid =
iseq->defined_method_id;
2005 if (lcfp->
ep == tep) {
2029 VALUE current_defined_class;
2033 current_defined_class =
GET_CFP()->klass;
2034 if (
NIL_P(current_defined_class)) {
2047 RBASIC(current_defined_class)->klass : current_defined_class;
2050 "self has wrong type to call super in this context: " 2060 "implicit argument passing of super from method defined" 2061 " by define_method() is not supported." 2062 " Specify all arguments explicitly.");
2113 else if (
argc == 0) {
2121 if (blockargptr->
proc) {
2122 blockarg = blockargptr->
proc;
2134 th->
cfp->
sp, 1, 0, 0);
2136 val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval,
argc,
argv, blockarg);
2153 const int m =
iseq->argc;
2154 const int r =
iseq->arg_rest;
2155 int len =
iseq->arg_post_len;
2157 int rsize =
argc > m ?
argc - m : 0;
2158 int psize = rsize > len ? len : rsize;
2165 if (
iseq->arg_opts) {
2166 const int opts =
iseq->arg_opts - 1;
2169 opt_pc =
iseq->arg_opt_table[opts];
2173 opt_pc =
iseq->arg_opt_table[rsize];
2179 printf(
" argc: %d\n",
argc);
2180 printf(
" len: %d\n", len);
2181 printf(
"start: %d\n",
start);
2182 printf(
"rsize: %d\n", rsize);
2197 for (i=psize; i<len; i++) {
2210 int argc = orig_argc;
2211 const int m =
iseq->argc;
2212 const int min = m +
iseq->arg_post_len;
2225 if (!(
iseq->arg_simple & 0x02) &&
2227 iseq->arg_opts > 2 ||
2228 iseq->arg_keyword != -1 ||
2248 if (
iseq->arg_keyword != -1) {
2252 for (i=
argc; i<m; i++) {
2256 if (
iseq->arg_rest == -1 &&
iseq->arg_opts == 0) {
2257 const int arg_size =
iseq->arg_size;
2258 if (arg_size <
argc) {
2267 int r =
iseq->arg_rest;
2269 if (
iseq->arg_post_len ||
2278 for (i=
argc; i<r; i++) {
2292 if (
iseq->arg_keyword != -1) {
2293 int arg_keywords_end =
iseq->arg_keyword - (
iseq->arg_block != -1);
2294 for (i =
iseq->arg_keywords; 0 < i; i--) {
2297 argv[
iseq->arg_keyword] = keyword_hash;
2301 if (
iseq->arg_block != -1) {
2305 if (blockptr->
proc == 0) {
2309 procval = blockptr->
proc;
2325 printf(
" argc: %d\n",
argc);
2326 printf(
"iseq argc: %d\n",
iseq->argc);
2327 printf(
"iseq opts: %d\n",
iseq->arg_opts);
2328 printf(
"iseq rest: %d\n",
iseq->arg_rest);
2329 printf(
"iseq post: %d\n",
iseq->arg_post_len);
2330 printf(
"iseq blck: %d\n",
iseq->arg_block);
2331 printf(
"iseq smpl: %d\n",
iseq->arg_simple);
2332 printf(
" lambda: %s\n", lambda ?
"true" :
"false");
2356 if ((
type != ISEQ_TYPE_METHOD &&
type != ISEQ_TYPE_CLASS) || block == 0) {
2367 const int arg_size =
iseq->arg_size;
2379 iseq->iseq_encoded + opt_pc,
2381 iseq->local_size - arg_size, 0,
iseq->stack_max);
2400 rb_bug(
"vm_make_proc_with_iseq: unreachable");
2404 blockptr->
iseq = blockiseq;
RUBY_EXTERN VALUE rb_cString
#define VM_FRAME_MAGIC_BLOCK
#define VM_CALL_ARGS_BLOCKARG
#define DEFAULT_SPECIAL_VAR_COUNT
struct rb_block_struct * blockptr
#define UNDEFINED_METHOD_ENTRY_P(me)
#define RUBY_VM_CHECK_INTS(th)
VALUE rb_reg_match_last(VALUE)
static VALUE opt_eq_func(VALUE recv, VALUE obj, CALL_INFO ci)
static VALUE vm_call_iseq_setup_2(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
static VALUE call_cfunc_0(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static void argument_error(const rb_iseq_t *iseq, int miss_argc, int min_argc, int max_argc)
VALUE rb_ary_entry(VALUE ary, long offset)
VALUE rb_vm_backtrace_object(void)
RUBY_EXTERN VALUE rb_cFloat
#define RUBY_EVENT_C_RETURN
VALUE rb_proc_call_with_block(VALUE, int argc, const VALUE *argv, VALUE)
void rb_bug(const char *fmt,...)
static VALUE vm_get_iclass(rb_control_frame_t *cfp, VALUE klass)
static VALUE vm_call_opt_call(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
VALUE rb_str_equal(VALUE str1, VALUE str2)
static VALUE vm_call_general(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
#define VM_ENVVAL_PREV_EP_PTR(v)
#define RCLASS_CONST_TBL(c)
static VALUE vm_call_bmethod(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
#define VM_FRAME_FLAG_FINISH
static int vm_yield_setup_block_args(rb_thread_t *th, const rb_iseq_t *iseq, int orig_argc, VALUE *argv, const rb_block_t *blockptr)
#define VM_FRAME_TYPE_FINISH_P(cfp)
#define VM_FRAME_MAGIC_CFUNC
static int max(int a, int b)
static VALUE find_refinement(VALUE refinements, VALUE klass)
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)
#define RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)
#define GetProcPtr(obj, ptr)
static VALUE vm_get_const_base(const rb_iseq_t *iseq, const VALUE *ep)
#define RUBY_VM_NORMAL_ISEQ_P(ptr)
#define FLOAT_REDEFINED_OP_FLAG
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
static int vm_callee_setup_keyword_arg(rb_thread_t *th, const rb_iseq_t *iseq, int argc, int m, VALUE *orig_argv, VALUE *kwd)
static int block_proc_is_lambda(const VALUE procval)
static int rb_method_definition_eq(const rb_method_definition_t *d1, const rb_method_definition_t *d2)
rb_method_entry_t * rb_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class_ptr)
static VALUE call_cfunc_10(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
struct rb_method_entry_struct * orig_me
static void vm_expandarray(rb_control_frame_t *cfp, VALUE ary, rb_num_t num, int flag)
SSL_METHOD *(* func)(void)
static VALUE vm_call_iseq_setup_tailcall(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
VALUE rb_obj_equal(VALUE obj1, VALUE obj2)
static const rb_method_cfunc_t * vm_method_cfunc_entry(const rb_method_entry_t *me)
#define RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
#define VM_ENVVAL_BLOCK_PTR(v)
VALUE rb_vm_make_proc(rb_thread_t *th, const rb_block_t *block, VALUE klass)
VALUE rb_iv_set(VALUE, const char *, VALUE)
#define ROBJECT_IV_INDEX_TBL(o)
static VALUE vm_call_cfunc_with_frame(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
if((ID)(DISPID) nameid !=nameid)
static VALUE vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
#define VM_FRAME_MAGIC_METHOD
struct rb_iseq_struct * local_iseq
void rb_raise(VALUE exc, const char *fmt,...)
#define VM_FRAME_TYPE(cfp)
static void lep_svar_set(rb_thread_t *th, VALUE *lep, rb_num_t key, VALUE val)
VALUE rb_ivar_get(VALUE, ID)
#define VM_FRAME_MAGIC_IFUNC
VALUE rb_obj_is_kind_of(VALUE, VALUE)
int rb_const_defined(VALUE, ID)
#define VM_CALL_ARGS_SPLAT
union rb_method_definition_struct::@126 body
void rb_vm_localjump_error(const char *mesg, VALUE value, int reason)
#define RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)
#define STACK_ADDR_FROM_TOP(n)
#define GET_GLOBAL_METHOD_STATE()
static VALUE vm_getinstancevariable(VALUE obj, ID id, IC ic)
VALUE rb_reg_match_post(VALUE)
static VALUE vm_once_clear(VALUE data)
static VALUE lep_svar_get(rb_thread_t *th, VALUE *lep, rb_num_t key)
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)
RUBY_EXTERN VALUE rb_cProc
static int vm_yield_setup_args(rb_thread_t *const th, const rb_iseq_t *iseq, int argc, VALUE *argv, const rb_block_t *blockptr, int lambda)
static VALUE vm_getspecial(rb_thread_t *th, VALUE *lep, rb_num_t key, rb_num_t type)
ID rb_check_id(volatile VALUE *namep)
Returns ID for the given name if it is interned already, or 0.
static VALUE vm_search_const_defined_class(const VALUE cbase, ID id)
union iseq_inline_cache_entry::@164 ic_value
static VALUE vm_call_cfunc(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
VALUE rb_reg_last_match(VALUE)
static VALUE call_cfunc_11(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
const char * rb_obj_classname(VALUE)
static VALUE vm_call_iseq_setup_normal(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
#define RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, klass, id)
struct iseq_inline_storage_entry::@165 once
static void vm_check_if_namespace(VALUE klass)
static void vm_caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
RUBY_SYMBOL_EXPORT_BEGIN typedef unsigned long st_data_t
enum iseq_catch_table_entry::catch_type type
void rb_exc_raise(VALUE mesg)
static VALUE vm_call_ivar(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
VALUE rb_extract_keywords(VALUE *orighash)
#define RB_TYPE_P(obj, type)
enum rb_iseq_struct::iseq_type type
static VALUE vm_make_proc_with_iseq(rb_iseq_t *blockiseq)
int st_lookup(st_table *, st_data_t, st_data_t *)
static NODE * vm_cref_push(rb_thread_t *th, VALUE klass, int noex, rb_block_t *blockptr)
static VALUE call_cfunc_15(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE make_no_method_exception(VALUE exc, const char *format, VALUE obj, int argc, const VALUE *argv)
#define SAVE_RESTORE_CI(expr, ci)
rb_control_frame_t * rb_vm_get_ruby_level_next_cfp(rb_thread_t *th, const rb_control_frame_t *cfp)
void rb_raise_method_missing(rb_thread_t *th, int argc, VALUE *argv, VALUE obj, int call_status)
RUBY_EXTERN VALUE rb_cObject
#define RMODULE_IS_REFINEMENT
static int vm_yield_setup_block_args_complex(rb_thread_t *th, const rb_iseq_t *iseq, int argc, VALUE *argv)
#define CHECK_CMP_NAN(a, b)
#define RMODULE_IS_OVERLAID
static VALUE vm_throw(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_num_t throw_state, VALUE throwobj)
void rb_ary_store(VALUE ary, long idx, VALUE val)
enum rb_method_definition_struct::@126::method_optimized_type optimize_type
static VALUE call_cfunc_2(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE vm_call_attrset(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
int rb_public_const_defined_from(VALUE klass, ID id)
static int vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq, VALUE sigval, rb_call_info_t *ci)
#define ALLOCA_N(type, n)
#define RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, klass, id)
RUBY_EXTERN VALUE rb_cModule
#define MEMCPY(p1, p2, type, n)
static VALUE vm_call_super_method(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
static int check_cfunc(const rb_method_entry_t *me, VALUE(*func)())
#define RUBY_EVENT_C_CALL
static VALUE call_cfunc_1(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE call_cfunc_9(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE call_cfunc_3(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
rb_method_entry_t * rb_method_entry(VALUE klass, ID id, VALUE *define_class_ptr)
union rb_call_info_struct::@166 aux
#define RCLASS_REFINED_CLASS(c)
VALUE rb_const_get(VALUE, ID)
VALUE rb_ary_to_ary(VALUE obj)
rb_method_entry_t * rb_method_entry_with_refinements(VALUE klass, ID id, VALUE *defined_class_ptr)
#define RARRAY_CONST_PTR(a)
static rb_block_t * VM_CF_BLOCK_PTR(rb_control_frame_t *cfp)
#define VM_EP_PREV_EP(ep)
VALUE(* invoker)(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE vm_call0(rb_thread_t *, VALUE, ID, int, const VALUE *, const rb_method_entry_t *, VALUE)
VALUE rb_obj_is_proc(VALUE)
static VALUE call_cfunc_13(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
VALUE rb_sprintf(const char *format,...)
#define CI_SET_FASTPATH(ci, func, enabled)
void rb_vm_rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
#define MEMMOVE(p1, p2, type, n)
static VALUE vm_call_opt_send(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
VALUE rb_ivar_set(VALUE, ID, VALUE)
VALUE rb_check_hash_type(VALUE hash)
struct rb_iseq_struct * parent_iseq
#define FIXNUM_REDEFINED_OP_FLAG
int rb_autoloading_value(VALUE mod, ID id, VALUE *value)
static VALUE * vm_base_ptr(rb_control_frame_t *cfp)
static void vm_pop_frame(rb_thread_t *th)
static NODE * lep_svar_place(rb_thread_t *th, VALUE *lep)
static VALUE check_match(VALUE pattern, VALUE target, enum vm_check_match_type type)
static VALUE call_cfunc_m2(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE vm_search_normal_superclass(VALUE klass)
static VALUE call_cfunc_12(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE vm_call_bmethod_body(rb_thread_t *th, rb_call_info_t *ci, const VALUE *argv)
static VALUE call_cfunc_5(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static rb_control_frame_t * current_method_entry(rb_thread_t *th, rb_control_frame_t *cfp)
static VALUE double_cmp_le(double a, double b)
#define RARRAY_LENINT(ary)
static VALUE rb_arg_error_new(int argc, int min, int max)
VALUE rb_equal_opt(VALUE obj1, VALUE obj2)
static VALUE vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
static VALUE double_cmp_gt(double a, double b)
#define NEW_THROW_OBJECT(val, pt, st)
static void vm_search_super_method(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
static VALUE vm_once_exec(rb_iseq_t *iseq)
static VALUE call_cfunc_7(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE double_cmp_ge(double a, double b)
int rb_const_defined_at(VALUE, ID)
#define VM_FRAME_MAGIC_LAMBDA
#define UNLIMITED_ARGUMENTS
static void vm_setinstancevariable(VALUE obj, ID id, VALUE val, IC ic)
static VALUE vm_get_cbase(const rb_iseq_t *iseq, const VALUE *ep)
VALUE rb_check_convert_type(VALUE, int, const char *, const char *)
static VALUE call_cfunc_m1(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
rb_method_definition_t * def
#define RBASIC_CLASS(obj)
static VALUE vm_call_method_missing(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci)
const rb_method_entry_t * me
static void vm_search_method(rb_call_info_t *ci, VALUE recv)
VALUE rb_check_array_type(VALUE ary)
void rb_error_arity(int argc, int min, int max)
static VALUE call_cfunc_14(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
#define STRING_REDEFINED_OP_FLAG
static int vm_callee_setup_arg_complex(rb_thread_t *th, rb_call_info_t *ci, const rb_iseq_t *iseq, VALUE *orig_argv)
static VALUE vm_get_cvar_base(NODE *cref, rb_control_frame_t *cfp)
int rb_method_basic_definition_p(VALUE, ID)
struct rb_thread_struct * running_thread
static VALUE call_cfunc_6(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
NODE * rb_vm_get_cref(const rb_iseq_t *iseq, const VALUE *ep)
static VALUE vm_call_iseq_setup(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
static VALUE call_cfunc_4(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
const rb_method_entry_t * passed_bmethod_me
VALUE rb_reg_match_pre(VALUE)
rb_call_info_t * passed_ci
#define EXEC_EVENT_HOOK(th_, flag_, self_, id_, klass_, data_)
static NODE * vm_get_cref0(const rb_iseq_t *iseq, const VALUE *ep)
NORETURN(static void argument_error(const rb_iseq_t *iseq, int miss_argc, int min_argc, int max_argc))
#define RMODULE_INCLUDED_INTO_REFINEMENT
const char * rb_id2name(ID id)
#define StringValuePtr(v)
void rb_warning(const char *fmt,...)
static void vm_callee_setup_arg(rb_thread_t *th, rb_call_info_t *ci, const rb_iseq_t *iseq, VALUE *argv, int is_lambda)
#define rb_check_frozen(obj)
#define GC_GUARDED_PTR_REF(p)
static void vm_super_outside(void)
static VALUE vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self, VALUE defined_class, int argc, const VALUE *argv, const rb_block_t *blockptr)
static rb_control_frame_t * vm_get_ruby_level_caller_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
static VALUE vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq, VALUE orig_klass, ID id, int is_defined)
VALUE(* call)(struct rb_thread_struct *th, struct rb_control_frame_struct *cfp, struct rb_call_info_struct *ci)
#define SPECIAL_CONST_P(x)
VALUE rb_public_const_get_from(VALUE klass, ID id)
#define CHECK_VM_STACK_OVERFLOW(cfp, margin)
#define BASIC_OP_UNREDEFINED_P(op, klass)
static VALUE vm_setivar(VALUE obj, ID id, VALUE val, IC ic, rb_call_info_t *ci, int is_attr)
int method_missing_reason
#define GET_THROWOBJ_STATE(obj)
static rb_thread_t * GET_THREAD(void)
void rb_warn(const char *fmt,...)
#define CHECK_VM_STACK_OVERFLOW0(cfp, sp, margin)
VALUE rb_autoload_load(VALUE, ID)
#define COPY_CREF_OMOD(c1, c2)
static VALUE vm_getivar(VALUE obj, ID id, IC ic, rb_call_info_t *ci, int is_attr)
static VALUE call_cfunc_8(VALUE(*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv)
static VALUE double_cmp_lt(double a, double b)
#define RB_OBJ_WRITE(a, slot, b)
VALUE rb_reg_nth_match(int, VALUE)
VALUE rb_attr_get(VALUE, ID)
static void vm_stackoverflow(void)
const rb_method_entry_t * me
static VALUE vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, VALUE self, int argc, const VALUE *argv, const rb_block_t *blockargptr)
VALUE rb_obj_class(VALUE)
#define NODE_FL_CREF_PUSHED_BY_EVAL