Class: SyntaxTree::YARV::OptCaseDispatch
- Inherits:
-
Instruction
- Object
- Instruction
- SyntaxTree::YARV::OptCaseDispatch
- Defined in:
- lib/syntax_tree/yarv/instructions.rb
Overview
### 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 ~~~
Instance Attribute Summary collapse
-
#case_dispatch_hash ⇒ Object
readonly
Returns the value of attribute case_dispatch_hash.
-
#else_label ⇒ Object
readonly
Returns the value of attribute else_label.
Instance Method Summary collapse
- #==(other) ⇒ Object
- #branch_targets ⇒ Object
- #call(vm) ⇒ Object
- #deconstruct_keys(_keys) ⇒ Object
- #disasm(fmt) ⇒ Object
- #falls_through? ⇒ Boolean
-
#initialize(case_dispatch_hash, else_label) ⇒ OptCaseDispatch
constructor
A new instance of OptCaseDispatch.
- #length ⇒ Object
- #pops ⇒ Object
- #to_a(_iseq) ⇒ Object
Methods inherited from Instruction
#canonical, #leaves?, #pushes, #side_effects?
Constructor Details
#initialize(case_dispatch_hash, else_label) ⇒ OptCaseDispatch
Returns a new instance of OptCaseDispatch.
2909 2910 2911 2912 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2909 def initialize(case_dispatch_hash, else_label) @case_dispatch_hash = case_dispatch_hash @else_label = else_label end |
Instance Attribute Details
#case_dispatch_hash ⇒ Object (readonly)
Returns the value of attribute case_dispatch_hash.
2907 2908 2909 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2907 def case_dispatch_hash @case_dispatch_hash end |
#else_label ⇒ Object (readonly)
Returns the value of attribute else_label.
2907 2908 2909 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2907 def else_label @else_label end |
Instance Method Details
#==(other) ⇒ Object
2933 2934 2935 2936 2937 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2933 def ==(other) other.is_a?(OptCaseDispatch) && other.case_dispatch_hash == case_dispatch_hash && other.else_label == else_label end |
#branch_targets ⇒ Object
2951 2952 2953 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2951 def branch_targets case_dispatch_hash.values.push(else_label) end |
#call(vm) ⇒ Object
2947 2948 2949 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2947 def call(vm) vm.jump(case_dispatch_hash.fetch(vm.pop, else_label)) end |
#deconstruct_keys(_keys) ⇒ Object
2929 2930 2931 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2929 def deconstruct_keys(_keys) { case_dispatch_hash: case_dispatch_hash, else_label: else_label } end |
#disasm(fmt) ⇒ Object
2914 2915 2916 2917 2918 2919 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2914 def disasm(fmt) fmt.instruction( "opt_case_dispatch", ["<cdhash>", fmt.label(else_label)] ) end |
#falls_through? ⇒ Boolean
2955 2956 2957 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2955 def falls_through? true end |
#length ⇒ Object
2939 2940 2941 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2939 def length 3 end |
#pops ⇒ Object
2943 2944 2945 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2943 def pops 1 end |
#to_a(_iseq) ⇒ Object
2921 2922 2923 2924 2925 2926 2927 |
# File 'lib/syntax_tree/yarv/instructions.rb', line 2921 def to_a(_iseq) [ :opt_case_dispatch, case_dispatch_hash.flat_map { |key, value| [key, value.name] }, else_label.name ] end |