Class: Rubinius::ToolSet.current::TS::Generator::Label
- Inherits:
-
Object
- Object
- Rubinius::ToolSet.current::TS::Generator::Label
- Defined in:
- lib/rubinius/compiler/generator.rb
Overview
Jump label for the branch instructions. The use scenarios for labels:
1. Used and then set
g.gif label
...
label.set!
2. Set and then used
label.set!
...
g.git label
3. 1, 2
Many labels are only used once. This class employs two small optimizations. First, for the case where a label is used once then set, the label merely records the point it was used and updates that location to the concrete IP when the label is set. In the case where the label is used multiple times, it records each location and updates them to an IP when the label is set. In both cases, once the label is set, each use after that updates the instruction stream with a concrete IP at the point the label is used. This avoids the need to ever record all the labels or search through the stream later to change symbolic labels into concrete IP’s.
Instance Attribute Summary collapse
-
#basic_block ⇒ Object
readonly
Returns the value of attribute basic_block.
-
#position ⇒ Object
Returns the value of attribute position.
-
#used ⇒ Object
(also: #used?)
readonly
Returns the value of attribute used.
Instance Method Summary collapse
-
#initialize(generator) ⇒ Label
constructor
A new instance of Label.
- #set! ⇒ Object
- #used_at(ip) ⇒ Object
Constructor Details
#initialize(generator) ⇒ Label
Returns a new instance of Label.
35 36 37 38 39 40 41 42 |
# File 'lib/rubinius/compiler/generator.rb', line 35 def initialize(generator) @generator = generator @basic_block = generator.new_basic_block @position = nil @used = false @location = nil @locations = nil end |
Instance Attribute Details
#basic_block ⇒ Object (readonly)
Returns the value of attribute basic_block.
32 33 34 |
# File 'lib/rubinius/compiler/generator.rb', line 32 def basic_block @basic_block end |
#position ⇒ Object
Returns the value of attribute position.
31 32 33 |
# File 'lib/rubinius/compiler/generator.rb', line 31 def position @position end |
#used ⇒ Object (readonly) Also known as: used?
Returns the value of attribute used.
32 33 34 |
# File 'lib/rubinius/compiler/generator.rb', line 32 def used @used end |
Instance Method Details
#set! ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/rubinius/compiler/generator.rb', line 44 def set! @position = @generator.ip if @locations @locations.each { |x| @generator.stream[x] = @position } elsif @location @generator.stream[@location] = @position end @generator.current_block.left = @basic_block @generator.current_block.close @generator.current_block = @basic_block @basic_block.open end |
#used_at(ip) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/rubinius/compiler/generator.rb', line 58 def used_at(ip) if @position @generator.stream[ip] = @position elsif !@location @location = ip elsif @locations @locations << ip else @locations = [@location, ip] end @used = true end |