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 »