8a81d41d5e
Also pass the source into the compile method. This way compiler can be reused for subsequent compile. Does remove some double boots, but no major time save
105 lines
2.8 KiB
Ruby
105 lines
2.8 KiB
Ruby
|
|
module ScopeHelper
|
|
|
|
def in_Test(statements)
|
|
"class Test ; #{statements} ; end"
|
|
end
|
|
|
|
def in_Space(statements)
|
|
"class Space ; #{statements} ; end"
|
|
end
|
|
|
|
def as_main(statements)
|
|
in_Space("def main(arg) ; #{statements}; end")
|
|
end
|
|
|
|
def as_test_main( statements )
|
|
in_Test("def main(arg) ; #{statements}; end")
|
|
end
|
|
end
|
|
|
|
module MomCompile
|
|
include ScopeHelper
|
|
|
|
def compile_method(input)
|
|
statements = RubyX::RubyXCompiler.new.ruby_to_vool(input)
|
|
assert statements.is_a?(Vool::ClassStatement)
|
|
ret = statements.to_mom(nil)
|
|
assert_equal Parfait::Class , statements.clazz.class , statements
|
|
@method = statements.clazz.get_method(:main)
|
|
assert_equal Parfait::VoolMethod , @method.class
|
|
ret
|
|
end
|
|
def compile_first_method( input )
|
|
ret = compile_method( as_test_main( input ))
|
|
assert_equal Mom::MomCompiler , ret.class
|
|
compiler = ret.method_compilers.find{|c| c.get_method.name == :main and c.get_method.self_type.object_class.name == :Test}
|
|
assert_equal Risc::MethodCompiler , compiler.class
|
|
@method.source.to_mom( compiler )
|
|
end
|
|
def compile_first_block( block_input , method_input = "main_local = 5")
|
|
source = "#{method_input} ; self.main{|val| #{block_input}}"
|
|
vool = Ruby::RubyCompiler.compile( as_test_main(source) ).to_vool
|
|
mom_c = vool.to_mom(nil)
|
|
compiler = mom_c.method_compilers.find{|c| c.get_method.name == :main and c.get_method.self_type.object_class.name == :Test}
|
|
block = nil
|
|
vool.each {|b| block = b if b.is_a?(Vool::BlockStatement)}
|
|
assert block
|
|
block_c = compiler.block_compilers.first
|
|
assert block_c
|
|
block.body.to_mom(block_c)
|
|
end
|
|
def compile_mom(input)
|
|
RubyX::RubyXCompiler.new.ruby_to_mom(input)
|
|
end
|
|
|
|
def check_array( should , is )
|
|
index = 0
|
|
test = is
|
|
while(test)
|
|
# if we assert here, we get output pointing here. Without stack, not useful
|
|
raise "Wrong class for #{index+1}, #{dump(is)}" if should[index] != test.class
|
|
index += 1
|
|
test = test.next
|
|
end
|
|
assert 1 #just to get an assertion in the output.
|
|
end
|
|
def dump(is)
|
|
res =[]
|
|
while(is)
|
|
res << is.class.name.split("::").last
|
|
is = is.next
|
|
end
|
|
ret = ""
|
|
res.to_s.split(",").each_slice(5).each do |line|
|
|
ret += " " + line.join(",") + " ,\n"
|
|
end
|
|
ret.gsub('"' , '')
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class Ignored
|
|
def == other
|
|
return false unless other.class == self.class
|
|
Sof::Util.attributes(self).each do |a|
|
|
begin
|
|
left = send(a)
|
|
rescue NoMethodError
|
|
next # not using instance variables that are not defined as attr_readers for equality
|
|
end
|
|
begin
|
|
right = other.send(a)
|
|
rescue NoMethodError
|
|
return false
|
|
end
|
|
return false unless left.class == right.class
|
|
return false unless left == right
|
|
end
|
|
return true
|
|
end
|
|
end
|