start delegating scope matters to the compiler(s)

slot_type_for to return the slot way to access variable
this is off course version 0.0.1 alpha, no types are checked or errors handled
This commit is contained in:
Torsten Ruger 2018-07-09 17:53:56 +03:00
parent dd544214b3
commit 4ac89ece66
3 changed files with 38 additions and 6 deletions

View File

@ -17,5 +17,23 @@ module Risc
@constants = [] @constants = []
end end
# determine how given name need to be accsessed.
# For blocks the options are args or frame
# or then the methods arg or frame
def slot_type_for(name)
if @block.arguments_type.variable_index(name)
slot_def = [ :arguments]
elsif @block.frame_type.variable_index(name)
slot_def = [:frame]
elsif @method.arguments_type.variable_index(name)
slot_def = [:caller , :arguments ]
elsif @method.arguments_type.variable_index(name)
slot_def = [:caller , :frame ]
elsif
raise "no variable #{name} , need to resolve at runtime"
end
slot_def << name
end
end end
end end

View File

@ -47,10 +47,28 @@ module Risc
self.new(method) self.new(method)
end end
# determine how given name need to be accsessed.
# For methods the options are args or frame
def slot_type_for(name)
if @method.arguments_type.variable_index(name)
type = :arguments
else
type = :frame
end
[type , name]
end
def add_block_compiler(compiler) def add_block_compiler(compiler)
@block_compilers << compiler @block_compilers << compiler
end end
# return true or false if the given name is in scope (arg/local)
def in_scope?(name)
ret = true if @method.arguments_type.variable_index(name)
ret = @method.frame_type.variable_index(name) unless ret
ret
end
# convert the given mom instruction to_risc and then add it (see add_code) # convert the given mom instruction to_risc and then add it (see add_code)
# continue down the instruction chain unti depleted # continue down the instruction chain unti depleted
# (adding moves the insertion point so the whole mom chain is added as a risc chain) # (adding moves the insertion point so the whole mom chain is added as a risc chain)

View File

@ -3,12 +3,8 @@ module Vool
class LocalAssignment < Assignment class LocalAssignment < Assignment
def to_mom( compiler ) def to_mom( compiler )
if compiler.method.arguments_type.variable_index(@name) slot_def = compiler.slot_type_for(@name)
type = :arguments to = Mom::SlotDefinition.new(:message ,slot_def)
else
type = :frame
end
to = Mom::SlotDefinition.new(:message ,[ type , @name])
from = @value.slot_definition(compiler) from = @value.slot_definition(compiler)
return chain_assign( Mom::SlotLoad.new(to,from) , compiler) return chain_assign( Mom::SlotLoad.new(to,from) , compiler)
end end