diff options
Diffstat (limited to 'tool/ruby_vm/views/_insn_stack_increase.erb')
-rw-r--r-- | tool/ruby_vm/views/_insn_stack_increase.erb | 53 |
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); +} |