Class: SyntaxTree::YARV::OptEq

Inherits:
Instruction show all
Defined in:
lib/syntax_tree/yarv/instructions.rb

Overview

### Summary

‘opt_eq` is a specialization of the `opt_send_without_block` instruction that occurs when the == operator is used. Fast paths exist when both operands are integers, floats, symbols or strings. It pops both the receiver and the argument off the stack and pushes on the result.

### Usage

~~~ruby 2 == 2 ~~~

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Instruction

#branch_targets, #falls_through?, #leaves?, #side_effects?

Constructor Details

#initialize(calldata) ⇒ OptEq

Returns a new instance of OptEq.



3147
3148
3149
# File 'lib/syntax_tree/yarv/instructions.rb', line 3147

def initialize(calldata)
  @calldata = calldata
end

Instance Attribute Details

#calldataObject (readonly)

Returns the value of attribute calldata.



3145
3146
3147
# File 'lib/syntax_tree/yarv/instructions.rb', line 3145

def calldata
  @calldata
end

Instance Method Details

#==(other) ⇒ Object



3163
3164
3165
# File 'lib/syntax_tree/yarv/instructions.rb', line 3163

def ==(other)
  other.is_a?(OptEq) && other.calldata == calldata
end

#call(vm) ⇒ Object



3183
3184
3185
# File 'lib/syntax_tree/yarv/instructions.rb', line 3183

def call(vm)
  canonical.call(vm)
end

#canonicalObject



3179
3180
3181
# File 'lib/syntax_tree/yarv/instructions.rb', line 3179

def canonical
  Send.new(calldata, nil)
end

#deconstruct_keys(_keys) ⇒ Object



3159
3160
3161
# File 'lib/syntax_tree/yarv/instructions.rb', line 3159

def deconstruct_keys(_keys)
  { calldata: calldata }
end

#disasm(fmt) ⇒ Object



3151
3152
3153
# File 'lib/syntax_tree/yarv/instructions.rb', line 3151

def disasm(fmt)
  fmt.instruction("opt_eq", [fmt.calldata(calldata)])
end

#lengthObject



3167
3168
3169
# File 'lib/syntax_tree/yarv/instructions.rb', line 3167

def length
  2
end

#popsObject



3171
3172
3173
# File 'lib/syntax_tree/yarv/instructions.rb', line 3171

def pops
  2
end

#pushesObject



3175
3176
3177
# File 'lib/syntax_tree/yarv/instructions.rb', line 3175

def pushes
  1
end

#to_a(_iseq) ⇒ Object



3155
3156
3157
# File 'lib/syntax_tree/yarv/instructions.rb', line 3155

def to_a(_iseq)
  [:opt_eq, calldata.to_h]
end