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.



3089
3090
3091
# File 'lib/syntax_tree/yarv/instructions.rb', line 3089

def initialize(calldata)
  @calldata = calldata
end

Instance Attribute Details

#calldataObject (readonly)

Returns the value of attribute calldata.



3087
3088
3089
# File 'lib/syntax_tree/yarv/instructions.rb', line 3087

def calldata
  @calldata
end

Instance Method Details

#==(other) ⇒ Object



3105
3106
3107
# File 'lib/syntax_tree/yarv/instructions.rb', line 3105

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

#call(vm) ⇒ Object



3125
3126
3127
# File 'lib/syntax_tree/yarv/instructions.rb', line 3125

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

#canonicalObject



3121
3122
3123
# File 'lib/syntax_tree/yarv/instructions.rb', line 3121

def canonical
  Send.new(calldata, nil)
end

#deconstruct_keys(_keys) ⇒ Object



3101
3102
3103
# File 'lib/syntax_tree/yarv/instructions.rb', line 3101

def deconstruct_keys(_keys)
  { calldata: calldata }
end

#disasm(fmt) ⇒ Object



3093
3094
3095
# File 'lib/syntax_tree/yarv/instructions.rb', line 3093

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

#lengthObject



3109
3110
3111
# File 'lib/syntax_tree/yarv/instructions.rb', line 3109

def length
  2
end

#popsObject



3113
3114
3115
# File 'lib/syntax_tree/yarv/instructions.rb', line 3113

def pops
  2
end

#pushesObject



3117
3118
3119
# File 'lib/syntax_tree/yarv/instructions.rb', line 3117

def pushes
  1
end

#to_a(_iseq) ⇒ Object



3097
3098
3099
# File 'lib/syntax_tree/yarv/instructions.rb', line 3097

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