Class: SyntaxTree::YARV::DefineMethod

Inherits:
Object
  • Object
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

Constructor Details

#initialize(method_name, method_iseq) ⇒ DefineMethod

Returns a new instance of DefineMethod.



1075
1076
1077
1078
# File 'lib/syntax_tree/yarv/instructions.rb', line 1075

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.



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

def method_iseq
  @method_iseq
end

#method_nameObject (readonly)

Returns the value of attribute method_name.



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

def method_name
  @method_name
end

Instance Method Details

#==(other) ⇒ Object



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

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

#call(vm) ⇒ Object



1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
# File 'lib/syntax_tree/yarv/instructions.rb', line 1117

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

#canonicalObject



1113
1114
1115
# File 'lib/syntax_tree/yarv/instructions.rb', line 1113

def canonical
  self
end

#deconstruct_keys(_keys) ⇒ Object



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

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

#disasm(fmt) ⇒ Object



1080
1081
1082
1083
1084
1085
1086
# File 'lib/syntax_tree/yarv/instructions.rb', line 1080

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

#lengthObject



1101
1102
1103
# File 'lib/syntax_tree/yarv/instructions.rb', line 1101

def length
  3
end

#popsObject



1105
1106
1107
# File 'lib/syntax_tree/yarv/instructions.rb', line 1105

def pops
  0
end

#pushesObject



1109
1110
1111
# File 'lib/syntax_tree/yarv/instructions.rb', line 1109

def pushes
  0
end

#to_a(_iseq) ⇒ Object



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

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