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.



1071
1072
1073
1074
# File 'lib/syntax_tree/yarv/instructions.rb', line 1071

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.



1069
1070
1071
# File 'lib/syntax_tree/yarv/instructions.rb', line 1069

def method_iseq
  @method_iseq
end

#method_nameObject (readonly)

Returns the value of attribute method_name.



1069
1070
1071
# File 'lib/syntax_tree/yarv/instructions.rb', line 1069

def method_name
  @method_name
end

Instance Method Details

#==(other) ⇒ Object



1092
1093
1094
1095
# File 'lib/syntax_tree/yarv/instructions.rb', line 1092

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

#call(vm) ⇒ Object



1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
# File 'lib/syntax_tree/yarv/instructions.rb', line 1101

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



1088
1089
1090
# File 'lib/syntax_tree/yarv/instructions.rb', line 1088

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

#disasm(fmt) ⇒ Object



1076
1077
1078
1079
1080
1081
1082
# File 'lib/syntax_tree/yarv/instructions.rb', line 1076

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

#lengthObject



1097
1098
1099
# File 'lib/syntax_tree/yarv/instructions.rb', line 1097

def length
  3
end

#to_a(_iseq) ⇒ Object



1084
1085
1086
# File 'lib/syntax_tree/yarv/instructions.rb', line 1084

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