summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-26 00:58:26 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-26 00:58:26 +0000
commit686881d383cfe44c67875aada64207c5e0abaa8d (patch)
tree63e419afdd728fa5a02a09faf9d5bfb885ce40af
parent756b200ad6623fdad76c30f19aaf25fb75a24f08 (diff)
add _sp_inc_helpers.erb [ci skip]
Just add more room for comments. This is a pure refactoring that does not change anything but readability. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--insns.def8
-rw-r--r--tool/ruby_vm/views/_sp_inc_helpers.erb35
-rw-r--r--tool/ruby_vm/views/insns_info.inc.erb1
3 files changed, 40 insertions, 4 deletions
diff --git a/insns.def b/insns.def
index 983a20fa3f..0bbe0c8ec5 100644
--- a/insns.def
+++ b/insns.def
@@ -738,7 +738,7 @@ send
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
(...)
(VALUE val)
-// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
+// attr rb_snum_t sp_inc = sp_inc_of_sendish(ci);
{
struct rb_calling_info calling;
@@ -755,7 +755,7 @@ opt_send_without_block
(...)
(VALUE val)
// attr bool handles_sp = true;
-// attr rb_snum_t sp_inc = -ci->orig_argc;
+// attr rb_snum_t sp_inc = sp_inc_of_sendish(ci);
{
struct rb_calling_info calling;
calling.block_handler = VM_BLOCK_HANDLER_NONE;
@@ -824,7 +824,7 @@ invokesuper
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
(...)
(VALUE val)
-// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
+// attr rb_snum_t sp_inc = sp_inc_of_sendish(ci);
{
struct rb_calling_info calling;
@@ -841,7 +841,7 @@ invokeblock
(...)
(VALUE val)
// attr bool handles_sp = true;
-// attr rb_snum_t sp_inc = 1 - ci->orig_argc;
+// attr rb_snum_t sp_inc = sp_inc_of_invokeblock(ci);
{
struct rb_calling_info calling;
VALUE block_handler;
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' %>