compiler test back up
This commit is contained in:
@ -13,26 +13,26 @@ module Bosl
|
||||
|
||||
# attr_reader :value
|
||||
def on_int expression
|
||||
int = *expression
|
||||
to = Virtual::Return.new(Integer , int)
|
||||
int = expression.first
|
||||
to = Virtual::Return.new(Virtual::Integer , int)
|
||||
method.source.add_code Virtual::Set.new( int , to )
|
||||
to
|
||||
end
|
||||
|
||||
def on_true expression
|
||||
to = Virtual::Return.new(Reference , true )
|
||||
to = Virtual::Return.new(Virtual::Reference , true )
|
||||
method.source.add_code Virtual::Set.new( true , to )
|
||||
to
|
||||
end
|
||||
|
||||
def on_false expression
|
||||
to = Virtual::Return.new(Reference , false)
|
||||
to = Virtual::Return.new(Virtual::Reference , false)
|
||||
method.source.add_code Virtual::Set.new( false , to )
|
||||
to
|
||||
end
|
||||
|
||||
def on_nil expression
|
||||
to = Virtual::Return.new(Reference , nil)
|
||||
to = Virtual::Return.new(Virtual::Reference , nil)
|
||||
method.source.add_code Virtual::Set.new( nil , to )
|
||||
to
|
||||
end
|
||||
@ -40,7 +40,7 @@ module Bosl
|
||||
def on_modulename expression
|
||||
clazz = Parfait::Space.object_space.get_class_by_name expression.name
|
||||
raise "compile_modulename #{clazz}.#{name}" unless clazz
|
||||
to = Virtual::Return.new(Reference , clazz )
|
||||
to = Virtual::Return.new(Virtual::Reference , clazz )
|
||||
method.source.add_code Virtual::Set.new( clazz , to )
|
||||
to
|
||||
end
|
||||
|
@ -3,20 +3,25 @@ module Bosl
|
||||
# function attr_reader :name, :params, :body , :receiver
|
||||
def on_function expression
|
||||
# puts expression.inspect
|
||||
return_type , name , parameters, kids = *expression
|
||||
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
|
||||
p[2]
|
||||
end
|
||||
|
||||
if expression[:receiver]
|
||||
if receiver
|
||||
# compiler will always return slot. with known value or not
|
||||
r = process(expression.receiver )
|
||||
if( r.value.is_a? Parfait::Class )
|
||||
r = receiver.first
|
||||
if( r.is_a? Parfait::Class )
|
||||
class_name = r.value.name
|
||||
else
|
||||
raise "unimplemented case in function #{r}"
|
||||
if( r != :self)
|
||||
raise "unimplemented case in function #{r}"
|
||||
else
|
||||
r = Virtual::Self.new()
|
||||
class_name = method.for_class.name
|
||||
end
|
||||
end
|
||||
else
|
||||
r = Virtual::Self.new()
|
||||
|
@ -20,12 +20,12 @@ module Bosl
|
||||
|
||||
# compile the true block (as we think of it first, even it is second in sequential order)
|
||||
method.source.current true_block
|
||||
last = is
|
||||
|
||||
last = process_all(if_true).last
|
||||
|
||||
# compile the false block
|
||||
method.source.current false_block
|
||||
last = process_all(if_false).last
|
||||
last = process_all(if_false).last if if_false
|
||||
method.source.add_code Virtual::UnconditionalBranch.new( merge_block )
|
||||
|
||||
#puts "compiled if: end"
|
||||
|
@ -2,7 +2,7 @@ module Bosl
|
||||
Compiler.class_eval do
|
||||
|
||||
def on_while expression
|
||||
puts expression.inspect
|
||||
#puts expression.inspect
|
||||
condition , expressions = *expression
|
||||
condition = condition.first
|
||||
|
||||
|
Reference in New Issue
Block a user