first propper hoisting test
had to change course, normalising and object creation is not possible in one go have to now generate random tmp vars that will have to be picked up later (sorted by tmp_ prefix?)
This commit is contained in:
@ -27,13 +27,12 @@ module Vool
|
||||
|
||||
# after creation vool normalizes to ensure valid syntax and simplify
|
||||
# also throw errors if violation
|
||||
def normalize(method)
|
||||
return self
|
||||
def normalize()
|
||||
raise self.class.name
|
||||
end
|
||||
|
||||
# flatten tree to array
|
||||
def collect(arr)
|
||||
arr << self
|
||||
def each()
|
||||
yield self
|
||||
end
|
||||
|
||||
def to_mom( _ )
|
||||
@ -44,25 +43,15 @@ module Vool
|
||||
def ct_type
|
||||
nil
|
||||
end
|
||||
# create corresponding parfait objects, ie classes, types, methods
|
||||
# mainly implemented by class/method statement
|
||||
def create_objects
|
||||
end
|
||||
|
||||
# used to collect type information
|
||||
def add_ivar( array )
|
||||
end
|
||||
|
||||
# used to collect frame information
|
||||
def add_local( array )
|
||||
end
|
||||
|
||||
# used for method creation
|
||||
def set_class( clazz )
|
||||
end
|
||||
end
|
||||
|
||||
class Expression
|
||||
|
||||
def normalize
|
||||
raise "should not be normalized #{self}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -7,9 +7,9 @@ module Vool
|
||||
end
|
||||
|
||||
def normalize()
|
||||
raise "not named left #{name}" unless @name.is_a?(Named)
|
||||
raise "unsupported right #{value}" unless @name.is_a?(Named) or
|
||||
@name.is_a?(SendStatement) or @name.is_a?(Constant)
|
||||
raise "not named left #{name.class}" unless @name.is_a?(Symbol)
|
||||
raise "unsupported right #{value}" unless @value.is_a?(Named) or
|
||||
@value.is_a?(SendStatement) or @value.is_a?(Constant)
|
||||
self
|
||||
end
|
||||
|
||||
|
@ -48,10 +48,8 @@ module Vool
|
||||
end
|
||||
class SelfExpression < Expression
|
||||
attr_reader :clazz
|
||||
def set_class(clazz)
|
||||
@clazz = clazz
|
||||
end
|
||||
def to_mom(in_method)
|
||||
@clazz = in_method.clazz
|
||||
Mom::SlotDefinition.new(:message , [:receiver])
|
||||
end
|
||||
def ct_type
|
||||
|
@ -5,12 +5,12 @@ module Vool
|
||||
|
||||
def initialize( name , supe , body)
|
||||
@name , @super_class_name , @body = name , supe , body
|
||||
unless( body.is_a?(ScopeStatement))
|
||||
@body = ScopeStatement.new([])
|
||||
@body.statements << body if body
|
||||
end
|
||||
@body = ScopeStatement.new([]) unless body
|
||||
end
|
||||
|
||||
def normalize
|
||||
ClassStatement.new(@name , @super_class_name, @body.normalize )
|
||||
end
|
||||
# compilation to the next layer, mom
|
||||
# context coming in for class is nil, also for methods, henceafter a method is passed down
|
||||
def to_mom( _ )
|
||||
@ -18,7 +18,7 @@ module Vool
|
||||
Mom::Statements.new(methods)
|
||||
end
|
||||
|
||||
def collect(arr)
|
||||
def each()
|
||||
@body.collect(arr)
|
||||
super
|
||||
end
|
||||
|
@ -12,10 +12,10 @@ module Vool
|
||||
simplify_condition
|
||||
end
|
||||
|
||||
def normalize(method)
|
||||
cond , rest = *normalize_name(@condition, method)
|
||||
fals = @if_false ? @if_false.normalize(method) : nil
|
||||
me = IfStatement.new(cond , @if_true.normalize(method), fals)
|
||||
def normalize
|
||||
cond , rest = *normalize_name(@condition)
|
||||
fals = @if_false ? @if_false.normalize : nil
|
||||
me = IfStatement.new(cond , @if_true.normalize, fals)
|
||||
return me unless rest
|
||||
rest << me
|
||||
end
|
||||
|
@ -2,13 +2,10 @@ module Vool
|
||||
class MethodStatement < Statement
|
||||
attr_reader :name, :args , :body , :clazz
|
||||
|
||||
def initialize( name , args , body)
|
||||
def initialize( name , args , body , clazz = nil)
|
||||
@name , @args , @body = name , args , body
|
||||
unless( body.is_a?(ScopeStatement))
|
||||
@body = ScopeStatement.new([])
|
||||
@body.statements << body if body
|
||||
end
|
||||
|
||||
@body = ScopeStatement.new([]) unless body
|
||||
@clazz = clazz
|
||||
end
|
||||
|
||||
# compile to mom instructions. methods themselves do no result in instructions (yet)
|
||||
@ -24,8 +21,8 @@ module Vool
|
||||
super
|
||||
end
|
||||
|
||||
def set_class(clazz)
|
||||
@clazz = clazz
|
||||
def normalize
|
||||
MethodStatement.new( @name , @args , @body.normalize)
|
||||
end
|
||||
|
||||
def create_objects
|
||||
@ -50,7 +47,7 @@ module Vool
|
||||
def make_frame
|
||||
type_hash = {}
|
||||
vars = []
|
||||
@body.collect([]).each { |node| node.add_local(vars) }
|
||||
@body.each([]).each { |node| node.add_local(vars) }
|
||||
vars.each { |var| type_hash[var] = :Object }
|
||||
Parfait::NamedList.type_for( type_hash )
|
||||
end
|
||||
|
@ -6,10 +6,10 @@ module Vool
|
||||
#
|
||||
# eg if( @var % 5) is not normalized
|
||||
# but if(tmp_123) is with tmp_123 = @var % 5 hoited above the if
|
||||
def normalize_name( condition , method )
|
||||
def normalize_name( condition )
|
||||
return [condition] if condition.is_a?(Named)
|
||||
local = method.create_tmp
|
||||
assign = LocalAssignment.new( local , condition)
|
||||
local = "tmp_#{object_id}"
|
||||
assign = Statements.new [LocalAssignment.new( local , condition)]
|
||||
[LocalVariable.new(local) , assign]
|
||||
end
|
||||
end
|
||||
|
@ -5,8 +5,8 @@ module Vool
|
||||
|
||||
def self.ruby_to_vool( ruby_source )
|
||||
statements = RubyCompiler.compile( ruby_source )
|
||||
statements = statements.normalize(nil)
|
||||
statements.create_objects
|
||||
statements = statements.normalize
|
||||
#statements.create_objects
|
||||
statements
|
||||
end
|
||||
def self.ruby_to_mom(source)
|
||||
|
Reference in New Issue
Block a user