mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
fix OPT_CALL_THREADED_CODE issue.
* insns.def (opt_send_without_block): reorder insn position because `opt_str_freeze` insn refer this insn (function) when OPT_CALL_THREADED_CODE is true. * vm_opts.h (OPT_THREADED_CODE): introduce new macro to select threaded code implementation with a compile option (-D...). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64854 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ee819b0ddb
commit
d3a9ebeb1c
2 changed files with 29 additions and 19 deletions
32
insns.def
32
insns.def
|
@ -751,6 +751,22 @@ send
|
||||||
CALL_METHOD(&calling, ci, cc);
|
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
|
DEFINE_INSN
|
||||||
opt_str_freeze
|
opt_str_freeze
|
||||||
(VALUE str, CALL_INFO ci, CALL_CACHE cc)
|
(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));
|
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 */
|
/* super(args) # args.size => num */
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
invokesuper
|
invokesuper
|
||||||
|
|
16
vm_opts.h
16
vm_opts.h
|
@ -30,9 +30,19 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* C compiler dependent */
|
/* 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 */
|
/* VM running option */
|
||||||
#define OPT_CHECKED_RUN 1
|
#define OPT_CHECKED_RUN 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue