зеркало из https://github.com/github/ruby.git
insns.def: s/handles_frame/handles_sp/
because it's more suitable to describe the current behavior now. tool/ruby_vm/models/bare_instructions.rb: ditto. tool/ruby_vm/views/_insn_entry.erb: ditto. tool/ruby_vm/views/_mjit_compile_insn_body.erb: ditto. tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
218aa03c0f
Коммит
a763bc3c6b
16
insns.def
16
insns.def
|
@ -43,7 +43,7 @@
|
|||
* sp_inc: Used to dynamically calculate sp increase in
|
||||
`insn_stack_increase`.
|
||||
|
||||
* handles_frame: If it is true, VM deals with sp in the insn.
|
||||
* handles_sp: If it is true, VM deals with sp in the insn.
|
||||
|
||||
- Attributes can access operands, but not stack (push/pop) variables.
|
||||
|
||||
|
@ -687,7 +687,7 @@ defineclass
|
|||
(ID id, ISEQ class_iseq, rb_num_t flags)
|
||||
(VALUE cbase, VALUE super)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
{
|
||||
VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super);
|
||||
|
||||
|
@ -714,7 +714,7 @@ send
|
|||
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
|
||||
(...)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
|
||||
{
|
||||
struct rb_calling_info calling;
|
||||
|
@ -768,7 +768,7 @@ opt_send_without_block
|
|||
(CALL_INFO ci, CALL_CACHE cc)
|
||||
(...)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
// attr rb_snum_t sp_inc = -ci->orig_argc;
|
||||
{
|
||||
struct rb_calling_info calling;
|
||||
|
@ -783,7 +783,7 @@ invokesuper
|
|||
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
|
||||
(...)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
|
||||
{
|
||||
struct rb_calling_info calling;
|
||||
|
@ -801,7 +801,7 @@ invokeblock
|
|||
(CALL_INFO ci)
|
||||
(...)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
// attr rb_snum_t sp_inc = 1 - ci->orig_argc;
|
||||
{
|
||||
struct rb_calling_info calling;
|
||||
|
@ -828,7 +828,7 @@ leave
|
|||
()
|
||||
(VALUE val)
|
||||
(VALUE val)
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
{
|
||||
if (OPT_CHECKED_RUN) {
|
||||
const VALUE *const bp = vm_base_ptr(reg_cfp);
|
||||
|
@ -1376,7 +1376,7 @@ opt_call_c_function
|
|||
(rb_insn_func_t funcptr)
|
||||
()
|
||||
()
|
||||
// attr bool handles_frame = true;
|
||||
// attr bool handles_sp = true;
|
||||
{
|
||||
reg_cfp = (funcptr)(ec, reg_cfp);
|
||||
|
||||
|
|
|
@ -101,8 +101,8 @@ class RubyVM::BareInstructions
|
|||
}.join
|
||||
end
|
||||
|
||||
def handles_frame?
|
||||
/\b(false|0)\b/ !~ @attrs['handles_frame'].expr.expr
|
||||
def handles_sp?
|
||||
/\b(false|0)\b/ !~ @attrs['handles_sp'].expr.expr
|
||||
end
|
||||
|
||||
def inspect
|
||||
|
@ -129,7 +129,7 @@ class RubyVM::BareInstructions
|
|||
generate_attribute 'rb_num_t', 'retn', rets.size
|
||||
generate_attribute 'rb_num_t', 'width', width
|
||||
generate_attribute 'rb_snum_t', 'sp_inc', rets.size - pops.size
|
||||
generate_attribute 'bool', 'handles_frame', false
|
||||
generate_attribute 'bool', 'handles_sp', false
|
||||
end
|
||||
|
||||
def typesplit a
|
||||
|
|
|
@ -30,7 +30,7 @@ INSN_ENTRY(<%= insn.name %>)
|
|||
% end
|
||||
DEBUG_ENTER_INSN(INSN_ATTR(name));
|
||||
ADD_PC(INSN_ATTR(width));
|
||||
% if insn.handles_frame?
|
||||
% if insn.handles_sp?
|
||||
POPN(INSN_ATTR(popn));
|
||||
% end
|
||||
COLLECT_USAGE_INSN(INSN_ATTR(bin));
|
||||
|
@ -39,7 +39,7 @@ INSN_ENTRY(<%= insn.name %>)
|
|||
% end
|
||||
<%= render_c_expr insn.expr -%>
|
||||
CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
|
||||
% if insn.handles_frame?
|
||||
% if insn.handles_sp?
|
||||
% insn.rets.reverse_each do |ret|
|
||||
PUSH(<%= insn.cast_to_VALUE ret %>);
|
||||
% end
|
||||
|
|
|
@ -75,13 +75,13 @@
|
|||
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
|
||||
fprintf(f, " goto cancel;\n");
|
||||
% else
|
||||
% if insn.handles_frame?
|
||||
% # If insn.handles_frame? is true, cfp->sp might be changed inside insns (like vm_caller_setup_arg_block)
|
||||
% # and thus we need to use cfp->sp, even when local_stack_p is TRUE. When insn.handles_frame? is true,
|
||||
% if insn.handles_sp?
|
||||
% # If insn.handles_sp? is true, cfp->sp might be changed inside insns (like vm_caller_setup_arg_block)
|
||||
% # and thus we need to use cfp->sp, even when local_stack_p is TRUE. When insn.handles_sp? is true,
|
||||
% # cfp->sp should be available too because _mjit_compile_pc_and_sp.erb sets it.
|
||||
fprintf(f, <%= to_cstr.call(line) %>);
|
||||
% else
|
||||
% # If local_stack_p is TRUE and insn.handles_frame? is false, stack values are only available in local variables
|
||||
% # If local_stack_p is TRUE and insn.handles_sp? is false, stack values are only available in local variables
|
||||
% # for stack. So we need to replace those macros if local_stack_p is TRUE here.
|
||||
% case line
|
||||
% when /\bGET_SP\(\)/
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
%
|
||||
% # JIT: move sp to use or preserve stack variables
|
||||
if (status->local_stack_p) {
|
||||
% # sp motion is optimized away for `handles_frame? #=> false` case.
|
||||
% # sp motion is optimized away for `handles_sp? #=> false` case.
|
||||
% # Thus sp should be set properly before `goto cancel`.
|
||||
% if insn.handles_frame?
|
||||
% if insn.handles_sp?
|
||||
% # JIT-only behavior (pushing JIT's local variables to VM's stack):
|
||||
{
|
||||
rb_snum_t i, push_size;
|
||||
|
@ -28,7 +28,7 @@
|
|||
% end
|
||||
}
|
||||
else {
|
||||
% if insn.handles_frame?
|
||||
% if insn.handles_sp?
|
||||
fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - <%= insn.pops.size %>); /* POPN(INSN_ATTR(popn)); */
|
||||
% else
|
||||
fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
|
||||
|
|
Загрузка…
Ссылка в новой задаче