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:
parent
dd544214b3
commit
4ac89ece66
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user