Project

General

Profile

Feature #10256 » 0001-make-rb_method_definition_t-smaller-via-rb_method_cf.patch

normalperson (Eric Wong), 09/19/2014 05:58 PM

View differences:

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 *
-
(2-2/2)