some cleaning of scratches
This commit is contained in:
parent
efeb910843
commit
58298ab62b
@ -70,6 +70,26 @@ module Ast
|
|||||||
r = right.compile(frame , method)
|
r = right.compile(frame , method)
|
||||||
frame.compile_set( method , left.name , r )
|
frame.compile_set( method , left.name , r )
|
||||||
end
|
end
|
||||||
|
def old_scratch
|
||||||
|
if operator == "=" # assignment, value based
|
||||||
|
if(left.is_a? VariableExpression)
|
||||||
|
left.make_setter
|
||||||
|
l_val = left.compile(context)
|
||||||
|
elsif left.is_a?(NameExpression)
|
||||||
|
puts context.inspect unless context.locals
|
||||||
|
l_val = context.locals[left.name]
|
||||||
|
if( l_val ) #variable existed, move data there
|
||||||
|
l_val = l_val.move( into , r_val)
|
||||||
|
else
|
||||||
|
l_val = context.function.new_local.move( into , r_val )
|
||||||
|
end
|
||||||
|
context.locals[left.name] = l_val
|
||||||
|
else
|
||||||
|
raise "Can only assign variables, not #{left}"
|
||||||
|
end
|
||||||
|
return l_val
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class VariableExpression < NameExpression
|
class VariableExpression < NameExpression
|
||||||
|
@ -26,41 +26,5 @@ module Ast
|
|||||||
#TODO should return the union of the true and false types
|
#TODO should return the union of the true and false types
|
||||||
last
|
last
|
||||||
end
|
end
|
||||||
def old
|
|
||||||
f = context.function
|
|
||||||
# to execute the logic as the if states it, the blocks are the other way around
|
|
||||||
# so we can the jump over the else if true ,and the else joins unconditionally after the true_block
|
|
||||||
merge_block = f.new_block "if_merge"
|
|
||||||
true_block = f.new_block "if_true"
|
|
||||||
false_block = f.new_block "if_false"
|
|
||||||
|
|
||||||
puts "compiling if condition #{cond}"
|
|
||||||
cond_val = cond.compile(context)
|
|
||||||
unless cond_val.is_a? Virtual::BranchCondition
|
|
||||||
cond_val = cond_val.is_true? f
|
|
||||||
end
|
|
||||||
f.b true_block , condition_code: cond_val.operator
|
|
||||||
f.insertion_point.branch = true_block
|
|
||||||
|
|
||||||
f.insert_at false_block
|
|
||||||
if_false.each do |part|
|
|
||||||
puts "compiling in if false #{part}"
|
|
||||||
last = part.compile(context )
|
|
||||||
end
|
|
||||||
f.b merge_block
|
|
||||||
f.insertion_point.branch = false_block
|
|
||||||
|
|
||||||
f.insert_at true_block
|
|
||||||
last = nil
|
|
||||||
if_true.each do |part|
|
|
||||||
puts "compiling in if true #{part}"
|
|
||||||
last = part.compile(context )
|
|
||||||
end
|
|
||||||
|
|
||||||
puts "compiled if: end"
|
|
||||||
f.insert_at merge_block
|
|
||||||
|
|
||||||
return last
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -5,57 +5,5 @@ module Ast
|
|||||||
call = CallSiteExpression.new( operator , [right] , left )
|
call = CallSiteExpression.new( operator , [right] , left )
|
||||||
call.compile(frame , method)
|
call.compile(frame , method)
|
||||||
end
|
end
|
||||||
|
|
||||||
def scratch
|
|
||||||
into = context.function
|
|
||||||
puts "compiling operator #{to_s}"
|
|
||||||
r_val = right.compile(context)
|
|
||||||
#puts "compiled right #{r_val.inspect}"
|
|
||||||
if operator == "=" # assignment, value based
|
|
||||||
if(left.is_a? VariableExpression)
|
|
||||||
left.make_setter
|
|
||||||
l_val = left.compile(context)
|
|
||||||
elsif left.is_a?(NameExpression)
|
|
||||||
puts context.inspect unless context.locals
|
|
||||||
l_val = context.locals[left.name]
|
|
||||||
if( l_val ) #variable existed, move data there
|
|
||||||
l_val = l_val.move( into , r_val)
|
|
||||||
else
|
|
||||||
l_val = context.function.new_local.move( into , r_val )
|
|
||||||
end
|
|
||||||
context.locals[left.name] = l_val
|
|
||||||
else
|
|
||||||
raise "Can only assign variables, not #{left}"
|
|
||||||
end
|
|
||||||
return l_val
|
|
||||||
end
|
|
||||||
|
|
||||||
l_val = left.compile(context)
|
|
||||||
case operator
|
|
||||||
when ">"
|
|
||||||
code = l_val.greater_than into , r_val
|
|
||||||
when "<"
|
|
||||||
code = l_val.less_than into , r_val
|
|
||||||
when ">="
|
|
||||||
code = l_val.greater_or_equal into , r_val
|
|
||||||
when "<="
|
|
||||||
code = l_val.less_or_equal into , r_val
|
|
||||||
when "=="
|
|
||||||
code = l_val.equals into , r_val
|
|
||||||
when "+"
|
|
||||||
res = context.function.new_local
|
|
||||||
into.add res , l_val , r_val
|
|
||||||
code = res
|
|
||||||
when "-"
|
|
||||||
res = context.function.new_local
|
|
||||||
code = res.minus into , l_val , r_val
|
|
||||||
when "<<"
|
|
||||||
res = context.function.new_local
|
|
||||||
code = res.left_shift into , l_val , r_val
|
|
||||||
else
|
|
||||||
raise "unimplemented operator #{operator} #{self}"
|
|
||||||
end
|
|
||||||
code
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
Loading…
Reference in New Issue
Block a user