keep risc and cpu instructions separate in method
that overwriting was a bit of thorn
This commit is contained in:
parent
a50368c3aa
commit
3090ccffea
@ -26,7 +26,7 @@ module Elf
|
||||
# for debug add labels for labels
|
||||
Parfait.object_space.each_type do |type|
|
||||
type.methods.each do |f|
|
||||
f.instructions.each_label do |label|
|
||||
f.risc_instructions.each_label do |label|
|
||||
add_symbol "#{type.name}::#{f.name}:#{label.name}" , Positioned.position(label)
|
||||
end
|
||||
end
|
||||
|
@ -15,7 +15,7 @@ module Parfait
|
||||
end
|
||||
|
||||
# TODO Must get rid of the setter (move the boot process ?)
|
||||
def self.set_object_space space
|
||||
def self.set_object_space( space )
|
||||
@@object_space = space
|
||||
end
|
||||
|
||||
@ -31,7 +31,7 @@ module Parfait
|
||||
|
||||
class Space < Object
|
||||
|
||||
def initialize(classes )
|
||||
def initialize( classes )
|
||||
@classes = classes
|
||||
@types = Dictionary.new
|
||||
message = Message.new(nil)
|
||||
@ -54,7 +54,7 @@ module Parfait
|
||||
end
|
||||
end
|
||||
|
||||
def add_type(type)
|
||||
def add_type( type )
|
||||
hash = type.hash
|
||||
raise "upps #{hash} #{hash.class}" unless hash.is_a?(Fixnum)
|
||||
was = @types[hash]
|
||||
|
@ -21,7 +21,8 @@ module Parfait
|
||||
|
||||
class TypedMethod < Object
|
||||
|
||||
attr_reader :name , :instructions , :for_type ,:arguments , :frame , :binary
|
||||
attr_reader :name , :risc_instructions , :for_type , :cpu_instructions
|
||||
attr_reader :arguments , :frame , :binary
|
||||
|
||||
# not part of the parfait model, hence ruby accessor
|
||||
attr_accessor :source
|
||||
@ -35,19 +36,32 @@ module Parfait
|
||||
init(arguments, frame)
|
||||
end
|
||||
|
||||
# (re) init with given args and frame types
|
||||
# also set first risc_instruction to a label
|
||||
def init(arguments, frame)
|
||||
raise "Wrong argument type, expect Type not #{arguments.class}" unless arguments.is_a? Type
|
||||
raise "Wrong frame type, expect Type not #{frame.class}" unless frame.is_a? Type
|
||||
@arguments = arguments
|
||||
@frame = frame
|
||||
source = "_init_method"
|
||||
name = "#{@for_type.name}.#{@name}"
|
||||
@risc_instructions = Risc.label(source, name)
|
||||
@risc_instructions << Risc.label( source, "unreachable")
|
||||
end
|
||||
|
||||
def set_instructions(inst)
|
||||
@instructions = inst
|
||||
def translate_cpu(translator)
|
||||
@cpu_instructions = translator.translate(@risc_instructions)
|
||||
nekst = @risc_instructions.next
|
||||
while(nekst)
|
||||
cpu = nekst.to_cpu(translator) # returning nil means no replace
|
||||
@cpu_instructions << cpu if cpu
|
||||
nekst = nekst.next
|
||||
end
|
||||
@cpu_instructions
|
||||
end
|
||||
|
||||
def create_binary
|
||||
total = @instructions.total_byte_length / 4 + 1
|
||||
total = @cpu_instructions.total_byte_length / 4 + 1
|
||||
@binary = BinaryCode.new( total )
|
||||
end
|
||||
|
||||
|
@ -149,9 +149,9 @@ module Risc
|
||||
super_class_name: :Word , instance_names: :List },
|
||||
Dictionary: {keys: :List , values: :List } ,
|
||||
CacheEntry: {cached_type: :Type , cached_method: :TypedMethod } ,
|
||||
TypedMethod: {name: :Word, source: :Object, instructions: :Object,
|
||||
binary: :BinaryCode, arguments: :Type , for_type: :Type,
|
||||
frame: :Type } ,
|
||||
TypedMethod: {name: :Word, source: :Object, risc_instructions: :Object,
|
||||
cpu_instructions: :Object, binary: :BinaryCode,
|
||||
arguments: :Type , for_type: :Type, frame: :Type } ,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -43,7 +43,7 @@ module Risc
|
||||
def start( instruction )
|
||||
initialize
|
||||
set_state(:running)
|
||||
set_instruction instruction
|
||||
set_instruction( instruction )
|
||||
end
|
||||
|
||||
def set_state( state )
|
||||
@ -54,7 +54,7 @@ module Risc
|
||||
end
|
||||
|
||||
def set_instruction( i )
|
||||
raise "set to same instruction #{i}" if @instruction == i
|
||||
raise "set to same instruction #{i}:#{i.class}" if @instruction == i
|
||||
old = @instruction
|
||||
@instruction = i
|
||||
trigger(:instruction_changed, old , i)
|
||||
@ -195,7 +195,7 @@ module Risc
|
||||
end
|
||||
|
||||
def execute_FunctionCall
|
||||
set_instruction @instruction.method.instructions
|
||||
set_instruction @instruction.method.risc_instructions
|
||||
false
|
||||
end
|
||||
|
||||
|
@ -30,7 +30,7 @@ module Risc
|
||||
assert @expect , "No output given"
|
||||
Vool::VoolCompiler.ruby_to_vool "class Test; def main(arg);#{@input};end;end"
|
||||
test = Parfait.object_space.get_class_by_name :Test
|
||||
test.instance_type.get_method( :main).instructions
|
||||
test.instance_type.get_method( :main).risc_instructions
|
||||
end
|
||||
def check_nil
|
||||
produced = produce_instructions
|
||||
|
Loading…
Reference in New Issue
Block a user