summaryrefslogtreecommitdiff
path: root/tool/ruby_vm/views/_insn_stack_increase.erb
diff options
context:
space:
mode:
Diffstat (limited to 'tool/ruby_vm/views/_insn_stack_increase.erb')
-rw-r--r--tool/ruby_vm/views/_insn_stack_increase.erb53
1 files changed, 53 insertions, 0 deletions
diff --git a/tool/ruby_vm/views/_insn_stack_increase.erb b/tool/ruby_vm/views/_insn_stack_increase.erb
new file mode 100644
index 0000000000..566e06c95e
--- /dev/null
+++ b/tool/ruby_vm/views/_insn_stack_increase.erb
@@ -0,0 +1,53 @@
+%# -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*-
+%# Copyright (c) 2017 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.
+%#
+PUREFUNC(MAYBE_UNUSED(static int insn_stack_increase(int depth, int insn, const VALUE *opes)));
+PUREFUNC(static rb_snum_t insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes));
+
+rb_snum_t
+insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes)
+{
+ static const signed char t[] = {
+% RubyVM::Instructions.each_slice 8 do |a|
+ <%= a.map { |i|
+ if i.has_attribute?('sp_inc')
+ '-127'
+ else
+ sprintf("%4d", i.rets.size - i.pops.size)
+ end
+ }.join(', ') -%>,
+% end
+ };
+ char c = t[insn];
+
+ ASSERT_VM_INSTRUCTION_SIZE(t);
+ if (c != -127) {
+ return c;
+ }
+ else switch(insn) {
+ default:
+ UNREACHABLE;
+% RubyVM::Instructions.each do |i|
+% next unless i.has_attribute?('sp_inc')
+ case <%= i.bin %>:
+ return CALL_ATTRIBUTE(sp_inc, <%= i.name %><%=
+ i.opes.map.with_index do |v, j|
+ k = i.cast_from_VALUE v, "opes[#{j}]"
+ next ", #{k}"
+ end.join
+ %>);
+% end
+ }
+}
+
+int
+insn_stack_increase(int depth, int insn, const VALUE *opes)
+{
+ enum ruby_vminsn_type itype = (enum ruby_vminsn_type)insn;
+ return depth + (int)insn_stack_increase_dispatch(itype, opes);
+}