finish typing variables

This commit is contained in:
Torsten Ruger
2015-09-27 16:06:48 +03:00
parent 26c6db17b1
commit 252c0ccdca
12 changed files with 81 additions and 40 deletions

View File

@ -2,12 +2,12 @@ module Bosl
Compiler.class_eval do
def on_class_field expression
puts expression.inspect
#puts expression.inspect
type , name , value = *expression
for_class = self.method.for_class
index = for_class.object_layout.variable_index(name)
raise "class field already defined:#{name} for class #{for_class.name}" if index
#raise "class field already defined:#{name} for class #{for_class.name}" if index
puts "Define field #{name} on class #{for_class.name}"
index = for_class.object_layout.add_instance_variable( name ) #TODO need typing

View File

@ -2,16 +2,16 @@ module Bosl
Compiler.class_eval do
def on_field_def expression
# puts expression.inspect
#puts expression.inspect
type , name , value = *expression
index = method.ensure_local( name )
index = method.ensure_local( name , type )
if value
value = process( value )
end
Virtual::Return.new( value )
Virtual::Return.new( type , value )
end
end
end

View File

@ -2,12 +2,12 @@ module Bosl
Compiler.class_eval do
# function attr_reader :name, :params, :body , :receiver
def on_function expression
# puts expression.inspect
#puts expression.inspect
return_type , name , parameters, kids , receiver = *expression
name = name.to_a.first
args = parameters.to_a.collect do |p|
raise "error, argument must be a identifier, not #{p}" unless p.type == :parameter
Parfait::Variable.new( p.first , p[1])
Parfait::Variable.new( *p)
end
if receiver

View File

@ -13,8 +13,12 @@ module Bosl
if( index = method.has_arg(name))
method.source.add_code Virtual::Set.new( Virtual::ArgSlot.new(index,:int ) , ret)
else # or a local so it is in the frame
index = method.ensure_local( name )
method.source.add_code Virtual::Set.new(Virtual::FrameSlot.new(index,:int ) , ret )
index = method.has_local( name )
if(index)
method.source.add_code Virtual::Set.new(Virtual::FrameSlot.new(index,:int ) , ret )
else
raise "must define variable #{name} before using it"
end
end
return ret
end

View File

@ -10,8 +10,17 @@ module Bosl
name , value = *expression
name = name.to_a.first
v = process(value)
index = method.ensure_local( name )
method.source.add_code Virtual::Set.new(Virtual::FrameSlot.new(:int,index ) , v )
index = method.has_local( name )
if(index)
method.source.add_code Virtual::Set.new(Virtual::FrameSlot.new(:int,index ) , v )
else
index = method.has_arg( name )
if(index)
method.source.add_code Virtual::Set.new(Virtual::ArgSlot.new(:int,index ) , v )
else
raise "must define variable #{name} before using it in #{@method.inspect}"
end
end
end
end