slight cleanup and rename test case
This commit is contained in:
parent
7d05b7c42f
commit
a859951a8f
@ -10,7 +10,8 @@ module Ast
|
|||||||
puts "compiling receiver #{receiver} (call #{name})"
|
puts "compiling receiver #{receiver} (call #{name})"
|
||||||
if receiver.is_a? ModuleName
|
if receiver.is_a? ModuleName
|
||||||
clazz = context.object_space.get_or_create_class receiver.name
|
clazz = context.object_space.get_or_create_class receiver.name
|
||||||
function = clazz.resolve_function name
|
value_receiver = clazz.meta_class
|
||||||
|
function = value_receiver.resolve_function name
|
||||||
elsif receiver.is_a?(StringExpression) or receiver.is_a?(IntegerExpression)
|
elsif receiver.is_a?(StringExpression) or receiver.is_a?(IntegerExpression)
|
||||||
#TODO obviously the class is wrong, but you gotta start somewhere
|
#TODO obviously the class is wrong, but you gotta start somewhere
|
||||||
clazz = context.object_space.get_or_create_class :Object
|
clazz = context.object_space.get_or_create_class :Object
|
||||||
|
@ -78,7 +78,7 @@ module Vm
|
|||||||
def new_local type = Vm::Integer
|
def new_local type = Vm::Integer
|
||||||
register = args.length + 3 + @locals.length # three for the receiver, return and type regs
|
register = args.length + 3 + @locals.length # three for the receiver, return and type regs
|
||||||
l = type.new(register) #so start at r3
|
l = type.new(register) #so start at r3
|
||||||
puts "new local #{l.register_symbol}"
|
#puts "new local #{l.register_symbol}"
|
||||||
raise "Register overflow in function #{name}" if register >= 13 # yep, 13 is bad luck
|
raise "Register overflow in function #{name}" if register >= 13 # yep, 13 is bad luck
|
||||||
@locals << l
|
@locals << l
|
||||||
l
|
l
|
||||||
|
@ -131,7 +131,7 @@ module Vm
|
|||||||
def assigns
|
def assigns
|
||||||
[@result.register]
|
[@result.register]
|
||||||
end
|
end
|
||||||
def to_asm
|
def to_s
|
||||||
"#{opcode} #{result.to_asm} , #{left.to_asm} , #{right.to_asm} #{super}"
|
"#{opcode} #{result.to_asm} , #{left.to_asm} , #{right.to_asm} #{super}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -149,6 +149,9 @@ module Vm
|
|||||||
def assigns
|
def assigns
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
def to_s
|
||||||
|
"#{opcode} #{@left.to_asm} , #{@right.to_asm} #{super}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
class MoveInstruction < Instruction
|
class MoveInstruction < Instruction
|
||||||
def initialize to , from , options = {}
|
def initialize to , from , options = {}
|
||||||
@ -196,5 +199,8 @@ module Vm
|
|||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
def to_s
|
||||||
|
"#{opcode} #{@first.to_asm} #{super}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -34,7 +34,7 @@ module Vm
|
|||||||
# small todo. This does not catch condition_code that are not :al
|
# small todo. This does not catch condition_code that are not :al
|
||||||
next if (n.attributes.length > 3) or (kode.attributes.length > 3)
|
next if (n.attributes.length > 3) or (kode.attributes.length > 3)
|
||||||
if kode.result == n.from
|
if kode.result == n.from
|
||||||
puts "Logic #{kode} goes #{n}"
|
puts "Logic reduction #{kode} removes #{n}"
|
||||||
kode.result = n.to
|
kode.result = n.to
|
||||||
block.codes.delete(n)
|
block.codes.delete(n)
|
||||||
end
|
end
|
||||||
@ -56,7 +56,7 @@ module Vm
|
|||||||
# small todo. This does not catch condition_code that are not :al
|
# small todo. This does not catch condition_code that are not :al
|
||||||
next if (n.attributes.length > 3) or (kode.attributes.length > 3)
|
next if (n.attributes.length > 3) or (kode.attributes.length > 3)
|
||||||
if kode.to == n.from
|
if kode.to == n.from
|
||||||
puts "Move #{kode} goes #{n} "
|
puts "Move reduction #{kode}: removes #{n} "
|
||||||
kode.to = n.to
|
kode.to = n.to
|
||||||
block.codes.delete(n)
|
block.codes.delete(n)
|
||||||
end
|
end
|
||||||
@ -94,7 +94,7 @@ module Vm
|
|||||||
locals = block.function.locals_at block
|
locals = block.function.locals_at block
|
||||||
pop = block.next.codes.first
|
pop = block.next.codes.first
|
||||||
if(locals.empty?)
|
if(locals.empty?)
|
||||||
puts "Empty #{block.name}"
|
#puts "Empty #{block.name}"
|
||||||
block.codes.delete(push)
|
block.codes.delete(push)
|
||||||
block.next.codes.delete(pop)
|
block.next.codes.delete(pop)
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user