12#include "eval_intern.h" 
   14#include "internal/class.h" 
   15#include "internal/error.h" 
   16#include "internal/eval.h" 
   17#include "internal/gc.h" 
   18#include "internal/hash.h" 
   19#include "internal/object.h" 
   20#include "internal/proc.h" 
   21#include "internal/symbol.h" 
   25#include "ractor_core.h" 
   48static int method_arity(
VALUE);
 
   49static int method_min_max_arity(
VALUE, 
int *max);
 
   54#define IS_METHOD_PROC_IFUNC(ifunc) ((ifunc)->func == bmcall) 
   57block_mark_and_move(
struct rb_block *block)
 
   59    switch (block->type) {
 
   61      case block_type_ifunc:
 
   64            rb_gc_mark_and_move(&captured->self);
 
   65            rb_gc_mark_and_move(&captured->code.val);
 
   67                rb_gc_mark_and_move((
VALUE *)&captured->ep[VM_ENV_DATA_INDEX_ENV]);
 
   71      case block_type_symbol:
 
   72        rb_gc_mark_and_move(&block->as.symbol);
 
   75        rb_gc_mark_and_move(&block->as.proc);
 
   81proc_mark_and_move(
void *ptr)
 
   84    block_mark_and_move((
struct rb_block *)&proc->block);
 
   89    VALUE env[VM_ENV_DATA_SIZE + 1]; 
 
 
   93proc_memsize(
const void *ptr)
 
   96    if (proc->block.as.captured.ep == ((
const cfunc_proc_t *)ptr)->env+1)
 
  109    0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
 
  113rb_proc_alloc(
VALUE klass)
 
  127proc_clone(
VALUE self)
 
  129    VALUE procval = rb_proc_dup(self);
 
  130    return rb_obj_clone_setup(self, procval, 
Qnil);
 
  137    VALUE procval = rb_proc_dup(self);
 
  138    return rb_obj_dup_setup(self, procval);
 
  248    GetProcPtr(procval, proc);
 
  250    return RBOOL(proc->is_lambda);
 
 
  256binding_free(
void *ptr)
 
  258    RUBY_FREE_ENTER(
"binding");
 
  260    RUBY_FREE_LEAVE(
"binding");
 
  264binding_mark_and_move(
void *ptr)
 
  268    block_mark_and_move((
struct rb_block *)&bind->block);
 
  269    rb_gc_mark_and_move((
VALUE *)&bind->pathobj);
 
  273binding_memsize(
const void *ptr)
 
  281        binding_mark_and_move,
 
  284        binding_mark_and_move,
 
  286    0, 0, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY
 
  290rb_binding_alloc(
VALUE klass)
 
  296    rb_yjit_collect_binding_alloc();
 
  302binding_copy(
VALUE self)
 
  306    GetBindingPtr(self, src);
 
  307    GetBindingPtr(bindval, dst);
 
  308    rb_vm_block_copy(bindval, &dst->block, &src->block);
 
  310    dst->first_lineno = src->first_lineno;
 
  316binding_dup(
VALUE self)
 
  318    return rb_obj_dup_setup(self, binding_copy(self));
 
  323binding_clone(
VALUE self)
 
  325    return rb_obj_clone_setup(self, binding_copy(self), 
Qnil);
 
  332    return rb_vm_make_binding(ec, ec->cfp);
 
 
  380rb_f_binding(
VALUE self)
 
  402bind_eval(
int argc, 
VALUE *argv, 
VALUE bindval)
 
  406    rb_scan_args(argc, argv, 
"12", &args[0], &args[2], &args[3]);
 
  408    return rb_f_eval(argc+1, args, 
Qnil );
 
  412get_local_variable_ptr(
const rb_env_t **envp, 
ID lid)
 
  416        if (!VM_ENV_FLAGS(env->ep, VM_FRAME_FLAG_CFRAME)) {
 
  417            if (VM_ENV_FLAGS(env->ep, VM_ENV_FLAG_ISOLATED)) {
 
  423            VM_ASSERT(rb_obj_is_iseq((
VALUE)iseq));
 
  425            const unsigned int local_table_size = ISEQ_BODY(iseq)->local_table_size;
 
  426            for (
unsigned int i=0; i<local_table_size; i++) {
 
  427                if (ISEQ_BODY(iseq)->local_table[i] == lid) {
 
  428                    if (ISEQ_BODY(iseq)->local_iseq == iseq &&
 
  429                            ISEQ_BODY(iseq)->param.flags.has_block &&
 
  430                            (
unsigned int)ISEQ_BODY(iseq)->param.block_start == i) {
 
  431                        const VALUE *ep = env->ep;
 
  432                        if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) {
 
  433                            RB_OBJ_WRITE(env, &env->env[i], rb_vm_bh_to_procval(GET_EC(), VM_ENV_BLOCK_HANDLER(ep)));
 
  434                            VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
 
  439                    unsigned int last_lvar = env->env_size+VM_ENV_INDEX_LAST_LVAR
 
  441                    return &env->env[last_lvar - (local_table_size - i)];
 
  449    } 
while ((env = rb_vm_env_prev_env(env)) != NULL);
 
  461check_local_id(
VALUE bindval, 
volatile VALUE *pname)
 
  468            rb_name_err_raise(
"wrong local variable name '%1$s' for %2$s",
 
  473        if (!rb_is_local_name(name)) {
 
  474            rb_name_err_raise(
"wrong local variable name '%1$s' for %2$s",
 
  501bind_local_variables(
VALUE bindval)
 
  506    GetBindingPtr(bindval, bind);
 
  507    env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));
 
  508    return rb_vm_env_local_variables(env);
 
  512rb_numparam_id_p(
ID id)
 
  514    return (tNUMPARAM_1 << ID_SCOPE_SHIFT) <= 
id && 
id < ((tNUMPARAM_1 + 9) << ID_SCOPE_SHIFT);
 
  535bind_local_variable_get(
VALUE bindval, 
VALUE sym)
 
  537    ID lid = check_local_id(bindval, &sym);
 
  542    if (!lid) 
goto undefined;
 
  543    if (rb_numparam_id_p(lid)) {
 
  544        rb_name_err_raise(
"numbered parameter '%1$s' is not a local variable",
 
  548    GetBindingPtr(bindval, bind);
 
  550    env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));
 
  551    if ((ptr = get_local_variable_ptr(&env, lid)) != NULL) {
 
  557    rb_name_err_raise(
"local variable '%1$s' is not defined for %2$s",
 
  590    ID lid = check_local_id(bindval, &sym);
 
  595    if (!lid) lid = rb_intern_str(sym);
 
  596    if (rb_numparam_id_p(lid)) {
 
  597        rb_name_err_raise(
"numbered parameter '%1$s' is not a local variable",
 
  601    GetBindingPtr(bindval, bind);
 
  602    env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));
 
  603    if ((ptr = get_local_variable_ptr(&env, lid)) == NULL) {
 
  605        ptr = rb_binding_add_dynavars(bindval, bind, 1, &lid);
 
  606        env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));
 
  610    rb_yjit_collect_binding_set();
 
  636bind_local_variable_defined_p(
VALUE bindval, 
VALUE sym)
 
  638    ID lid = check_local_id(bindval, &sym);
 
  644    GetBindingPtr(bindval, bind);
 
  645    env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));
 
  646    return RBOOL(get_local_variable_ptr(&env, lid));
 
  656bind_receiver(
VALUE bindval)
 
  659    GetBindingPtr(bindval, bind);
 
  660    return vm_block_self(&bind->block);
 
  670bind_location(
VALUE bindval)
 
  674    GetBindingPtr(bindval, bind);
 
  675    loc[0] = pathobj_path(bind->pathobj);
 
  676    loc[1] = 
INT2FIX(bind->first_lineno);
 
  689    proc = &sproc->basic;
 
  690    vm_block_type_set(&proc->block, block_type_ifunc);
 
  692    *(
VALUE **)&proc->block.as.captured.ep = ep = sproc->env + VM_ENV_DATA_SIZE-1;
 
  693    ep[VM_ENV_DATA_INDEX_FLAGS]   = VM_FRAME_MAGIC_IFUNC | VM_FRAME_FLAG_CFRAME | VM_ENV_FLAG_LOCAL | VM_ENV_FLAG_ESCAPED;
 
  694    ep[VM_ENV_DATA_INDEX_ME_CREF] = 
Qfalse;
 
  695    ep[VM_ENV_DATA_INDEX_SPECVAL] = VM_BLOCK_HANDLER_NONE;
 
  696    ep[VM_ENV_DATA_INDEX_ENV]     = 
Qundef; 
 
  699    RB_OBJ_WRITE(procval, &proc->block.as.captured.code.ifunc, ifunc);
 
  700    proc->is_lambda = TRUE;
 
  705rb_func_proc_dup(
VALUE src_obj)
 
  707    RUBY_ASSERT(rb_typeddata_is_instance_of(src_obj, &proc_data_type));
 
  710    GetProcPtr(src_obj, src_proc);
 
  711    RUBY_ASSERT(vm_block_type(&src_proc->block) == block_type_ifunc);
 
  716    memcpy(&proc->basic, src_proc, 
sizeof(
rb_proc_t));
 
  720    const VALUE *src_ep = src_proc->block.as.captured.ep;
 
  721    VALUE *ep = *(
VALUE **)&proc->basic.block.as.captured.ep = proc->env + VM_ENV_DATA_SIZE - 1;
 
  722    ep[VM_ENV_DATA_INDEX_FLAGS]   = src_ep[VM_ENV_DATA_INDEX_FLAGS];
 
  723    ep[VM_ENV_DATA_INDEX_ME_CREF] = src_ep[VM_ENV_DATA_INDEX_ME_CREF];
 
  724    ep[VM_ENV_DATA_INDEX_SPECVAL] = src_ep[VM_ENV_DATA_INDEX_SPECVAL];
 
  725    RB_OBJ_WRITE(proc_obj, &ep[VM_ENV_DATA_INDEX_ENV], src_ep[VM_ENV_DATA_INDEX_ENV]);
 
  733    VALUE procval = rb_proc_alloc(klass);
 
  735    GetProcPtr(procval, proc);
 
  737    vm_block_type_set(&proc->block, block_type_symbol);
 
  739    proc->is_lambda = TRUE;
 
  749        min_argc >= (
int)(1U << (
SIZEOF_VALUE * CHAR_BIT) / 2) ||
 
  752        rb_raise(
rb_eRangeError, 
"minimum argument number out of range: %d",
 
  757        max_argc >= (
int)(1U << (
SIZEOF_VALUE * CHAR_BIT) / 2) ||
 
  760        rb_raise(
rb_eRangeError, 
"maximum argument number out of range: %d",
 
  765    struct vm_ifunc *ifunc = IMEMO_NEW(
struct vm_ifunc, imemo_ifunc, (
VALUE)rb_vm_svar_lep(ec, ec->cfp));
 
  768    ifunc->argc.min = min_argc;
 
  769    ifunc->argc.max = max_argc;
 
  777    struct vm_ifunc *ifunc = rb_vm_ifunc_new(func, (
void *)val, min_argc, max_argc);
 
  781static const char proc_without_block[] = 
"tried to create Proc object without a block";
 
  784proc_new(
VALUE klass, int8_t is_lambda)
 
  791    if ((block_handler = rb_vm_frame_block_handler(cfp)) == VM_BLOCK_HANDLER_NONE) {
 
  792        rb_raise(rb_eArgError, proc_without_block);
 
  796    switch (vm_block_handler_type(block_handler)) {
 
  797      case block_handler_type_proc:
 
  798        procval = VM_BH_TO_PROC(block_handler);
 
  804            VALUE newprocval = rb_proc_dup(procval);
 
  805            RBASIC_SET_CLASS(newprocval, klass);
 
  810      case block_handler_type_symbol:
 
  812          sym_proc_new(klass, VM_BH_TO_SYMBOL(block_handler)) :
 
  813          rb_sym_to_proc(VM_BH_TO_SYMBOL(block_handler));
 
  816      case block_handler_type_ifunc:
 
  817      case block_handler_type_iseq:
 
  818        return rb_vm_make_proc_lambda(ec, VM_BH_TO_CAPT_BLOCK(block_handler), klass, is_lambda);
 
  820    VM_UNREACHABLE(proc_new);
 
  839rb_proc_s_new(
int argc, 
VALUE *argv, 
VALUE klass)
 
  841    VALUE block = proc_new(klass, FALSE);
 
  873f_lambda_filter_non_literal(
void)
 
  876    VALUE block_handler = rb_vm_frame_block_handler(cfp);
 
  878    if (block_handler == VM_BLOCK_HANDLER_NONE) {
 
  883    switch (vm_block_handler_type(block_handler)) {
 
  884      case block_handler_type_iseq:
 
  885        if (RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)->ep == VM_BH_TO_ISEQ_BLOCK(block_handler)->ep) {
 
  889      case block_handler_type_symbol:
 
  891      case block_handler_type_proc:
 
  896      case block_handler_type_ifunc:
 
  900    rb_raise(rb_eArgError, 
"the lambda method requires a literal block");
 
  914    f_lambda_filter_non_literal();
 
  970proc_call(
int argc, 
VALUE *argv, 
VALUE procval)
 
  976#if SIZEOF_LONG > SIZEOF_INT 
  980    if (argc > INT_MAX || argc < 0) {
 
  981        rb_raise(rb_eArgError, 
"too many arguments (%lu)",
 
  982                 (
unsigned long)argc);
 
  987#define check_argc(argc) (argc) 
  997    GetProcPtr(self, proc);
 
  998    vret = rb_vm_invoke_proc(GET_EC(), proc, argc, argv,
 
  999                             kw_splat, VM_BLOCK_HANDLER_NONE);
 
 
 1012proc_to_block_handler(
VALUE procval)
 
 1014    return NIL_P(procval) ? VM_BLOCK_HANDLER_NONE : procval;
 
 1023    GetProcPtr(self, proc);
 
 1024    vret = rb_vm_invoke_proc(ec, proc, argc, argv, kw_splat, proc_to_block_handler(passed_procval));
 
 
 1078proc_arity(
VALUE self)
 
 1085rb_iseq_min_max_arity(
const rb_iseq_t *iseq, 
int *max)
 
 1087    *max = ISEQ_BODY(iseq)->param.flags.has_rest == FALSE ?
 
 1088      ISEQ_BODY(iseq)->param.lead_num + ISEQ_BODY(iseq)->param.opt_num + ISEQ_BODY(iseq)->param.post_num +
 
 1089      (ISEQ_BODY(iseq)->param.flags.has_kw == TRUE || ISEQ_BODY(iseq)->param.flags.has_kwrest == TRUE || ISEQ_BODY(iseq)->param.flags.forwardable == TRUE)
 
 1091    return ISEQ_BODY(iseq)->param.lead_num + ISEQ_BODY(iseq)->param.post_num + (ISEQ_BODY(iseq)->param.flags.has_kw && ISEQ_BODY(iseq)->param.keyword->required_num > 0);
 
 1095rb_vm_block_min_max_arity(
const struct rb_block *block, 
int *max)
 
 1098    switch (vm_block_type(block)) {
 
 1099      case block_type_iseq:
 
 1100        return rb_iseq_min_max_arity(rb_iseq_check(block->as.captured.code.iseq), max);
 
 1101      case block_type_proc:
 
 1102        block = vm_proc_block(block->as.proc);
 
 1104      case block_type_ifunc:
 
 1106            const struct vm_ifunc *ifunc = block->as.captured.code.ifunc;
 
 1107            if (IS_METHOD_PROC_IFUNC(ifunc)) {
 
 1109                return method_min_max_arity((
VALUE)ifunc->data, max);
 
 1111            *max = ifunc->argc.max;
 
 1112            return ifunc->argc.min;
 
 1114      case block_type_symbol:
 
 1129rb_proc_min_max_arity(
VALUE self, 
int *max)
 
 1132    GetProcPtr(self, proc);
 
 1133    return rb_vm_block_min_max_arity(&proc->block, max);
 
 1141    GetProcPtr(self, proc);
 
 1142    min = rb_vm_block_min_max_arity(&proc->block, &max);
 
 
 1149    switch (vm_block_handler_type(block_handler)) {
 
 1150      case block_handler_type_iseq:
 
 1151        block->type = block_type_iseq;
 
 1152        block->as.captured = *VM_BH_TO_ISEQ_BLOCK(block_handler);
 
 1154      case block_handler_type_ifunc:
 
 1155        block->type = block_type_ifunc;
 
 1156        block->as.captured = *VM_BH_TO_IFUNC_BLOCK(block_handler);
 
 1158      case block_handler_type_symbol:
 
 1159        block->type = block_type_symbol;
 
 1160        block->as.symbol = VM_BH_TO_SYMBOL(block_handler);
 
 1162      case block_handler_type_proc:
 
 1163        block->type = block_type_proc;
 
 1164        block->as.proc = VM_BH_TO_PROC(block_handler);
 
 1169rb_block_pair_yield_optimizable(
void)
 
 1174    VALUE block_handler = rb_vm_frame_block_handler(cfp);
 
 1177    if (block_handler == VM_BLOCK_HANDLER_NONE) {
 
 1178        rb_raise(rb_eArgError, 
"no block given");
 
 1181    block_setup(&block, block_handler);
 
 1182    min = rb_vm_block_min_max_arity(&block, &max);
 
 1184    switch (vm_block_type(&block)) {
 
 1185      case block_type_symbol:
 
 1188      case block_type_proc:
 
 1190            VALUE procval = block_handler;
 
 1192            GetProcPtr(procval, proc);
 
 1193            if (proc->is_lambda) 
return 0;
 
 1194            if (min != max) 
return 0;
 
 1198      case block_type_ifunc:
 
 1200            const struct vm_ifunc *ifunc = block.as.captured.code.ifunc;
 
 1201            if (ifunc->flags & IFUNC_YIELD_OPTIMIZABLE) 
return 1;
 
 1215    VALUE block_handler = rb_vm_frame_block_handler(cfp);
 
 1218    if (block_handler == VM_BLOCK_HANDLER_NONE) {
 
 1219        rb_raise(rb_eArgError, 
"no block given");
 
 1222    block_setup(&block, block_handler);
 
 1224    switch (vm_block_type(&block)) {
 
 1225      case block_type_symbol:
 
 1228      case block_type_proc:
 
 1232        min = rb_vm_block_min_max_arity(&block, &max);
 
 1238rb_block_min_max_arity(
int *max)
 
 1242    VALUE block_handler = rb_vm_frame_block_handler(cfp);
 
 1245    if (block_handler == VM_BLOCK_HANDLER_NONE) {
 
 1246        rb_raise(rb_eArgError, 
"no block given");
 
 1249    block_setup(&block, block_handler);
 
 1250    return rb_vm_block_min_max_arity(&block, max);
 
 1254rb_proc_get_iseq(
VALUE self, 
int *is_proc)
 
 1259    GetProcPtr(self, proc);
 
 1260    block = &proc->block;
 
 1261    if (is_proc) *is_proc = !proc->is_lambda;
 
 1263    switch (vm_block_type(block)) {
 
 1264      case block_type_iseq:
 
 1265        return rb_iseq_check(block->as.captured.code.iseq);
 
 1266      case block_type_proc:
 
 1267        return rb_proc_get_iseq(block->as.proc, is_proc);
 
 1268      case block_type_ifunc:
 
 1270            const struct vm_ifunc *ifunc = block->as.captured.code.ifunc;
 
 1271            if (IS_METHOD_PROC_IFUNC(ifunc)) {
 
 1273                if (is_proc) *is_proc = 0;
 
 1274                return rb_method_iseq((
VALUE)ifunc->data);
 
 1280      case block_type_symbol:
 
 1284    VM_UNREACHABLE(rb_proc_get_iseq);
 
 1317    const rb_proc_t *self_proc, *other_proc;
 
 1318    const struct rb_block *self_block, *other_block;
 
 1324    GetProcPtr(self, self_proc);
 
 1325    GetProcPtr(other, other_proc);
 
 1327    if (self_proc->is_from_method != other_proc->is_from_method ||
 
 1328            self_proc->is_lambda != other_proc->is_lambda) {
 
 1332    self_block = &self_proc->block;
 
 1333    other_block = &other_proc->block;
 
 1335    if (vm_block_type(self_block) != vm_block_type(other_block)) {
 
 1339    switch (vm_block_type(self_block)) {
 
 1340      case block_type_iseq:
 
 1341        if (self_block->as.captured.ep != \
 
 1342                other_block->as.captured.ep ||
 
 1343                self_block->as.captured.code.iseq != \
 
 1344                other_block->as.captured.code.iseq) {
 
 1348      case block_type_ifunc:
 
 1349        if (self_block->as.captured.code.ifunc != \
 
 1350                other_block->as.captured.code.ifunc) {
 
 1361      case block_type_proc:
 
 1362        if (self_block->as.proc != other_block->as.proc) {
 
 1366      case block_type_symbol:
 
 1367        if (self_block->as.symbol != other_block->as.symbol) {
 
 1382    if (!iseq) 
return Qnil;
 
 1383    rb_iseq_check(iseq);
 
 1384    loc[i++] = rb_iseq_path(iseq);
 
 1398    return iseq_location(iseq);
 
 1417rb_proc_location(
VALUE self)
 
 1419    return iseq_location(rb_proc_get_iseq(self, 0));
 
 1423rb_unnamed_parameters(
int arity)
 
 1426    int n = (arity < 0) ? ~arity : arity;
 
 1460rb_proc_parameters(
int argc, 
VALUE *argv, 
VALUE self)
 
 1462    static ID keyword_ids[1];
 
 1468    iseq = rb_proc_get_iseq(self, &is_proc);
 
 1470    if (!keyword_ids[0]) {
 
 1471        CONST_ID(keyword_ids[0], 
"lambda");
 
 1478        if (!
NIL_P(lambda)) {
 
 1479            is_proc = !
RTEST(lambda);
 
 1486    return rb_iseq_parameters(iseq, is_proc);
 
 1490rb_hash_proc(st_index_t hash, 
VALUE prc)
 
 1493    GetProcPtr(prc, proc);
 
 1495    switch (vm_block_type(&proc->block)) {
 
 1496      case block_type_iseq:
 
 1497        hash = rb_st_hash_uint(hash, (st_index_t)proc->block.as.captured.code.iseq->body);
 
 1499      case block_type_ifunc:
 
 1500        hash = rb_st_hash_uint(hash, (st_index_t)proc->block.as.captured.code.ifunc->func);
 
 1501        hash = rb_st_hash_uint(hash, (st_index_t)proc->block.as.captured.code.ifunc->data);
 
 1503      case block_type_symbol:
 
 1504        hash = rb_st_hash_uint(hash, rb_any_hash(proc->block.as.symbol));
 
 1506      case block_type_proc:
 
 1507        hash = rb_st_hash_uint(hash, rb_any_hash(proc->block.as.proc));
 
 1510        rb_bug(
"rb_hash_proc: unknown block type %d", vm_block_type(&proc->block));
 
 1516    if (vm_block_type(&proc->block) != block_type_ifunc) {
 
 1517        hash = 
rb_hash_uint(hash, (st_index_t)proc->block.as.captured.ep);
 
 1540rb_sym_to_proc(
VALUE sym)
 
 1542    enum {SYM_PROC_CACHE_SIZE = 67};
 
 1544    if (rb_ractor_main_p()) {
 
 1545        if (!sym_proc_cache) {
 
 1551        long index = (
id % SYM_PROC_CACHE_SIZE);
 
 1553        if (
RTEST(procval)) {
 
 1555            GetProcPtr(procval, proc);
 
 1557            if (proc->block.as.symbol == sym) {
 
 1562        procval = sym_proc_new(
rb_cProc, sym);
 
 1568        return sym_proc_new(
rb_cProc, sym);
 
 1582proc_hash(
VALUE self)
 
 1586    hash = rb_hash_proc(hash, self);
 
 1592rb_block_to_s(
VALUE self, 
const struct rb_block *block, 
const char *additional_info)
 
 1595    VALUE str = rb_sprintf(
"#<%"PRIsVALUE
":", cname);
 
 1598    switch (vm_block_type(block)) {
 
 1599      case block_type_proc:
 
 1600        block = vm_proc_block(block->as.proc);
 
 1602      case block_type_iseq:
 
 1604            const rb_iseq_t *iseq = rb_iseq_check(block->as.captured.code.iseq);
 
 1605            rb_str_catf(str, 
"%p %"PRIsVALUE
":%d", (
void *)self,
 
 1607                        ISEQ_BODY(iseq)->location.first_lineno);
 
 1610      case block_type_symbol:
 
 1611        rb_str_catf(str, 
"%p(&%+"PRIsVALUE
")", (
void *)self, block->as.symbol);
 
 1613      case block_type_ifunc:
 
 1614        rb_str_catf(str, 
"%p", (
void *)block->as.captured.code.ifunc);
 
 1632proc_to_s(
VALUE self)
 
 1635    GetProcPtr(self, proc);
 
 1636    return rb_block_to_s(self, &proc->block, proc->is_lambda ? 
" (lambda)" : NULL);
 
 1648proc_to_proc(
VALUE self)
 
 1654bm_mark_and_move(
void *ptr)
 
 1656    struct METHOD *data = ptr;
 
 1657    rb_gc_mark_and_move((
VALUE *)&data->recv);
 
 1658    rb_gc_mark_and_move((
VALUE *)&data->klass);
 
 1659    rb_gc_mark_and_move((
VALUE *)&data->iclass);
 
 1660    rb_gc_mark_and_move((
VALUE *)&data->owner);
 
 1672    0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
 
 1685    ID rmiss = idRespond_to_missing;
 
 1687    if (UNDEF_P(obj)) 
return 0;
 
 1688    if (rb_method_basic_definition_p(klass, rmiss)) 
return 0;
 
 1706    def->type = VM_METHOD_TYPE_MISSING;
 
 1707    def->original_id = id;
 
 1709    me = rb_method_entry_create(
id, klass, METHOD_VISI_UNDEF, def);
 
 1721    if (!respond_to_missing_p(klass, obj, vid, scope)) 
return Qfalse;
 
 1722    return mnew_missing(klass, obj, 
SYM2ID(vid), mclass);
 
 1732    rb_method_visibility_t visi = METHOD_VISI_UNDEF;
 
 1735    if (UNDEFINED_METHOD_ENTRY_P(me)) {
 
 1736        if (respond_to_missing_p(klass, obj, 
ID2SYM(
id), scope)) {
 
 1737            return mnew_missing(klass, obj, 
id, mclass);
 
 1739        if (!error) 
return Qnil;
 
 1740        rb_print_undef(klass, 
id, METHOD_VISI_UNDEF);
 
 1742    if (visi == METHOD_VISI_UNDEF) {
 
 1743        visi = METHOD_ENTRY_VISI(me);
 
 1745        if (scope && (visi != METHOD_VISI_PUBLIC)) {
 
 1746            if (!error) 
return Qnil;
 
 1747            rb_print_inaccessible(klass, 
id, visi);
 
 1750    if (me->def->type == VM_METHOD_TYPE_ZSUPER) {
 
 1751        if (me->defined_class) {
 
 1753            id = me->def->original_id;
 
 1754            me = (
rb_method_entry_t *)rb_callable_method_entry_with_refinements(klass, 
id, &iclass);
 
 1758            id = me->def->original_id;
 
 1759            me = rb_method_entry_without_refinements(klass, 
id, &iclass);
 
 1775    RB_OBJ_WRITE(method, &data->owner, original_me->owner);
 
 1785    return mnew_internal(me, klass, iclass, obj, 
id, mclass, scope, TRUE);
 
 1795    me = (
rb_method_entry_t *)rb_callable_method_entry_with_refinements(klass, 
id, &iclass);
 
 1796    return mnew_from_me(me, klass, iclass, obj, 
id, mclass, scope);
 
 1800mnew_unbound(
VALUE klass, 
ID id, 
VALUE mclass, 
int scope)
 
 1805    me = rb_method_entry_with_refinements(klass, 
id, &iclass);
 
 1806    return mnew_from_me(me, klass, iclass, 
Qundef, 
id, mclass, scope);
 
 1812    VALUE defined_class = me->defined_class;
 
 1813    return defined_class ? defined_class : me->owner;
 
 1858    VALUE klass1, klass2;
 
 1866    m1 = (
struct METHOD *)RTYPEDDATA_GET_DATA(method);
 
 1867    m2 = (
struct METHOD *)RTYPEDDATA_GET_DATA(other);
 
 1869    klass1 = method_entry_defined_class(m1->me);
 
 1870    klass2 = method_entry_defined_class(m2->me);
 
 1872    if (!rb_method_entry_eq(m1->me, m2->me) ||
 
 1874        m1->klass != m2->klass ||
 
 1875        m1->recv != m2->recv) {
 
 1896#define unbound_method_eq method_eq 
 1908method_hash(
VALUE method)
 
 1915    hash = rb_hash_method_entry(hash, m->me);
 
 1931method_unbind(
VALUE obj)
 
 1934    struct METHOD *orig, *data;
 
 1938                                   &method_data_type, data);
 
 1943    RB_OBJ_WRITE(method, &data->me, rb_method_entry_clone(orig->me));
 
 1958method_receiver(
VALUE obj)
 
 1974method_name(
VALUE obj)
 
 1979    return ID2SYM(data->me->called_id);
 
 1996method_original_name(
VALUE obj)
 
 2001    return ID2SYM(data->me->def->original_id);
 
 2023method_owner(
VALUE obj)
 
 2037method_namespace(
VALUE obj)
 
 2043    ns = data->me->def->ns;
 
 2045    if (ns->ns_object) 
return ns->ns_object;
 
 2047    rb_bug(
"Unexpected namespace on the method definition: %p", (
void*) ns);
 
 2054#define MSG(s) rb_fstring_lit("undefined method '%1$s' for"s" '%2$s'") 
 2058    if (RCLASS_SINGLETON_P(c)) {
 
 2059        VALUE obj = RCLASS_ATTACHED_OBJECT(klass);
 
 2076    rb_name_err_raise_str(s, c, str);
 
 2088        VALUE m = mnew_missing_by_name(klass, obj, &vid, scope, mclass);
 
 2090        rb_method_name_error(klass, vid);
 
 2092    return mnew_callable(klass, obj, 
id, mclass, scope);
 
 2137    return obj_method(obj, vid, FALSE);
 
 
 2150    return obj_method(obj, vid, TRUE);
 
 2154rb_obj_singleton_method_lookup(
VALUE arg)
 
 2161rb_obj_singleton_method_lookup_fail(
VALUE arg1, 
VALUE arg2)
 
 2198        NIL_P(klass = RCLASS_ORIGIN(sc)) ||
 
 2199        !
NIL_P(rb_special_singleton_class(obj))) {
 
 2208        VALUE args[2] = {obj, vid};
 
 2209        VALUE ruby_method = 
rb_rescue(rb_obj_singleton_method_lookup, (
VALUE)args, rb_obj_singleton_method_lookup_fail, 
Qfalse);
 
 2211            struct METHOD *method = (
struct METHOD *)RTYPEDDATA_GET_DATA(ruby_method);
 
 2214            VALUE method_class = method->iclass;
 
 2218                if (lookup_class == method_class) {
 
 2222            } 
while (lookup_class && lookup_class != stop_class);
 
 2228    rb_name_err_raise(
"undefined singleton method '%1$s' for '%2$s'",
 
 2269        rb_method_name_error(mod, vid);
 
 2282rb_mod_public_instance_method(
VALUE mod, 
VALUE vid)
 
 2286        rb_method_name_error(mod, vid);
 
 2297    int is_method = FALSE;
 
 2316                     "wrong argument type %s (expected Proc/Method/UnboundMethod)",
 
 2323        struct METHOD *method = (
struct METHOD *)RTYPEDDATA_GET_DATA(body);
 
 2326            if (RCLASS_SINGLETON_P(method->me->owner)) {
 
 2328                         "can't bind singleton method to a different class");
 
 2332                         "bind argument must be a subclass of % "PRIsVALUE,
 
 2336        rb_method_entry_set(mod, 
id, method->me, scope_visi->method_visi);
 
 2337        if (scope_visi->module_func) {
 
 2343        VALUE procval = rb_proc_dup(body);
 
 2344        if (vm_proc_iseq(procval) != NULL) {
 
 2346            GetProcPtr(procval, proc);
 
 2347            proc->is_lambda = TRUE;
 
 2348            proc->is_from_method = TRUE;
 
 2350        rb_add_method(mod, 
id, VM_METHOD_TYPE_BMETHOD, (
void *)procval, scope_visi->method_visi);
 
 2351        if (scope_visi->module_func) {
 
 2352            rb_add_method(
rb_singleton_class(mod), 
id, VM_METHOD_TYPE_BMETHOD, (
void *)body, METHOD_VISI_PUBLIC);
 
 2400rb_mod_define_method(
int argc, 
VALUE *argv, 
VALUE mod)
 
 2402    const rb_cref_t *cref = rb_vm_cref_in_context(mod, mod);
 
 2407        scope_visi = CREF_SCOPE_VISI(cref);
 
 2410    return rb_mod_define_method_with_visibility(argc, argv, mod, scope_visi);
 
 2445rb_obj_define_method(
int argc, 
VALUE *argv, 
VALUE obj)
 
 2450    return rb_mod_define_method_with_visibility(argc, argv, klass, &scope_visi);
 
 2461top_define_method(
int argc, 
VALUE *argv, 
VALUE obj)
 
 2463    return rb_mod_define_method(argc, argv, rb_top_main_class(
"define_method"));
 
 2484method_clone(
VALUE self)
 
 2487    struct METHOD *orig, *data;
 
 2491    rb_obj_clone_setup(self, clone, 
Qnil);
 
 2496    RB_OBJ_WRITE(clone, &data->me, rb_method_entry_clone(orig->me));
 
 2502method_dup(
VALUE self)
 
 2505    struct METHOD *orig, *data;
 
 2509    rb_obj_dup_setup(self, clone);
 
 2514    RB_OBJ_WRITE(clone, &data->me, rb_method_entry_clone(orig->me));
 
 2562rb_method_call_pass_called_kw(
int argc, 
const VALUE *argv, 
VALUE method)
 
 2582method_callable_method_entry(
const struct METHOD *data)
 
 2584    if (data->me->defined_class == 0) rb_bug(
"method_callable_method_entry: not callable.");
 
 2590                 int argc, 
const VALUE *argv, 
VALUE passed_procval, 
int kw_splat)
 
 2592    vm_passed_block_handler_set(ec, proc_to_block_handler(passed_procval));
 
 2593    return rb_vm_call_kw(ec, data->recv, data->me->called_id, argc, argv,
 
 2594                         method_callable_method_entry(data), kw_splat);
 
 2600    const struct METHOD *data;
 
 2604    if (UNDEF_P(data->recv)) {
 
 2605        rb_raise(
rb_eTypeError, 
"can't call unbound method; bind first");
 
 2607    return call_method_data(ec, data, argc, argv, passed_procval, kw_splat);
 
 
 2674    VALUE methclass = data->owner;
 
 2675    VALUE iclass = data->me->defined_class;
 
 2679        VALUE refined_class = rb_refinement_module_get_refined_class(methclass);
 
 2680        if (!
NIL_P(refined_class)) methclass = refined_class;
 
 2683        if (RCLASS_SINGLETON_P(methclass)) {
 
 2685                     "singleton method called for a different object");
 
 2688            rb_raise(
rb_eTypeError, 
"bind argument must be an instance of % "PRIsVALUE,
 
 2695        me = rb_method_entry_clone(data->me);
 
 2705            me = rb_method_entry_clone(me);
 
 2707        VALUE ic = rb_class_search_ancestor(klass, me->owner);
 
 2713            klass = rb_include_class_new(methclass, klass);
 
 2715        me = (
const rb_method_entry_t *) rb_method_entry_complement_defined_class(me, me->called_id, klass);
 
 2718    *methclass_out = methclass;
 
 2720    *iclass_out = iclass;
 
 2762    VALUE methclass, klass, iclass;
 
 2764    const struct METHOD *data;
 
 2766    convert_umethod_to_method_components(data, recv, &methclass, &klass, &iclass, &me, 
true);
 
 2788umethod_bind_call(
int argc, 
VALUE *argv, 
VALUE method)
 
 2791    VALUE recv = argv[0];
 
 2798    const struct METHOD *data;
 
 2803        vm_passed_block_handler_set(ec, proc_to_block_handler(passed_procval));
 
 2807        VALUE methclass, klass, iclass;
 
 2809        convert_umethod_to_method_components(data, recv, &methclass, &klass, &iclass, &me, 
false);
 
 2810        struct METHOD bound = { recv, klass, 0, methclass, me };
 
 2825    if (!def) 
return *max = 0;
 
 2826    switch (def->type) {
 
 2827      case VM_METHOD_TYPE_CFUNC:
 
 2828        if (def->body.cfunc.argc < 0) {
 
 2832        return *max = check_argc(def->body.cfunc.argc);
 
 2833      case VM_METHOD_TYPE_ZSUPER:
 
 2836      case VM_METHOD_TYPE_ATTRSET:
 
 2838      case VM_METHOD_TYPE_IVAR:
 
 2840      case VM_METHOD_TYPE_ALIAS:
 
 2841        def = def->body.alias.original_me->def;
 
 2843      case VM_METHOD_TYPE_BMETHOD:
 
 2844        return rb_proc_min_max_arity(def->body.bmethod.proc, max);
 
 2845      case VM_METHOD_TYPE_ISEQ:
 
 2846        return rb_iseq_min_max_arity(rb_iseq_check(def->body.iseq.
iseqptr), max);
 
 2847      case VM_METHOD_TYPE_UNDEF:
 
 2848      case VM_METHOD_TYPE_NOTIMPLEMENTED:
 
 2850      case VM_METHOD_TYPE_MISSING:
 
 2853      case VM_METHOD_TYPE_OPTIMIZED: {
 
 2854        switch (def->body.optimized.type) {
 
 2855          case OPTIMIZED_METHOD_TYPE_SEND:
 
 2858          case OPTIMIZED_METHOD_TYPE_CALL:
 
 2861          case OPTIMIZED_METHOD_TYPE_BLOCK_CALL:
 
 2864          case OPTIMIZED_METHOD_TYPE_STRUCT_AREF:
 
 2867          case OPTIMIZED_METHOD_TYPE_STRUCT_ASET:
 
 2875      case VM_METHOD_TYPE_REFINED:
 
 2879    rb_bug(
"method_def_min_max_arity: invalid method entry type (%d)", def->type);
 
 2886    int max, min = method_def_min_max_arity(def, &max);
 
 2887    return min == max ? min : -min-1;
 
 2893    return method_def_arity(me->def);
 
 2940method_arity_m(
VALUE method)
 
 2942    int n = method_arity(method);
 
 2947method_arity(
VALUE method)
 
 2952    return rb_method_entry_arity(data->me);
 
 2956original_method_entry(
VALUE mod, 
ID id)
 
 2960    while ((me = rb_method_entry(mod, 
id)) != 0) {
 
 2962        if (def->type != VM_METHOD_TYPE_ZSUPER) 
break;
 
 2964        id = def->original_id;
 
 2970method_min_max_arity(
VALUE method, 
int *max)
 
 2972    const struct METHOD *data;
 
 2975    return method_def_min_max_arity(data->me->def, max);
 
 2983    return rb_method_entry_arity(me);
 
 
 2993rb_callable_receiver(
VALUE callable)
 
 2996        VALUE binding = proc_binding(callable);
 
 2997        return rb_funcall(binding, rb_intern(
"receiver"), 0);
 
 3000        return method_receiver(callable);
 
 3008rb_method_def(
VALUE method)
 
 3010    const struct METHOD *data;
 
 3013    return data->me->def;
 
 3019    switch (def->type) {
 
 3020      case VM_METHOD_TYPE_ISEQ:
 
 3021        return rb_iseq_check(def->body.iseq.
iseqptr);
 
 3022      case VM_METHOD_TYPE_BMETHOD:
 
 3023        return rb_proc_get_iseq(def->body.bmethod.proc, 0);
 
 3024      case VM_METHOD_TYPE_ALIAS:
 
 3025        return method_def_iseq(def->body.alias.original_me->def);
 
 3026      case VM_METHOD_TYPE_CFUNC:
 
 3027      case VM_METHOD_TYPE_ATTRSET:
 
 3028      case VM_METHOD_TYPE_IVAR:
 
 3029      case VM_METHOD_TYPE_ZSUPER:
 
 3030      case VM_METHOD_TYPE_UNDEF:
 
 3031      case VM_METHOD_TYPE_NOTIMPLEMENTED:
 
 3032      case VM_METHOD_TYPE_OPTIMIZED:
 
 3033      case VM_METHOD_TYPE_MISSING:
 
 3034      case VM_METHOD_TYPE_REFINED:
 
 3041rb_method_iseq(
VALUE method)
 
 3043    return method_def_iseq(rb_method_def(method));
 
 3047method_cref(
VALUE method)
 
 3052    switch (def->type) {
 
 3053      case VM_METHOD_TYPE_ISEQ:
 
 3054        return def->body.iseq.
cref;
 
 3055      case VM_METHOD_TYPE_ALIAS:
 
 3056        def = def->body.alias.original_me->def;
 
 3066    if (def->type == VM_METHOD_TYPE_ATTRSET || def->type == VM_METHOD_TYPE_IVAR) {
 
 3067        if (!def->body.attr.location)
 
 3071    return iseq_location(method_def_iseq(def));
 
 3077    if (!me) 
return Qnil;
 
 3078    return method_def_location(me->def);
 
 3097rb_method_location(
VALUE method)
 
 3099    return method_def_location(rb_method_def(method));
 
 3103vm_proc_method_def(
VALUE procval)
 
 3109    GetProcPtr(procval, proc);
 
 3110    block = &proc->block;
 
 3112    if (vm_block_type(block) == block_type_ifunc &&
 
 3113        IS_METHOD_PROC_IFUNC(ifunc = block->as.captured.code.ifunc)) {
 
 3114        return rb_method_def((
VALUE)ifunc->data);
 
 3127    switch (def->type) {
 
 3128      case VM_METHOD_TYPE_ISEQ:
 
 3129        iseq = method_def_iseq(def);
 
 3130        return rb_iseq_parameters(iseq, 0);
 
 3131      case VM_METHOD_TYPE_BMETHOD:
 
 3132        if ((iseq = method_def_iseq(def)) != NULL) {
 
 3133            return rb_iseq_parameters(iseq, 0);
 
 3135        else if ((bmethod_def = vm_proc_method_def(def->body.bmethod.proc)) != NULL) {
 
 3136            return method_def_parameters(bmethod_def);
 
 3140      case VM_METHOD_TYPE_ALIAS:
 
 3141        return method_def_parameters(def->body.alias.original_me->def);
 
 3143      case VM_METHOD_TYPE_OPTIMIZED:
 
 3144        if (def->body.optimized.type == OPTIMIZED_METHOD_TYPE_STRUCT_ASET) {
 
 3145            VALUE param = rb_ary_new_from_args(2, 
ID2SYM(rb_intern(
"req")), 
ID2SYM(rb_intern(
"_")));
 
 3146            return rb_ary_new_from_args(1, param);
 
 3150      case VM_METHOD_TYPE_CFUNC:
 
 3151      case VM_METHOD_TYPE_ATTRSET:
 
 3152      case VM_METHOD_TYPE_IVAR:
 
 3153      case VM_METHOD_TYPE_ZSUPER:
 
 3154      case VM_METHOD_TYPE_UNDEF:
 
 3155      case VM_METHOD_TYPE_NOTIMPLEMENTED:
 
 3156      case VM_METHOD_TYPE_MISSING:
 
 3157      case VM_METHOD_TYPE_REFINED:
 
 3161    return rb_unnamed_parameters(method_def_arity(def));
 
 3185rb_method_parameters(
VALUE method)
 
 3187    return method_def_parameters(rb_method_def(method));
 
 3224method_inspect(
VALUE method)
 
 3228    const char *sharp = 
"#";
 
 3230    VALUE defined_class;
 
 3233    str = rb_sprintf(
"#<% "PRIsVALUE
": ", 
rb_obj_class(method));
 
 3235    mklass = data->iclass;
 
 3236    if (!mklass) mklass = data->klass;
 
 3246    if (data->me->def->type == VM_METHOD_TYPE_ALIAS) {
 
 3247        defined_class = data->me->def->body.alias.original_me->owner;
 
 3250        defined_class = method_entry_defined_class(data->me);
 
 3257    if (UNDEF_P(data->recv)) {
 
 3261    else if (RCLASS_SINGLETON_P(mklass)) {
 
 3262        VALUE v = RCLASS_ATTACHED_OBJECT(mklass);
 
 3264        if (UNDEF_P(data->recv)) {
 
 3267        else if (data->recv == v) {
 
 3280        mklass = data->klass;
 
 3281        if (RCLASS_SINGLETON_P(mklass)) {
 
 3282            VALUE v = RCLASS_ATTACHED_OBJECT(mklass);
 
 3290        if (defined_class != mklass) {
 
 3291            rb_str_catf(str, 
"(% "PRIsVALUE
")", defined_class);
 
 3296    if (data->me->called_id != data->me->def->original_id) {
 
 3297        rb_str_catf(str, 
"(%"PRIsVALUE
")",
 
 3298                    rb_id2str(data->me->def->original_id));
 
 3300    if (data->me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) {
 
 3306        VALUE params = rb_method_parameters(method);
 
 3307        VALUE pair, name, kind;
 
 3313        const VALUE keyrest = 
ID2SYM(rb_intern(
"keyrest"));
 
 3330        for (
int i = 0; i < 
RARRAY_LEN(params); i++) {
 
 3338                if (kind == req || kind == opt) {
 
 3341                else if (kind == rest || kind == keyrest) {
 
 3344                else if (kind == block) {
 
 3347                else if (kind == nokey) {
 
 3356                rb_str_catf(str, 
"%"PRIsVALUE, name);
 
 3358            else if (kind == opt) {
 
 3359                rb_str_catf(str, 
"%"PRIsVALUE
"=...", name);
 
 3361            else if (kind == keyreq) {
 
 3362                rb_str_catf(str, 
"%"PRIsVALUE
":", name);
 
 3364            else if (kind == key) {
 
 3365                rb_str_catf(str, 
"%"PRIsVALUE
": ...", name);
 
 3367            else if (kind == rest) {
 
 3368                if (name == 
ID2SYM(
'*')) {
 
 3372                    rb_str_catf(str, 
"*%"PRIsVALUE, name);
 
 3375            else if (kind == keyrest) {
 
 3376                if (name != 
ID2SYM(idPow)) {
 
 3377                    rb_str_catf(str, 
"**%"PRIsVALUE, name);
 
 3386            else if (kind == block) {
 
 3387                if (name == 
ID2SYM(
'&')) {
 
 3396                    rb_str_catf(str, 
"&%"PRIsVALUE, name);
 
 3399            else if (kind == nokey) {
 
 3411        VALUE loc = rb_method_location(method);
 
 3413            rb_str_catf(str, 
" %"PRIsVALUE
":%"PRIsVALUE,
 
 3446method_to_proc(
VALUE method)
 
 3460    procval = 
rb_block_call(rb_mRubyVMFrozenCore, idLambda, 0, 0, bmcall, method);
 
 3461    GetProcPtr(procval, proc);
 
 3462    proc->is_from_method = 1;
 
 3466extern VALUE rb_find_defined_class_by_owner(
VALUE current_class, 
VALUE target_owner);
 
 3477method_super_method(
VALUE method)
 
 3479    const struct METHOD *data;
 
 3480    VALUE super_class, iclass;
 
 3485    iclass = data->iclass;
 
 3486    if (!iclass) 
return Qnil;
 
 3487    if (data->me->def->type == VM_METHOD_TYPE_ALIAS && data->me->defined_class) {
 
 3488        super_class = 
RCLASS_SUPER(rb_find_defined_class_by_owner(data->me->defined_class,
 
 3489            data->me->def->body.alias.original_me->owner));
 
 3490        mid = data->me->def->body.alias.original_me->def->original_id;
 
 3494        mid = data->me->def->original_id;
 
 3496    if (!super_class) 
return Qnil;
 
 3497    me = (
rb_method_entry_t *)rb_callable_method_entry_with_refinements(super_class, mid, &iclass);
 
 3498    if (!me) 
return Qnil;
 
 3499    return mnew_internal(me, me->owner, iclass, data->recv, mid, 
rb_obj_class(method), FALSE, FALSE);
 
 3509localjump_xvalue(
VALUE exc)
 
 3523localjump_reason(
VALUE exc)
 
 3528rb_cref_t *rb_vm_cref_new_toplevel(
void); 
 
 3537    VM_ASSERT(env->ep > env->env);
 
 3538    VM_ASSERT(VM_ENV_ESCAPED_P(env->ep));
 
 3541        cref = rb_vm_cref_new_toplevel();
 
 3545    new_ep = &new_body[env->ep - env->env];
 
 3546    new_env = vm_env_new(new_ep, new_body, env->env_size, env->iseq);
 
 3553    new_ep[VM_ENV_DATA_INDEX_ENV] = (
VALUE)new_env;
 
 3555    VM_ASSERT(VM_ENV_ESCAPED_P(new_ep));
 
 3573proc_binding(
VALUE self)
 
 3582    GetProcPtr(self, proc);
 
 3583    block = &proc->block;
 
 3585    if (proc->is_isolated) rb_raise(rb_eArgError, 
"Can't create Binding from isolated Proc");
 
 3588    switch (vm_block_type(block)) {
 
 3589      case block_type_iseq:
 
 3590        iseq = block->as.captured.code.iseq;
 
 3591        binding_self = block->as.captured.self;
 
 3592        env = VM_ENV_ENVVAL_PTR(block->as.captured.ep);
 
 3594      case block_type_proc:
 
 3595        GetProcPtr(block->as.proc, proc);
 
 3596        block = &proc->block;
 
 3598      case block_type_ifunc:
 
 3600            const struct vm_ifunc *ifunc = block->as.captured.code.ifunc;
 
 3601            if (IS_METHOD_PROC_IFUNC(ifunc)) {
 
 3603                VALUE name = rb_fstring_lit(
"<empty_iseq>");
 
 3605                binding_self = method_receiver(method);
 
 3606                iseq = rb_method_iseq(method);
 
 3607                env = VM_ENV_ENVVAL_PTR(block->as.captured.ep);
 
 3608                env = env_clone(env, method_cref(method));
 
 3610                empty = rb_iseq_new(
Qnil, name, name, 
Qnil, 0, ISEQ_TYPE_TOP);
 
 3616      case block_type_symbol:
 
 3617        rb_raise(rb_eArgError, 
"Can't create Binding from C level Proc");
 
 3622    GetBindingPtr(bindval, bind);
 
 3623    RB_OBJ_WRITE(bindval, &bind->block.as.captured.self, binding_self);
 
 3624    RB_OBJ_WRITE(bindval, &bind->block.as.captured.code.iseq, env->iseq);
 
 3625    rb_vm_block_ep_update(bindval, &bind->block, env->ep);
 
 3629        rb_iseq_check(iseq);
 
 3630        RB_OBJ_WRITE(bindval, &bind->pathobj, ISEQ_BODY(iseq)->location.pathobj);
 
 3631        bind->first_lineno = ISEQ_BODY(iseq)->location.first_lineno;
 
 3635                     rb_iseq_pathobj_new(rb_fstring_lit(
"(binding)"), 
Qnil));
 
 3636        bind->first_lineno = 1;
 
 3651    GetProcPtr(proc, procp);
 
 3652    is_lambda = procp->is_lambda;
 
 3656    GetProcPtr(proc, procp);
 
 3657    procp->is_lambda = is_lambda;
 
 3664    VALUE proc, passed, arity;
 
 3673        if (!
NIL_P(blockarg)) {
 
 3674            rb_warn(
"given block not used");
 
 3676        arity = make_curry_proc(proc, passed, arity);
 
 3731proc_curry(
int argc, 
const VALUE *argv, 
VALUE self)
 
 3733    int sarity, max_arity, min_arity = rb_proc_min_max_arity(self, &max_arity);
 
 3746    return make_curry_proc(self, 
rb_ary_new(), arity);
 
 3782rb_method_curry(
int argc, 
const VALUE *argv, 
VALUE self)
 
 3784    VALUE proc = method_to_proc(self);
 
 3785    return proc_curry(argc, argv, proc);
 
 3803        return rb_funcallv(f, idCall, 1, &fargs);
 
 3814    mesg = rb_fstring_lit(
"callable object is expected");
 
 3838    return rb_proc_compose_to_left(self, to_callable(g));
 
 3844    VALUE proc, args, procs[2];
 
 3850    args = rb_ary_tmp_new_from_values(0, 2, procs);
 
 3853        GetProcPtr(g, procp);
 
 3854        is_lambda = procp->is_lambda;
 
 3862    GetProcPtr(proc, procp);
 
 3863    procp->is_lambda = is_lambda;
 
 3897    return rb_proc_compose_to_right(self, to_callable(g));
 
 3903    VALUE proc, args, procs[2];
 
 3909    args = rb_ary_tmp_new_from_values(0, 2, procs);
 
 3911    GetProcPtr(self, procp);
 
 3912    is_lambda = procp->is_lambda;
 
 3915    GetProcPtr(proc, procp);
 
 3916    procp->is_lambda = is_lambda;
 
 3938rb_method_compose_to_left(
VALUE self, 
VALUE g)
 
 3941    self = method_to_proc(self);
 
 3942    return proc_compose_to_left(self, g);
 
 3962rb_method_compose_to_right(
VALUE self, 
VALUE g)
 
 3965    self = method_to_proc(self);
 
 3966    return proc_compose_to_right(self, g);
 
 4002proc_ruby2_keywords(
VALUE procval)
 
 4005    GetProcPtr(procval, proc);
 
 4007    rb_check_frozen(procval);
 
 4009    if (proc->is_from_method) {
 
 4010            rb_warn(
"Skipping set of ruby2_keywords flag for proc (proc created from method)");
 
 4014    switch (proc->block.type) {
 
 4015      case block_type_iseq:
 
 4016        if (ISEQ_BODY(proc->block.as.captured.code.iseq)->param.flags.has_rest &&
 
 4017                !ISEQ_BODY(proc->block.as.captured.code.iseq)->param.flags.has_post &&
 
 4018                !ISEQ_BODY(proc->block.as.captured.code.iseq)->param.flags.has_kw &&
 
 4019                !ISEQ_BODY(proc->block.as.captured.code.iseq)->param.flags.has_kwrest) {
 
 4020            ISEQ_BODY(proc->block.as.captured.code.iseq)->param.flags.ruby2_keywords = 1;
 
 4023            rb_warn(
"Skipping set of ruby2_keywords flag for proc (proc accepts keywords or post arguments or proc does not accept argument splat)");
 
 4027        rb_warn(
"Skipping set of ruby2_keywords flag for proc (proc not defined in Ruby)");
 
 4449    rb_add_method_optimized(
rb_cProc, idCall, OPTIMIZED_METHOD_TYPE_CALL, 0, METHOD_VISI_PUBLIC);
 
 4450    rb_add_method_optimized(
rb_cProc, rb_intern(
"[]"), OPTIMIZED_METHOD_TYPE_CALL, 0, METHOD_VISI_PUBLIC);
 
 4451    rb_add_method_optimized(
rb_cProc, rb_intern(
"==="), OPTIMIZED_METHOD_TYPE_CALL, 0, METHOD_VISI_PUBLIC);
 
 4452    rb_add_method_optimized(
rb_cProc, rb_intern(
"yield"), OPTIMIZED_METHOD_TYPE_CALL, 0, METHOD_VISI_PUBLIC);
 
 4486    rb_vm_register_special_exception(ruby_error_sysstack, 
rb_eSysStackError, 
"stack level too deep");
 
 4555                             "define_method", top_define_method, -1);
 
 4596    rb_gc_register_address(&sym_proc_cache);
 
#define RUBY_ASSERT_ALWAYS(expr,...)
A variant of RUBY_ASSERT that does not interface with RUBY_DEBUG.
 
#define RUBY_ASSERT(...)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
 
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
 
#define rb_define_singleton_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.
 
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
 
VALUE rb_singleton_class(VALUE obj)
Finds or creates the singleton class of the passed object.
 
VALUE rb_singleton_class_get(VALUE obj)
Returns the singleton class of obj, or nil if obj is not a singleton object.
 
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 rb_str_new2
Old name of rb_str_new_cstr.
 
#define rb_str_buf_cat2
Old name of rb_usascii_str_new_cstr.
 
#define Qundef
Old name of RUBY_Qundef.
 
#define INT2FIX
Old name of RB_INT2FIX.
 
#define ID2SYM
Old name of RB_ID2SYM.
 
#define OBJ_FREEZE
Old name of RB_OBJ_FREEZE.
 
#define UNREACHABLE_RETURN
Old name of RBIMPL_UNREACHABLE_RETURN.
 
#define SYM2ID
Old name of RB_SYM2ID.
 
#define ZALLOC
Old name of RB_ZALLOC.
 
#define CLASS_OF
Old name of rb_class_of.
 
#define rb_ary_new4
Old name of rb_ary_new_from_values.
 
#define FIX2INT
Old name of RB_FIX2INT.
 
#define T_MODULE
Old name of RUBY_T_MODULE.
 
#define ASSUME
Old name of RBIMPL_ASSUME.
 
#define T_ICLASS
Old name of RUBY_T_ICLASS.
 
#define ALLOC_N
Old name of RB_ALLOC_N.
 
#define rb_ary_new3
Old name of rb_ary_new_from_args.
 
#define Qtrue
Old name of RUBY_Qtrue.
 
#define ST2FIX
Old name of RB_ST2FIX.
 
#define Qnil
Old name of RUBY_Qnil.
 
#define Qfalse
Old name of RUBY_Qfalse.
 
#define NIL_P
Old name of RB_NIL_P.
 
#define T_CLASS
Old name of RUBY_T_CLASS.
 
#define BUILTIN_TYPE
Old name of RB_BUILTIN_TYPE.
 
#define Check_TypedStruct(v, t)
Old name of rb_check_typeddata.
 
#define CONST_ID
Old name of RUBY_CONST_ID.
 
#define rb_ary_new2
Old name of rb_ary_new_capa.
 
VALUE rb_eLocalJumpError
LocalJumpError exception.
 
void rb_exc_raise(VALUE mesg)
Raises an exception in the current thread.
 
int rb_typeddata_is_kind_of(VALUE obj, const rb_data_type_t *data_type)
Checks if the given object is of given kind.
 
VALUE rb_eStandardError
StandardError exception.
 
VALUE rb_eRangeError
RangeError exception.
 
VALUE rb_eTypeError
TypeError exception.
 
void rb_warn(const char *fmt,...)
Identical to rb_warning(), except it reports unless $VERBOSE is nil.
 
VALUE rb_exc_new_str(VALUE etype, VALUE str)
Identical to rb_exc_new_cstr(), except it takes a Ruby's string instead of C's.
 
VALUE rb_eException
Mother of all exceptions.
 
VALUE rb_eSysStackError
SystemStackError exception.
 
VALUE rb_class_superclass(VALUE klass)
Queries the parent of the given class.
 
VALUE rb_cUnboundMethod
UnboundMethod class.
 
VALUE rb_mKernel
Kernel module.
 
VALUE rb_cBinding
Binding class.
 
VALUE rb_obj_class(VALUE obj)
Queries the class of an object.
 
VALUE rb_inspect(VALUE obj)
Generates a human-readable textual representation of the given object.
 
VALUE rb_cModule
Module class.
 
VALUE rb_class_inherited_p(VALUE scion, VALUE ascendant)
Determines if the given two modules are relatives.
 
VALUE rb_obj_is_kind_of(VALUE obj, VALUE klass)
Queries if the given object is an instance (of possibly descendants) of the given class.
 
VALUE rb_cProc
Proc class.
 
VALUE rb_cMethod
Method class.
 
#define RB_OBJ_WRITTEN(old, oldv, young)
Identical to RB_OBJ_WRITE(), except it doesn't write any values, but only a WB declaration.
 
#define RB_OBJ_WRITE(old, slot, young)
Declaration of a "back" pointer.
 
VALUE rb_funcall(VALUE recv, ID mid, int n,...)
Calls a method.
 
VALUE rb_funcall_with_block_kw(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE procval, int kw_splat)
Identical to rb_funcallv_with_block(), except you can specify how to handle the last element of the g...
 
VALUE rb_ary_new_from_values(long n, const VALUE *elts)
Identical to rb_ary_new_from_args(), except how objects are passed.
 
VALUE rb_ary_dup(VALUE ary)
Duplicates an array.
 
VALUE rb_ary_plus(VALUE lhs, VALUE rhs)
Creates a new array, concatenating the former to the latter.
 
VALUE rb_ary_new(void)
Allocates a new, empty array.
 
VALUE rb_ary_hidden_new(long capa)
Allocates a hidden (no class) empty array.
 
VALUE rb_ary_push(VALUE ary, VALUE elem)
Special case of rb_ary_cat() that it adds only one element.
 
VALUE rb_ary_freeze(VALUE obj)
Freeze an array, preventing further modifications.
 
void rb_ary_store(VALUE ary, long key, VALUE val)
Destructively stores the passed value to the passed array's passed index.
 
#define UNLIMITED_ARGUMENTS
This macro is used in conjunction with rb_check_arity().
 
static int rb_check_arity(int argc, int min, int max)
Ensures that the passed integer is in the passed range.
 
int rb_is_local_id(ID id)
Classifies the given ID, then sees if it is a local variable.
 
VALUE rb_method_call_with_block(int argc, const VALUE *argv, VALUE recv, VALUE proc)
Identical to rb_proc_call(), except you can additionally pass a proc as a block.
 
int rb_obj_method_arity(VALUE obj, ID mid)
Identical to rb_mod_method_arity(), except it searches for singleton methods rather than instance met...
 
VALUE rb_proc_call(VALUE recv, VALUE args)
Evaluates the passed proc with the passed arguments.
 
VALUE rb_proc_call_with_block_kw(VALUE recv, int argc, const VALUE *argv, VALUE proc, int kw_splat)
Identical to rb_proc_call_with_block(), except you can specify how to handle the last element of the ...
 
VALUE rb_method_call_kw(int argc, const VALUE *argv, VALUE recv, int kw_splat)
Identical to rb_method_call(), except you can specify how to handle the last element of the given arr...
 
VALUE rb_obj_method(VALUE recv, VALUE mid)
Creates a method object.
 
VALUE rb_proc_lambda_p(VALUE recv)
Queries if the given object is a lambda.
 
VALUE rb_block_proc(void)
Constructs a Proc object from implicitly passed components.
 
VALUE rb_proc_call_with_block(VALUE recv, int argc, const VALUE *argv, VALUE proc)
Identical to rb_proc_call(), except you can additionally pass another proc object,...
 
int rb_mod_method_arity(VALUE mod, ID mid)
Queries the number of mandatory arguments of the method defined in the given module.
 
VALUE rb_method_call_with_block_kw(int argc, const VALUE *argv, VALUE recv, VALUE proc, int kw_splat)
Identical to rb_method_call_with_block(), except you can specify how to handle the last element of th...
 
VALUE rb_obj_is_method(VALUE recv)
Queries if the given object is a method.
 
VALUE rb_block_lambda(void)
Identical to rb_proc_new(), except it returns a lambda.
 
VALUE rb_proc_call_kw(VALUE recv, VALUE args, int kw_splat)
Identical to rb_proc_call(), except you can specify how to handle the last element of the given array...
 
VALUE rb_binding_new(void)
Snapshots the current execution context and turn it into an instance of rb_cBinding.
 
int rb_proc_arity(VALUE recv)
Queries the number of mandatory arguments of the given Proc.
 
VALUE rb_method_call(int argc, const VALUE *argv, VALUE recv)
Evaluates the passed method with the passed arguments.
 
VALUE rb_obj_is_proc(VALUE recv)
Queries if the given object is a proc.
 
#define rb_hash_uint(h, i)
Just another name of st_hash_uint.
 
#define rb_hash_end(h)
Just another name of st_hash_end.
 
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_buf_append(VALUE dst, VALUE src)
Identical to rb_str_cat_cstr(), except it takes Ruby's string instead of C's.
 
void rb_str_set_len(VALUE str, long len)
Overwrites the length of the string.
 
st_index_t rb_hash_start(st_index_t i)
Starts a series of hashing.
 
#define rb_str_cat_cstr(buf, str)
Identical to rb_str_cat(), except it assumes the passed pointer is a pointer to a C string.
 
VALUE rb_str_intern(VALUE str)
Identical to rb_to_symbol(), except it assumes the receiver being an instance of RString.
 
void rb_undef_alloc_func(VALUE klass)
Deletes 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.
 
ID rb_check_id(volatile VALUE *namep)
Detects if the given name is already interned or not.
 
VALUE rb_iv_get(VALUE obj, const char *name)
Obtains an instance variable.
 
#define RB_INT2NUM
Just another name of rb_int2num_inline.
 
#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)
Shim for block function parameters.
 
rb_block_call_func * rb_block_call_func_t
Shorthand type that represents an iterator-written-in-C function pointer.
 
VALUE rb_block_call_func(RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg))
This is the type of a function that the interpreter expect for C-backended blocks.
 
#define MEMCPY(p1, p2, type, n)
Handy macro to call memcpy.
 
#define RB_GC_GUARD(v)
Prevents premature destruction of local objects.
 
VALUE rb_block_call(VALUE q, ID w, int e, const VALUE *r, type *t, VALUE y)
Call a method with a block.
 
VALUE rb_proc_new(type *q, VALUE w)
Creates a rb_cProc instance.
 
VALUE rb_rescue(type *q, VALUE w, type *e, VALUE r)
An equivalent of rescue clause.
 
#define RARRAY_LEN
Just another name of rb_array_len.
 
static void RARRAY_ASET(VALUE ary, long i, VALUE v)
Assigns an object in an array.
 
#define RARRAY_AREF(a, i)
 
#define RARRAY_CONST_PTR
Just another name of rb_array_const_ptr.
 
static VALUE RBASIC_CLASS(VALUE obj)
Queries the class of an object.
 
#define RCLASS_SUPER
Just another name of rb_class_get_superclass.
 
#define RUBY_TYPED_DEFAULT_FREE
This is a value you can set to rb_data_type_struct::dfree.
 
#define TypedData_Get_Struct(obj, type, data_type, sval)
Obtains a C struct from inside of a wrapper Ruby object.
 
#define TypedData_Make_Struct(klass, type, data_type, sval)
Identical to TypedData_Wrap_Struct, except it allocates a new data region internally instead of takin...
 
const char * rb_obj_classname(VALUE obj)
Queries the name of the class of the passed object.
 
#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.
 
This is the struct that holds necessary info for a struct.
 
rb_cref_t * cref
class reference, should be marked
 
const rb_iseq_t * iseqptr
iseq pointer, should be separated from iseqval
 
Internal header for Namespace.
 
IFUNC (Internal FUNCtion)
 
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
 
#define SIZEOF_VALUE
Identical to sizeof(VALUE), except it is a macro that can also be used inside of preprocessor directi...
 
uintptr_t VALUE
Type that represents a Ruby object.
 
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.