fix dynamic resolve
patch more like, real resolve method will have to be written and put in there
This commit is contained in:
parent
3a365c779a
commit
d6a2ea4cfc
@ -18,6 +18,10 @@ module Mom
|
|||||||
flat
|
flat
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def <<(o)
|
||||||
|
@statements << o
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -167,7 +167,7 @@ module Risc
|
|||||||
end
|
end
|
||||||
|
|
||||||
obj = space.get_class_by_name(:Word)
|
obj = space.get_class_by_name(:Word)
|
||||||
[:putstring , :get_internal_byte , :set_internal_byte ].each do |f|
|
[:putstring , :get_internal_byte , :set_internal_byte , :resolve_method].each do |f|
|
||||||
obj.instance_type.add_method Builtin::Word.send(f , nil)
|
obj.instance_type.add_method Builtin::Word.send(f , nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -45,6 +45,21 @@ module Risc
|
|||||||
return compiler.method
|
return compiler.method
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# resolve the method name of self, on the given object
|
||||||
|
# may seem wrong way around at first sight, but we know the type of string And
|
||||||
|
# thus resolving this method happens at compile time, whereas any method on an
|
||||||
|
# unknown self (the object given) needs resolving and that is just what we are doing
|
||||||
|
# ( ie the snake bites it's tail)
|
||||||
|
# This method is just a placeholder until boot is over and the real method is
|
||||||
|
# parsed.
|
||||||
|
def resolve_method context
|
||||||
|
compiler = compiler_for(:Word, :resolve_method , {:value => :Object} )
|
||||||
|
args = compiler.method.arguments
|
||||||
|
len = args.instance_length
|
||||||
|
raise "Compiler arg number mismatch, method=#{args} " if len != 3
|
||||||
|
return compiler.method
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
extend ClassMethods
|
extend ClassMethods
|
||||||
end
|
end
|
||||||
|
@ -11,6 +11,10 @@ module Vool
|
|||||||
def create_objects
|
def create_objects
|
||||||
@statements.each{ |s| s.create_objects }
|
@statements.each{ |s| s.create_objects }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def <<(o)
|
||||||
|
@statements << o
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class ScopeStatement < Statements
|
class ScopeStatement < Statements
|
||||||
|
@ -17,7 +17,7 @@ class TestSpace < MiniTest::Test
|
|||||||
|
|
||||||
def test_methods_booted
|
def test_methods_booted
|
||||||
word = @space.get_class_by_name(:Word).instance_type
|
word = @space.get_class_by_name(:Word).instance_type
|
||||||
assert_equal 3 , word.method_names.get_length
|
assert_equal 4 , word.method_names.get_length
|
||||||
assert word.get_method(:putstring) , "no putstring"
|
assert word.get_method(:putstring) , "no putstring"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -23,14 +23,20 @@ module Vool
|
|||||||
assert_equal Mom::NotSameCheck , @first.condition.class , @first
|
assert_equal Mom::NotSameCheck , @first.condition.class , @first
|
||||||
end
|
end
|
||||||
def test_if_true_moves_type
|
def test_if_true_moves_type
|
||||||
assert_equal @first.if_true[0].class, Mom::SlotMove , @first.to_rxf
|
assert_equal @first.if_true[0].class, Mom::SlotMove , @first.if_true.to_rxf
|
||||||
end
|
end
|
||||||
def test_if_true_resolves
|
def test_if_true_resolves_setup
|
||||||
assert_equal @first.if_true[1] , 2, @first.if_true.to_rxf
|
assert_equal @first.if_true[1].class , Mom::MessageSetup, @first.if_true.to_rxf
|
||||||
|
end
|
||||||
|
def test_if_true_resolves_transfer
|
||||||
|
assert_equal @first.if_true[2].class , Mom::ArgumentTransfer, @first.if_true.to_rxf
|
||||||
|
end
|
||||||
|
def test_if_true_resolves_call
|
||||||
|
assert_equal @first.if_true[3].class , Mom::SimpleCall, @first.if_true.to_rxf
|
||||||
|
end
|
||||||
|
def test_if_true_resolves_move
|
||||||
|
assert_equal @first.if_true[4].class , Mom::SlotMove, @first.if_true.to_rxf
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_setup_second
|
def test_setup_second
|
||||||
assert_equal Mom::MessageSetup , @second.class , @second.to_rxf
|
assert_equal Mom::MessageSetup , @second.class , @second.to_rxf
|
||||||
@ -44,24 +50,5 @@ module Vool
|
|||||||
assert_equal Mom::DynamicCall , @fourth.class , @fourth.to_rxf
|
assert_equal Mom::DynamicCall , @fourth.class , @fourth.to_rxf
|
||||||
end
|
end
|
||||||
|
|
||||||
def est_receiver_move_class
|
|
||||||
assert_equal Mom::SlotConstant, @first.class
|
|
||||||
end
|
|
||||||
def est_receiver_move
|
|
||||||
assert_equal :receiver, @first.left[2]
|
|
||||||
end
|
|
||||||
def est_receiver
|
|
||||||
assert_equal IntegerStatement, @first.right.class
|
|
||||||
assert_equal 5, @stats.first.right.value
|
|
||||||
end
|
|
||||||
def est_call_is
|
|
||||||
assert_equal Mom::SimpleCall, @stats[1].class
|
|
||||||
end
|
|
||||||
def est_call_has_method
|
|
||||||
assert_equal Parfait::TypedMethod, @stats[1].method.class
|
|
||||||
end
|
|
||||||
def est_call_has_right_method
|
|
||||||
assert_equal :mod4, @stats[1].method.name
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user