new function test and scoping fix
This commit is contained in:
parent
1ea34481c1
commit
d8a5dc147b
@ -45,7 +45,8 @@ module Phisol
|
|||||||
raise ret.inspect if ret.is_a? Virtual::Instruction
|
raise ret.inspect if ret.is_a? Virtual::Instruction
|
||||||
end
|
end
|
||||||
@method = nil
|
@method = nil
|
||||||
Virtual::Return.new(return_type)
|
# function definition is a statement, does not return any value
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
require_relative '../helper'
|
require_relative '../helper'
|
||||||
require 'parslet/convenience'
|
require 'parslet/convenience'
|
||||||
|
|
||||||
|
Phisol::Compiler.class_eval do
|
||||||
|
def set_main main
|
||||||
|
@clazz = Virtual.machine.space.get_class_by_name :Object
|
||||||
|
@method = main
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
module CompilerHelper
|
module CompilerHelper
|
||||||
|
|
||||||
Phisol::Compiler.class_eval do
|
|
||||||
def set_main main
|
|
||||||
@clazz = Virtual.machine.space.get_class_by_name :Object
|
|
||||||
@method = main
|
|
||||||
end
|
|
||||||
end
|
|
||||||
def set_main compiler
|
def set_main compiler
|
||||||
compiler.set_main Virtual.machine.space.get_main
|
compiler.set_main Virtual.machine.space.get_main
|
||||||
end
|
end
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
require_relative "test_basic"
|
require_relative "test_basic"
|
||||||
require_relative "test_call"
|
require_relative "test_call"
|
||||||
require_relative "test_compiler"
|
|
||||||
require_relative "test_field_access"
|
require_relative "test_field_access"
|
||||||
|
require_relative "test_function"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
require_relative "compiler_helper"
|
require_relative "compiler_helper"
|
||||||
|
|
||||||
module Virtual
|
module Virtual
|
||||||
class TestFields < MiniTest::Test
|
class TestCall < MiniTest::Test
|
||||||
include CompilerHelper
|
include CompilerHelper
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
require_relative "compiler_helper"
|
|
||||||
|
|
||||||
|
|
||||||
class CompilerTest < MiniTest::Test
|
|
||||||
include AST::Sexp
|
|
||||||
def setup
|
|
||||||
Virtual.machine.boot
|
|
||||||
end
|
|
||||||
def check
|
|
||||||
res = Phisol::Compiler.compile( @statement )
|
|
||||||
assert res.is_a?(Virtual::Slot) , "compiler must compile to slot, not #{res.inspect}"
|
|
||||||
end
|
|
||||||
def test_function_statement
|
|
||||||
@statement = s(:class, :Foo,
|
|
||||||
s(:derives, :Object),
|
|
||||||
s(:statements,
|
|
||||||
s(:function, :int, s(:name, :foo),
|
|
||||||
s(:parameters, s(:parameter, :ref, :x)),
|
|
||||||
s(:statements, s(:int, 5)))))
|
|
||||||
check
|
|
||||||
end
|
|
||||||
end
|
|
27
test/compiler/test_function.rb
Normal file
27
test/compiler/test_function.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
require_relative "compiler_helper"
|
||||||
|
|
||||||
|
module Virtual
|
||||||
|
class TestFunctions < MiniTest::Test
|
||||||
|
include CompilerHelper
|
||||||
|
|
||||||
|
def setup
|
||||||
|
Virtual.machine.boot
|
||||||
|
end
|
||||||
|
|
||||||
|
#reset the compiler (other than other tests that need to fake their inside a method)
|
||||||
|
def set_main compiler
|
||||||
|
compiler.set_main(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_puts
|
||||||
|
@root = :function_definition
|
||||||
|
@string_input = <<HERE
|
||||||
|
int puts(ref str)
|
||||||
|
main()
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@output = AST::Node
|
||||||
|
check
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user