scaffold for instance variable get implementation
This commit is contained in:
parent
0fcb1c8f68
commit
a63e37fc50
@ -98,7 +98,7 @@ module Ast
|
|||||||
|
|
||||||
class VariableExpression < NameExpression
|
class VariableExpression < NameExpression
|
||||||
def compile method , message
|
def compile method , message
|
||||||
method.add_code Virtual::ObjectGet.new(name)
|
method.add_code Virtual::InstanceGet.new(name)
|
||||||
Virtual::Return.new( Virtual::Mystery )
|
Virtual::Return.new( Virtual::Mystery )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -3,7 +3,6 @@ require_relative "boot_class"
|
|||||||
require "kernel/all"
|
require "kernel/all"
|
||||||
require_relative "object"
|
require_relative "object"
|
||||||
require_relative "string"
|
require_relative "string"
|
||||||
require "virtual/send_implementation"
|
|
||||||
|
|
||||||
module Boot
|
module Boot
|
||||||
# The BootSpace contains all objects for a program. In functional terms it is a program, but in oo
|
# The BootSpace contains all objects for a program. In functional terms it is a program, but in oo
|
||||||
|
14
lib/virtual/get_implementation.rb
Normal file
14
lib/virtual/get_implementation.rb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
module Virtual
|
||||||
|
# This implements the send logic
|
||||||
|
# Send is so complicated that we actually code it in ruby and stick it in
|
||||||
|
# That off course opens up an endless loop possibility that we stop by reducing to Class and Module methods
|
||||||
|
class GetImplementation
|
||||||
|
def run block
|
||||||
|
block.codes.dup.each do |code|
|
||||||
|
next unless code.is_a? InstanceGet
|
||||||
|
raise "Start coding"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Object.space.add_pass_after GetImplementation, SendImplementation
|
||||||
|
end
|
@ -83,7 +83,9 @@ module Virtual
|
|||||||
end
|
end
|
||||||
|
|
||||||
# class for Set instructions, A set is basically a mem move.
|
# class for Set instructions, A set is basically a mem move.
|
||||||
# to and from are indexes into the known objects(frame,message,self and new_message), or from may be a constant
|
# to and from are indexes into the known objects(frame,message,self and new_message), these are represented as slots
|
||||||
|
# (see there)
|
||||||
|
# from may be a Constant (Object,Integer,String,Class)
|
||||||
class Set < Instruction
|
class Set < Instruction
|
||||||
def initialize to , from
|
def initialize to , from
|
||||||
@to = to
|
@to = to
|
||||||
@ -92,7 +94,9 @@ module Virtual
|
|||||||
attr_reader :to , :from
|
attr_reader :to , :from
|
||||||
end
|
end
|
||||||
|
|
||||||
class ObjectGet < Instruction
|
# Get a instance variable by _name_ . So we have to resolve the name to an index to trnsform into a Slot
|
||||||
|
# The slot may the be used in a set on left or right hand. The transformation is done by GetImplementation
|
||||||
|
class InstanceGet < Instruction
|
||||||
def initialize name
|
def initialize name
|
||||||
@name = name.to_sym
|
@name = name.to_sym
|
||||||
end
|
end
|
||||||
|
@ -84,3 +84,5 @@ require_relative "type"
|
|||||||
require_relative "object"
|
require_relative "object"
|
||||||
require_relative "constants"
|
require_relative "constants"
|
||||||
require "boot/boot_space"
|
require "boot/boot_space"
|
||||||
|
require_relative "send_implementation"
|
||||||
|
require_relative "get_implementation"
|
||||||
|
@ -26,3 +26,4 @@ module Virtual
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
require_relative "get_implementation"
|
@ -30,7 +30,7 @@ def String.length(x)
|
|||||||
@length
|
@length
|
||||||
end
|
end
|
||||||
HERE
|
HERE
|
||||||
@output = "---RETURN_MARKER- &7 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :lengthRETURN_MARKER args:RETURN_MARKER - :xRETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: &6 !ruby/object:Boot::BootClassRETURN_MARKER method_definitions:RETURN_MARKER - &2 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :getRETURN_MARKER args:RETURN_MARKER - &1 !ruby/class 'Virtual::Integer'RETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: *1RETURN_MARKER return_type: *1RETURN_MARKER blocks:RETURN_MARKER - &3 !ruby/object:Virtual::BlockRETURN_MARKER method: *2RETURN_MARKER name: :getRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *2RETURN_MARKER name: :get_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *3RETURN_MARKER - &4 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :setRETURN_MARKER args:RETURN_MARKER - *1RETURN_MARKER - *1RETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: *1RETURN_MARKER return_type: *1RETURN_MARKER blocks:RETURN_MARKER - &5 !ruby/object:Virtual::BlockRETURN_MARKER method: *4RETURN_MARKER name: :setRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *4RETURN_MARKER name: :set_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *5RETURN_MARKER name: :StringRETURN_MARKER super_class_name: :ObjectRETURN_MARKER meta_class: !ruby/object:Boot::MetaClassRETURN_MARKER functions: []RETURN_MARKER me_self: *6RETURN_MARKER return_type: !ruby/object:Virtual::ReturnRETURN_MARKER index: 0RETURN_MARKER type: !ruby/class 'Virtual::Mystery'RETURN_MARKER blocks:RETURN_MARKER - &8 !ruby/object:Virtual::BlockRETURN_MARKER method: *7RETURN_MARKER name: :lengthRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::ObjectGetRETURN_MARKER name: :lengthRETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *7RETURN_MARKER name: :length_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *8RETURN_MARKER"
|
@output = "---RETURN_MARKER- &7 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :lengthRETURN_MARKER args:RETURN_MARKER - :xRETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: &6 !ruby/object:Boot::BootClassRETURN_MARKER method_definitions:RETURN_MARKER - &2 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :getRETURN_MARKER args:RETURN_MARKER - &1 !ruby/class 'Virtual::Integer'RETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: *1RETURN_MARKER return_type: *1RETURN_MARKER blocks:RETURN_MARKER - &3 !ruby/object:Virtual::BlockRETURN_MARKER method: *2RETURN_MARKER name: :getRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *2RETURN_MARKER name: :get_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *3RETURN_MARKER - &4 !ruby/object:Virtual::MethodDefinitionRETURN_MARKER name: :setRETURN_MARKER args:RETURN_MARKER - *1RETURN_MARKER - *1RETURN_MARKER locals: []RETURN_MARKER tmps: []RETURN_MARKER receiver: *1RETURN_MARKER return_type: *1RETURN_MARKER blocks:RETURN_MARKER - &5 !ruby/object:Virtual::BlockRETURN_MARKER method: *4RETURN_MARKER name: :setRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *4RETURN_MARKER name: :set_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *5RETURN_MARKER name: :StringRETURN_MARKER super_class_name: :ObjectRETURN_MARKER meta_class: !ruby/object:Boot::MetaClassRETURN_MARKER functions: []RETURN_MARKER me_self: *6RETURN_MARKER return_type: !ruby/object:Virtual::ReturnRETURN_MARKER index: 0RETURN_MARKER type: !ruby/class 'Virtual::Mystery'RETURN_MARKER blocks:RETURN_MARKER - &8 !ruby/object:Virtual::BlockRETURN_MARKER method: *7RETURN_MARKER name: :lengthRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodEnter {}RETURN_MARKER - !ruby/object:Virtual::InstanceGetRETURN_MARKER name: :lengthRETURN_MARKER - !ruby/object:Virtual::BlockRETURN_MARKER method: *7RETURN_MARKER name: :length_returnRETURN_MARKER branch: RETURN_MARKER codes:RETURN_MARKER - !ruby/object:Virtual::MethodReturn {}RETURN_MARKER current: *8RETURN_MARKER"
|
||||||
check
|
check
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user