diff --git a/lib/elf/object_writer.rb b/lib/elf/object_writer.rb index 668771b1..0b850859 100644 --- a/lib/elf/object_writer.rb +++ b/lib/elf/object_writer.rb @@ -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 diff --git a/lib/parfait/space.rb b/lib/parfait/space.rb index 07975253..1611c707 100644 --- a/lib/parfait/space.rb +++ b/lib/parfait/space.rb @@ -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] diff --git a/lib/parfait/typed_method.rb b/lib/parfait/typed_method.rb index 588adad9..6baf164d 100644 --- a/lib/parfait/typed_method.rb +++ b/lib/parfait/typed_method.rb @@ -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 diff --git a/lib/risc/boot.rb b/lib/risc/boot.rb index 62c7c3b4..787c24aa 100644 --- a/lib/risc/boot.rb +++ b/lib/risc/boot.rb @@ -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 diff --git a/lib/risc/interpreter.rb b/lib/risc/interpreter.rb index babd86ae..8147f0e2 100644 --- a/lib/risc/interpreter.rb +++ b/lib/risc/interpreter.rb @@ -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 diff --git a/test/mom/helper.rb b/test/mom/helper.rb index 99151dad..6d4862e7 100644 --- a/test/mom/helper.rb +++ b/test/mom/helper.rb @@ -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