move common statements into its only use in vool

This commit is contained in:
Torsten Ruger 2018-03-15 20:40:21 +05:30
parent 79bf416e58
commit ad4690d719
6 changed files with 37 additions and 44 deletions

View File

@ -9,7 +9,6 @@ module Common
@next = nekst
nekst
end
alias :<< :set_next
# during translation we replace one by one
def replace_next( nekst )
@ -44,6 +43,7 @@ module Common
def append( code )
last.set_next code
end
alias :<< :append
def length( labels = [] )
ret = 1

View File

@ -1,35 +0,0 @@
module Common
#extracted to resuse
module Statements
attr_reader :statements
def initialize(statements)
@statements = statements
end
def empty?
@statements.empty?
end
def single?
@statements.length == 1
end
def first
@statements.first
end
def last
@statements.last
end
def length
@statements.length
end
def [](i)
@statements[i]
end
def <<(o)
@statements << o
self
end
def add_array(a)
@statements += a
end
end
end

View File

@ -15,6 +15,5 @@ require_relative "risc"
require_relative "arm/arm_machine"
require_relative "arm/translator"
require_relative "common/list"
require_relative "common/statements"
require_relative "vool/vool_compiler"
require_relative "mom/mom"

View File

@ -51,10 +51,10 @@ module Vool
head
end
def collect(arr)
@if_true.collect(arr)
@if_false.collect(arr) if @if_false
super
def each(&block)
block.call(condition)
@if_true.each(&block)
@if_false.each(&block) if @if_false
end
def simplify_condition

View File

@ -60,7 +60,7 @@ module Vool
type = @receiver.ct_type
called_method = type.resolve_method(@name)
raise "No method #{@name} for #{type}" unless called_method
Mom::Statements.new( message_setup(in_method) << Mom::SimpleCall.new( called_method) )
message_setup(in_method) << Mom::SimpleCall.new( called_method)
end
# this breaks cleanly into two parts:

View File

@ -1,6 +1,35 @@
module Vool
class Statements < Statement
include Common::Statements
attr_reader :statements
def initialize(statements)
@statements = statements
end
def empty?
@statements.empty?
end
def single?
@statements.length == 1
end
def first
@statements.first
end
def last
@statements.last
end
def length
@statements.length
end
def [](i)
@statements[i]
end
def <<(o)
@statements << o
self
end
def add_array(a)
@statements += a
end
# create machine instructions
def to_mom( method )
@ -18,7 +47,7 @@ module Vool
def each(&block)
block.call(self)
@statements.each{|a| a.each(block)}
@statements.each{|a| a.each(&block)}
end
end