Torsten Rüger
5a43cbff15
previous commit affected rather many test, as the implicit returns add extra instructions Also added some explicit returns, so as not to test the return logic too much. return (ie return nl) is a knonwn 3 risc operation.
80 lines
2.1 KiB
Ruby
80 lines
2.1 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
|
|
|
|
def as_test_main_block( block_input = "return 5", method_input = "main_local = 5")
|
|
as_test_main("#{method_input} ; self.main{|val| #{block_input}}")
|
|
end
|
|
|
|
end
|
|
module VoolCompile
|
|
include ScopeHelper
|
|
include Mom
|
|
|
|
def compile_first_method( input )
|
|
input = as_test_main( input )
|
|
collection = RubyX::RubyXCompiler.new(RubyX.default_test_options).ruby_to_mom(input)
|
|
assert collection.is_a?(Mom::MomCollection) , collection.class.name
|
|
compiler = collection.compilers.first
|
|
assert compiler.is_a?(Mom::MethodCompiler)
|
|
assert_equal Mom::MethodCompiler , compiler.class
|
|
compiler
|
|
end
|
|
def compile_first_block( block_input , method_input = "main_local = 5")
|
|
source = as_test_main("#{method_input} ; self.main{|val| #{block_input}}")
|
|
mom_col = RubyX::RubyXCompiler.new(RubyX.default_test_options).ruby_to_mom( source )
|
|
compiler = mom_col.method_compilers.find{|c| c.get_method.name.to_s.start_with?("main") }
|
|
block = compiler.block_compilers.first
|
|
assert block
|
|
block.mom_instructions.next
|
|
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
|
|
|
|
module MomCompile
|
|
include ScopeHelper
|
|
|
|
def compile_mom(input)
|
|
RubyX::RubyXCompiler.new(RubyX.default_test_options).ruby_to_mom(input)
|
|
end
|
|
|
|
end
|