fcbdba4804
Basically just a label now No more implicit returns (needs compiler tests) Many return points is the new idea Also setup is done before the enter by MessageSetup
86 lines
1.9 KiB
Ruby
86 lines
1.9 KiB
Ruby
module Risc
|
|
|
|
# A label is a placeholder for it's next Instruction
|
|
# It's function is not to turn into code, but to be a valid brnch target
|
|
#
|
|
# So branches and Labels are pairs, fan out, fan in
|
|
#
|
|
#
|
|
|
|
class Label < Instruction
|
|
def initialize( source , name , nekst = nil)
|
|
super(source , nekst)
|
|
@name = name
|
|
end
|
|
attr_reader :name
|
|
|
|
def to_s
|
|
"Label: #{@name} (#{self.next.class.name.split("::").last})"
|
|
end
|
|
|
|
def sof_reference_name
|
|
@name
|
|
end
|
|
|
|
# a method start has a label of the form Class.method , test for that
|
|
def is_method
|
|
@name.split(".").length == 2
|
|
end
|
|
|
|
def to_arr labels = []
|
|
return [] if labels.include?(self)
|
|
labels << self
|
|
super
|
|
end
|
|
|
|
def length labels = []
|
|
return 0 if labels.include?(self)
|
|
labels << self
|
|
ret = 1
|
|
ret += self.next.length(labels) if self.next
|
|
ret
|
|
end
|
|
|
|
def assemble io
|
|
end
|
|
|
|
def assemble_all io , labels = []
|
|
return if labels.include?(self) or self.next.nil?
|
|
labels << self
|
|
self.next.assemble_all(io,labels)
|
|
end
|
|
|
|
def total_byte_length labels = []
|
|
return 0 if labels.include?(self) or self.next.nil?
|
|
labels << self
|
|
ret = self.next.total_byte_length(labels)
|
|
#puts "#{self.class.name} return #{ret}"
|
|
ret
|
|
end
|
|
|
|
# labels have the same position as their next
|
|
def set_position position , labels = []
|
|
return position if labels.include?(self)
|
|
labels << self
|
|
super(position , labels)
|
|
self.next.set_position(position,labels) if self.next
|
|
end
|
|
|
|
# shame we need this, just for logging
|
|
def byte_length
|
|
0
|
|
end
|
|
|
|
def each_label labels =[] , &block
|
|
return if labels.include?(self)
|
|
labels << self
|
|
block.yield(self)
|
|
super
|
|
end
|
|
end
|
|
|
|
def self.label( source , name , nekst = nil)
|
|
Label.new( source , name , nekst = nil)
|
|
end
|
|
end
|