diff options
Diffstat (limited to 'tool')
-rw-r--r-- | tool/ruby_vm/views/_sp_inc_helpers.erb | 35 | ||||
-rw-r--r-- | tool/ruby_vm/views/insns_info.inc.erb | 1 |
2 files changed, 36 insertions, 0 deletions
diff --git a/tool/ruby_vm/views/_sp_inc_helpers.erb b/tool/ruby_vm/views/_sp_inc_helpers.erb new file mode 100644 index 0000000000..f979064a5f --- /dev/null +++ b/tool/ruby_vm/views/_sp_inc_helpers.erb @@ -0,0 +1,35 @@ +%# -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*- +%# Copyright (c) 2018 Urabe, Shyouhei. All rights reserved. +%# +%# This file is a part of the programming language Ruby. Permission is hereby +%# granted, to either redistribute and/or modify this file, provided that the +%# conditions mentioned in the file COPYING are met. Consult the file for +%# details. +%; + +static rb_snum_t +sp_inc_of_sendish(const struct rb_call_info *ci) +{ + /* Send-ish instructions will: + * + * 1. Pop block argument, if any. + * 2. Pop ordinal argumanes. + * 3. Pop receiver. + * 4. Push return value. + */ + const int argc = ci->orig_argc; + const int argb = (ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0; + const int recv = 1; + const int retn = 1; + + /* 1. 2. 3. 4. */ + return 0 - argb - argc - recv + retn; +} + +static rb_snum_t +sp_inc_of_invokeblock(const struct rb_call_info *ci) +{ + /* sp_inc of invokeblock is almost identical to that of sendish + * instructions, except that it does not pop receriver. */ + return sp_inc_of_sendish(ci) + 1; +} diff --git a/tool/ruby_vm/views/insns_info.inc.erb b/tool/ruby_vm/views/insns_info.inc.erb index 67fcebfc42..cdca908a69 100644 --- a/tool/ruby_vm/views/insns_info.inc.erb +++ b/tool/ruby_vm/views/insns_info.inc.erb @@ -16,5 +16,6 @@ <%= render 'insn_len_info' %> <%= render 'insn_operand_info' %> <%= render 'leaf_helpers' %> +<%= render 'sp_inc_helpers' %> <%= render 'attributes' %> <%= render 'insn_stack_increase' %> |