bit of code docs
This commit is contained in:
33
lib/mom/instruction/label.rb
Normal file
33
lib/mom/instruction/label.rb
Normal file
@ -0,0 +1,33 @@
|
||||
module Mom
|
||||
|
||||
# A Label is the only legal target for a branch (this is true in Mom and Risc)
|
||||
#
|
||||
# In the dynamic view (runtime) where the instructions form a graph,
|
||||
# branches fan out, Labels collect. In other words a branch is the place where
|
||||
# several roads lead off, and a Label where several roads arrive.
|
||||
#
|
||||
# A Label has a name which is mainly used for debugging.
|
||||
#
|
||||
class Label < Instruction
|
||||
attr_reader :name
|
||||
def initialize(name)
|
||||
@name = name
|
||||
end
|
||||
|
||||
# A Mom::Label converts one2one to a Risc::Label. So in a way it could not be more
|
||||
# simple.
|
||||
# Alas, since almost by definition several roads lead to this label, all those
|
||||
# several converted instructions must also point to the identical label on the
|
||||
# risc level.
|
||||
#
|
||||
# This is achieved by caching the created Risc::Label in an instance variable.
|
||||
# All branches that lead to this label can thus safely call the to_risc and
|
||||
# whoever calls first triggers the labels creation, but all get the same label.
|
||||
#
|
||||
# Off course some specific place still has to be responsible for actually
|
||||
# adding the label to the instruction list (usually an if/while)
|
||||
def to_risc(compiler)
|
||||
@risc_label ||= Risc::Label.new(self,name)
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user