fix assignments

which was letting ruby instances through
also rename the doubious copy
This commit is contained in:
Torsten Ruger 2018-07-20 18:13:58 +03:00
parent 6a58a71c0a
commit 172327f045
2 changed files with 37 additions and 21 deletions

View File

@ -10,7 +10,7 @@ module Ruby
raise "not named left #{name.class}" unless name.is_a?(Symbol) raise "not named left #{name.class}" unless name.is_a?(Symbol)
case value case value
when Named , Constant when Named , Constant
return copy return self.vool_brother.new(name,@value.to_vool)
when SendStatement when SendStatement
return normalize_send return normalize_send
else else
@ -18,19 +18,23 @@ module Ruby
end end
end end
def copy(value = nil) # sends may have complex args that get hoisted in vool:ing them
value ||= @value # in which case we have to assign the simplified, otherwise the
self.vool_brother.new(name,value) # plain send
end
def normalize_send def normalize_send
statements = value.to_vool statements = value.to_vool
return copy( statements ) if statements.is_a?(Vool::SendStatement) return assignment( statements ) if statements.is_a?(Vool::SendStatement)
assign = statements.statements.pop # send has hoisted assigns, so we make an assign out of the "pure" send
statements << copy(assign) statements << assignment(statements.statements.pop)
statements statements
end end
# create same type assignment with the value (a send)
def assignment(value)
value ||= @value
self.vool_brother.new(name,value)
end
def to_s(depth = 0) def to_s(depth = 0)
at_depth(depth , "#{@name} = #{@value}") at_depth(depth , "#{@name} = #{@value}")
end end

View File

@ -25,28 +25,40 @@ module Ruby
assert_equal IvarAssignment , lst.class assert_equal IvarAssignment , lst.class
end end
end end
class TestAssignmentVool < MiniTest::Test class TestAssignmentVoolBar < MiniTest::Test
include RubyTests include RubyTests
def setup
@lst = compile( "foo = bar").to_vool
end
def test_local def test_local
lst = compile( "foo = bar").to_vool assert_equal Vool::LocalAssignment , @lst.class
assert_equal Vool::LocalAssignment , lst.class end
def test_bar
assert_equal Vool::SendStatement , @lst.value.class
end end
def test_local_name def test_local_name
lst = compile( "foo = bar").to_vool assert_equal :foo , @lst.name
assert_equal :foo , lst.name end
end
class TestAssignmentVoolInst < MiniTest::Test
include RubyTests
def setup
@lst = compile( "@foo = bar").to_vool
end end
def test_instance def test_instance
lst = compile( "@foo = bar").to_vool assert_equal Vool::IvarAssignment , @lst.class
assert_equal Vool::IvarAssignment , lst.class
end end
def test_instance_name def test_instance_name
lst = compile( "@foo = bar").to_vool assert_equal :foo , @lst.name
assert_equal :foo , lst.name end
end
class TestAssignmentVoolConst < MiniTest::Test
include RubyTests
def setup
@lst = compile( "foo = 5").to_vool
end end
def test_const def test_const
lst = compile( "@foo = 5").to_vool assert_equal Vool::IntegerConstant , @lst.value.class
assert_equal Vool::IvarAssignment , lst.class
end end
end end
end end