171
|
1
|
268
|
2 # from .instruction import Statement
|
|
3
|
|
4 class Block:
|
|
5 """
|
|
6 Uninterrupted sequence of instructions with a label at the start.
|
|
7 """
|
219
|
8 def __init__(self, name):
|
239
|
9 self.name = name
|
|
10 self.instructions = []
|
|
11
|
219
|
12 def __repr__(self):
|
268
|
13 return 'Block {0}'.format(self.name)
|
239
|
14
|
219
|
15 def addInstruction(self, i):
|
268
|
16 #assert isinstance(i, Statement)
|
239
|
17 i.parent = self
|
|
18 self.instructions.append(i)
|
205
|
19
|
219
|
20 def replaceInstruction(self, i1, i2):
|
239
|
21 idx = self.instructions.index(i1)
|
|
22 i1.parent = None
|
|
23 i1.delete()
|
|
24 i2.parent = self
|
|
25 self.instructions[idx] = i2
|
205
|
26
|
219
|
27 def removeInstruction(self, i):
|
239
|
28 i.parent = None
|
252
|
29 i.delete()
|
239
|
30 self.instructions.remove(i)
|
205
|
31
|
219
|
32 def getInstructions(self):
|
205
|
33 return self.instructions
|
243
|
34 Instructions = property(getInstructions)
|
205
|
35
|
219
|
36 def getLastIns(self):
|
239
|
37 return self.instructions[-1]
|
219
|
38 LastInstruction = property(getLastIns)
|
239
|
39
|
219
|
40 @property
|
|
41 def Empty(self):
|
239
|
42 return len(self.instructions) == 0
|
|
43
|
219
|
44 @property
|
|
45 def FirstInstruction(self):
|
239
|
46 return self.instructions[0]
|
219
|
47
|
|
48 def getSuccessors(self):
|
243
|
49 if not self.Empty:
|
268
|
50 return self.LastInstruction.Targets
|
243
|
51 return []
|
219
|
52 Successors = property(getSuccessors)
|
|
53
|
|
54 def getPredecessors(self):
|
239
|
55 preds = []
|
|
56 for bb in self.parent.BasicBlocks:
|
|
57 if self in bb.Successors:
|
|
58 preds.append(bb)
|
|
59 return preds
|
219
|
60 Predecessors = property(getPredecessors)
|
171
|
61
|
258
|
62 def precedes(self, other):
|
|
63 raise NotImplementedError()
|
|
64
|
239
|
65 def check(self):
|
268
|
66 pass
|
239
|
67
|