diff options
-rw-r--r-- | insns.def | 32 | ||||
-rw-r--r-- | vm_opts.h | 16 |
2 files changed, 29 insertions, 19 deletions
@@ -751,6 +751,22 @@ send CALL_METHOD(&calling, ci, cc); } +/* Invoke method without block */ +DEFINE_INSN +opt_send_without_block +(CALL_INFO ci, CALL_CACHE cc) +(...) +(VALUE val) +// attr bool leaf = false; /* Of course it isn't. */ +// attr bool handles_sp = true; +// attr rb_snum_t sp_inc = -ci->orig_argc; +{ + struct rb_calling_info calling; + calling.block_handler = VM_BLOCK_HANDLER_NONE; + vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); + CALL_METHOD(&calling, ci, cc); +} + DEFINE_INSN opt_str_freeze (VALUE str, CALL_INFO ci, CALL_CACHE cc) @@ -806,22 +822,6 @@ opt_newarray_min val = vm_opt_newarray_min(num, STACK_ADDR_FROM_TOP(num)); } -/* Invoke method without block */ -DEFINE_INSN -opt_send_without_block -(CALL_INFO ci, CALL_CACHE cc) -(...) -(VALUE val) -// attr bool leaf = false; /* Of course it isn't. */ -// attr bool handles_sp = true; -// attr rb_snum_t sp_inc = -ci->orig_argc; -{ - struct rb_calling_info calling; - calling.block_handler = VM_BLOCK_HANDLER_NONE; - vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); - CALL_METHOD(&calling, ci, cc); -} - /* super(args) # args.size => num */ DEFINE_INSN invokesuper @@ -30,9 +30,19 @@ */ /* C compiler dependent */ -#define OPT_DIRECT_THREADED_CODE 1 -#define OPT_TOKEN_THREADED_CODE 0 -#define OPT_CALL_THREADED_CODE 0 + +/* + * 0: direct (using labeled goto using GCC special) + * 1: token (switch/case) + * 2: call (function call for each insn dispatch) + */ +#ifndef OPT_THREADED_CODE +#define OPT_THREADED_CODE 0 +#endif + +#define OPT_DIRECT_THREADED_CODE (OPT_THREADED_CODE == 0) +#define OPT_TOKEN_THREADED_CODE (OPT_THREADED_CODE == 1) +#define OPT_CALL_THREADED_CODE (OPT_THREADED_CODE == 2) /* VM running option */ #define OPT_CHECKED_RUN 1 |