Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 7088c15

Browse files
committed
Support multiple branch targets per instruction
1 parent 7578736 commit 7088c15

File tree

3 files changed

+26
-25
lines changed

3 files changed

+26
-25
lines changed

lib/syntax_tree/yarv/control_flow_graph.rb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def initialize(block_start, insns)
105105
# checks that the only instruction in this basic block that branches is
106106
# the last instruction.
107107
def verify
108-
insns[0...-1].each { |insn| raise if insn.branches? }
108+
insns[0...-1].each { |insn| raise unless insn.branch_targets.empty? }
109109
end
110110

111111
def last
@@ -157,8 +157,13 @@ def find_basic_block_starts
157157
block_starts = Set.new([0])
158158

159159
insns.each_with_index do |insn, index|
160-
if insn.branches?
161-
block_starts.add(labels[insn.label]) if insn.respond_to?(:label)
160+
branch_targets = insn.branch_targets
161+
162+
if branch_targets.any?
163+
branch_targets.each do |branch_target|
164+
block_starts.add(labels[branch_target])
165+
end
166+
162167
block_starts.add(index + 1) if insn.falls_through?
163168
end
164169
end
@@ -186,11 +191,11 @@ def connect_basic_blocks(blocks)
186191
blocks.each do |block_start, block|
187192
insn = block.last
188193

189-
if insn.branches? && insn.respond_to?(:label)
190-
block.successors << blocks.fetch(labels[insn.label])
194+
insn.branch_targets.each do |branch_target|
195+
block.successors << blocks.fetch(labels[branch_target])
191196
end
192197

193-
if (!insn.branches? && !insn.leaves?) || insn.falls_through?
198+
if (insn.branch_targets.empty? && !insn.leaves?) || insn.falls_through?
194199
block.successors << blocks.fetch(block_start + block.insns.length)
195200
end
196201

lib/syntax_tree/yarv/instructions.rb

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ def pops
9090
0
9191
end
9292

93-
# Whether or not this instruction is a branch instruction.
94-
def branches?
95-
false
93+
# This returns an array of labels.
94+
def branch_targets
95+
[]
9696
end
9797

9898
# Whether or not this instruction leaves the current frame.
@@ -261,8 +261,8 @@ def call(vm)
261261
vm.jump(label) if vm.pop
262262
end
263263

264-
def branches?
265-
true
264+
def branch_targets
265+
[label]
266266
end
267267

268268
def falls_through?
@@ -322,8 +322,8 @@ def call(vm)
322322
vm.jump(label) if vm.pop.nil?
323323
end
324324

325-
def branches?
326-
true
325+
def branch_targets
326+
[label]
327327
end
328328

329329
def falls_through?
@@ -382,8 +382,8 @@ def call(vm)
382382
vm.jump(label) unless vm.pop
383383
end
384384

385-
def branches?
386-
true
385+
def branch_targets
386+
[label]
387387
end
388388

389389
def falls_through?
@@ -2237,8 +2237,8 @@ def call(vm)
22372237
vm.jump(label)
22382238
end
22392239

2240-
def branches?
2241-
true
2240+
def branch_targets
2241+
[label]
22422242
end
22432243
end
22442244

@@ -2283,10 +2283,6 @@ def call(vm)
22832283
vm.leave
22842284
end
22852285

2286-
def branches?
2287-
true
2288-
end
2289-
22902286
def leaves?
22912287
true
22922288
end
@@ -2998,8 +2994,8 @@ def call(vm)
29982994
vm.jump(case_dispatch_hash.fetch(vm.pop, else_label))
29992995
end
30002996

3001-
def branches?
3002-
true
2997+
def branch_targets
2998+
case_dispatch_hash.values.push(else_label)
30032999
end
30043000

30053001
def falls_through?

lib/syntax_tree/yarv/legacy.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ def call(vm)
115115
vm.push(nil)
116116
end
117117

118-
def branches?
119-
true
118+
def branch_targets
119+
[label]
120120
end
121121

122122
def falls_through?

0 commit comments

Comments
 (0)