From 6a4c90e2bd680e7c240ebcbe8af689dc50f6d17c Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 2 Jul 2018 15:51:50 +0300 Subject: [PATCH] fix the cpu_init for linker cpu_init still translates from risc_init but since interpreter is a platform risc_init is a private thing and the cpu_init does not need to be lazily created, so it's done in the init --- lib/risc/linker.rb | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/risc/linker.rb b/lib/risc/linker.rb index ec0c1eda..a3e0eccc 100644 --- a/lib/risc/linker.rb +++ b/lib/risc/linker.rb @@ -21,11 +21,11 @@ module Risc raise "Platform must be platform, not #{platform.class}" unless platform.is_a?(Platform) @platform = platform @assemblers = assemblers - @risc_init = nil @constants = [] + @cpu_init = cpu_init_init end - attr_reader :constants , :cpu_init + attr_reader :constants attr_reader :platform , :assemblers # machine keeps a list of all objects and their positions. @@ -35,11 +35,6 @@ module Risc Position.positions end - # lazy init risc_init - def risc_init - @risc_init ||= Branch.new( "__initial_branch__" , Parfait.object_space.get_init.risc_instructions ) - end - # To create binaries, objects (and labels) need to have a position # (so objects can be loaded and branches know where to jump) # @@ -51,7 +46,7 @@ module Risc # in place and we don't have to deal with changing loading code def position_all #need the initial jump at 0 and then functions - #TODO Position.new(cpu_init).set(0) + Position.new(@cpu_init).set(0) code_start = position_objects( @platform.padding ) # and then everything code position_code(code_start) @@ -104,11 +99,12 @@ module Risc def create_binary prerun assemble - log.debug "BinaryInit #{cpu_init.object_id.to_s(16)}" + log.debug "BinaryInit #{@cpu_init.object_id.to_s(16)}" end def prerun assemblers.each do |asm| + puts "method #{asm.method.name}" asm.instructions.each {|i| i.precheck } end end @@ -120,6 +116,16 @@ module Risc end end + private + # cpu_init come from translating the risc_init + # risc_init is a branch to the __init__ method + # + def cpu_init_init + init = assemblers.find {|asm| asm.method.name == :__init__} + risc_init = Branch.new( "__initial_branch__" , init.method.binary ) + @platform.translator.translate(risc_init) + end + end # module method to reset, and init