Feature #10256 » 0001-make-rb_method_definition_t-smaller-via-rb_method_cf.patch
method.h | ||
---|---|---|
typedef struct rb_method_cfunc_struct {
|
||
VALUE (*func)(ANYARGS);
|
||
VALUE (*invoker)(VALUE (*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv);
|
||
int argc;
|
||
} rb_method_cfunc_t;
|
||
typedef VALUE (*rb_cfunc_invoker_t)(VALUE (*func)(ANYARGS), VALUE recv, int argc, const VALUE *);
|
||
typedef struct rb_method_attr_struct {
|
||
ID id;
|
||
const VALUE location;
|
vm_eval.c | ||
---|---|---|
th->passed_ci = ci;
|
||
ci->aux.inc_sp = 0;
|
||
VM_PROFILE_UP(2);
|
||
val = (*cfunc->invoker)(cfunc->func, ci, argv);
|
||
val = (rb_cfunc_invoker(cfunc))(cfunc->func, ci, argv);
|
||
if (reg_cfp == th->cfp) {
|
||
if (UNLIKELY(th->passed_ci != ci)) {
|
||
... | ... | |
if (len >= 0) rb_check_arity(argc, len, len);
|
||
VM_PROFILE_UP(2);
|
||
val = (*cfunc->invoker)(cfunc->func, recv, argc, argv);
|
||
val = (rb_cfunc_invoker(cfunc))(cfunc->func, recv, argc, argv);
|
||
if (UNLIKELY(reg_cfp != th->cfp + 1)) {
|
||
rb_bug("vm_call0_cfunc_with_frame: cfp consistency error");
|
vm_insnhelper.c | ||
---|---|---|
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]);
|
||
}
|
||
static rb_cfunc_invoker_t
|
||
rb_cfunc_invoker(const rb_method_cfunc_t *cfunc)
|
||
{
|
||
static const rb_cfunc_invoker_t const tbl[] = {
|
||
call_cfunc_m2,
|
||
call_cfunc_m1,
|
||
call_cfunc_0,
|
||
call_cfunc_1,
|
||
call_cfunc_2,
|
||
call_cfunc_3,
|
||
call_cfunc_4,
|
||
call_cfunc_5,
|
||
call_cfunc_6,
|
||
call_cfunc_7,
|
||
call_cfunc_8,
|
||
call_cfunc_9,
|
||
call_cfunc_10,
|
||
call_cfunc_11,
|
||
call_cfunc_12,
|
||
call_cfunc_13,
|
||
call_cfunc_14,
|
||
call_cfunc_15
|
||
};
|
||
return tbl[cfunc->argc + 2];
|
||
}
|
||
#ifndef VM_PROFILE
|
||
#define VM_PROFILE 0
|
||
#endif
|
||
... | ... | |
reg_cfp->sp -= argc + 1;
|
||
VM_PROFILE_UP(0);
|
||
val = (*cfunc->invoker)(cfunc->func, recv, argc, reg_cfp->sp + 1);
|
||
val = (rb_cfunc_invoker(cfunc))(cfunc->func, recv, argc, reg_cfp->sp + 1);
|
||
if (reg_cfp != th->cfp + 1) {
|
||
rb_bug("vm_call_cfunc - cfp consistency error");
|
||
... | ... | |
reg_cfp->sp -= argc + 1;
|
||
ci->aux.inc_sp = argc + 1;
|
||
VM_PROFILE_UP(0);
|
||
val = (*cfunc->invoker)(cfunc->func, ci, argv);
|
||
val = (rb_cfunc_invoker(cfunc))(cfunc->func, ci, argv);
|
||
/* check */
|
||
if (reg_cfp == th->cfp) { /* no frame push */
|
vm_method.c | ||
---|---|---|
}
|
||
}
|
||
static VALUE
|
||
(*call_cfunc_invoker_func(int argc))(VALUE (*func)(ANYARGS), VALUE recv, int argc, const VALUE *)
|
||
{
|
||
switch (argc) {
|
||
case -2: return &call_cfunc_m2;
|
||
case -1: return &call_cfunc_m1;
|
||
case 0: return &call_cfunc_0;
|
||
case 1: return &call_cfunc_1;
|
||
case 2: return &call_cfunc_2;
|
||
case 3: return &call_cfunc_3;
|
||
case 4: return &call_cfunc_4;
|
||
case 5: return &call_cfunc_5;
|
||
case 6: return &call_cfunc_6;
|
||
case 7: return &call_cfunc_7;
|
||
case 8: return &call_cfunc_8;
|
||
case 9: return &call_cfunc_9;
|
||
case 10: return &call_cfunc_10;
|
||
case 11: return &call_cfunc_11;
|
||
case 12: return &call_cfunc_12;
|
||
case 13: return &call_cfunc_13;
|
||
case 14: return &call_cfunc_14;
|
||
case 15: return &call_cfunc_15;
|
||
default:
|
||
rb_bug("call_cfunc_func: unsupported length: %d", argc);
|
||
}
|
||
}
|
||
static void
|
||
setup_method_cfunc_struct(rb_method_cfunc_t *cfunc, VALUE (*func)(), int argc)
|
||
{
|
||
cfunc->func = func;
|
||
cfunc->argc = argc;
|
||
cfunc->invoker = call_cfunc_invoker_func(argc);
|
||
if (argc < -2 || argc > 15)
|
||
rb_bug("setup_method_cfunc_struct: unsupported length: %d", argc);
|
||
}
|
||
rb_method_entry_t *
|
||
-
|
- « Previous
- 1
- 2
- Next »