class SyntaxTree::YARV::OptCaseDispatch
### Summary
‘opt_case_dispatch` is a branch instruction that moves the control flow for case statements that have clauses where they can all be used as hash keys for an internal hash.
It has two arguments: the ‘case_dispatch_hash` and an `else_label`. It pops one value off the stack: a hash key. `opt_case_dispatch` looks up the key in the `case_dispatch_hash` and jumps to the corresponding label if there is one. If there is no value in the `case_dispatch_hash`, `opt_case_dispatch` jumps to the `else_label` index.
### Usage
~~~ruby case 1 when 1
puts "foo"
else
puts "bar"
end ~~~
Attributes
case_dispatch_hash[R]
else_label[R]
Public Class Methods
new(case_dispatch_hash, else_label)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2967 def initialize(case_dispatch_hash, else_label) @case_dispatch_hash = case_dispatch_hash @else_label = else_label end
Public Instance Methods
==(other)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2991 def ==(other) other.is_a?(OptCaseDispatch) && other.case_dispatch_hash == case_dispatch_hash && other.else_label == else_label end
branch_targets()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 3009 def branch_targets case_dispatch_hash.values.push(else_label) end
call(vm)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 3005 def call(vm) vm.jump(case_dispatch_hash.fetch(vm.pop, else_label)) end
deconstruct_keys(_keys)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2987 def deconstruct_keys(_keys) { case_dispatch_hash: case_dispatch_hash, else_label: else_label } end
disasm(fmt)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2972 def disasm(fmt) fmt.instruction( "opt_case_dispatch", ["<cdhash>", fmt.label(else_label)] ) end
falls_through?()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 3013 def falls_through? true end
length()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2997 def length 3 end
pops()
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 3001 def pops 1 end
to_a(_iseq)
click to toggle source
# File lib/syntax_tree/yarv/instructions.rb, line 2979 def to_a(_iseq) [ :opt_case_dispatch, case_dispatch_hash.flat_map { |key, value| [key, value.name] }, else_label.name ] end