Class: SyntaxTree::YARV::DefineMethod

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

Overview

### Summary

‘definemethod` defines a method on the class of the current value of `self`. It accepts two arguments. The first is the name of the method being defined. The second is the instruction sequence representing the body of the method.

### Usage

~~~ruby def value = “value” ~~~

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Instruction

#branch_targets, #canonical, #falls_through?, #leaves?, #pops, #pushes, #side_effects?

Constructor Details

#initialize(method_name, method_iseq) ⇒ DefineMethod

Returns a new instance of DefineMethod.



1124
1125
1126
1127
# File 'lib/syntax_tree/yarv/instructions.rb', line 1124

def initialize(method_name, method_iseq)
  @method_name = method_name
  @method_iseq = method_iseq
end

Instance Attribute Details

#method_iseqObject (readonly)

Returns the value of attribute method_iseq.



1122
1123
1124
# File 'lib/syntax_tree/yarv/instructions.rb', line 1122

def method_iseq
  @method_iseq
end

#method_nameObject (readonly)

Returns the value of attribute method_name.



1122
1123
1124
# File 'lib/syntax_tree/yarv/instructions.rb', line 1122

def method_name
  @method_name
end

Instance Method Details

#==(other) ⇒ Object



1145
1146
1147
1148
# File 'lib/syntax_tree/yarv/instructions.rb', line 1145

def ==(other)
  other.is_a?(DefineMethod) && other.method_name == method_name &&
    other.method_iseq == method_iseq
end

#call(vm) ⇒ Object



1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
# File 'lib/syntax_tree/yarv/instructions.rb', line 1154

def call(vm)
  name = method_name
  nesting = vm.frame.nesting
  iseq = method_iseq

  vm
    .frame
    ._self
    .__send__(:define_method, name) do |*args, **kwargs, &block|
      vm.run_method_frame(
        name,
        nesting,
        iseq,
        self,
        *args,
        **kwargs,
        &block
      )
    end
end

#deconstruct_keys(_keys) ⇒ Object



1141
1142
1143
# File 'lib/syntax_tree/yarv/instructions.rb', line 1141

def deconstruct_keys(_keys)
  { method_name: method_name, method_iseq: method_iseq }
end

#disasm(fmt) ⇒ Object



1129
1130
1131
1132
1133
1134
1135
# File 'lib/syntax_tree/yarv/instructions.rb', line 1129

def disasm(fmt)
  fmt.enqueue(method_iseq)
  fmt.instruction(
    "definemethod",
    [fmt.object(method_name), method_iseq.name]
  )
end

#lengthObject



1150
1151
1152
# File 'lib/syntax_tree/yarv/instructions.rb', line 1150

def length
  3
end

#to_a(_iseq) ⇒ Object



1137
1138
1139
# File 'lib/syntax_tree/yarv/instructions.rb', line 1137

def to_a(_iseq)
  [:definemethod, method_name, method_iseq.to_a]
end