diff options
Diffstat (limited to 'tool/ruby_vm')
-rwxr-xr-x | tool/ruby_vm/models/bare_instructions.rb | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/tool/ruby_vm/models/bare_instructions.rb b/tool/ruby_vm/models/bare_instructions.rb index 7d9ed6da5a..2767f383e6 100755 --- a/tool/ruby_vm/models/bare_instructions.rb +++ b/tool/ruby_vm/models/bare_instructions.rb @@ -144,6 +144,7 @@ class RubyVM::BareInstructions end def predefine_attributes + # Beware: order matters here because some attribute depends another. generate_attribute 'const char*', 'name', "insn_name(#{bin})" generate_attribute 'enum ruby_vminsn_type', 'bin', bin generate_attribute 'rb_num_t', 'open', opes.size @@ -151,11 +152,24 @@ 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_sp', false - generate_attribute 'bool', 'leaf', opes.all? {|o| - # Insn with ISEQ should yield it; can never be a leaf. - o[:type] != 'ISEQ' - } + generate_attribute 'bool', 'handles_sp', default_definition_of_handles_sp + generate_attribute 'bool', 'leaf', default_definition_of_leaf + end + + def default_definition_of_handles_sp + # Insn with ISEQ should yield it; can handle sp. + return opes.any? {|o| o[:type] == 'ISEQ' } + end + + def default_definition_of_leaf + # Insn that handles SP can never be a leaf. + if not has_attribute? 'handles_sp' then + return ! default_definition_of_handles_sp + elsif handles_sp? then + return "! #{call_attribute 'handles_sp'}" + else + return true + end end def typesplit a |