forked from soot-oss/soot
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathAbstractTrap.java
More file actions
156 lines (131 loc) · 3.69 KB
/
AbstractTrap.java
File metadata and controls
156 lines (131 loc) · 3.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package soot;
/*-
* #%L
* Soot - a J*va Optimization Framework
* %%
* Copyright (C) 1997 - 1999 Raja Vallee-Rai
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
* #L%
*/
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Partial implementation of trap (exception catcher), used within Body classes.
*/
@SuppressWarnings("serial")
public class AbstractTrap implements Trap, Serializable {
/**
* The exception being caught.
*/
protected transient SootClass exception;
/**
* The first unit being trapped.
*/
protected UnitBox beginUnitBox;
/**
* The unit just before the last unit being trapped.
*/
protected UnitBox endUnitBox;
/**
* The unit to which execution flows after the caught exception is triggered.
*/
protected UnitBox handlerUnitBox;
/**
* The list of UnitBoxes referred to in this Trap (begin, end, and handler).
*/
protected List<UnitBox> unitBoxes;
/**
* Creates an AbstractTrap with the given exception, handler, begin, and end units.
*/
protected AbstractTrap(SootClass exception, UnitBox beginUnitBox, UnitBox endUnitBox, UnitBox handlerUnitBox) {
this.exception = exception;
this.beginUnitBox = beginUnitBox;
this.endUnitBox = endUnitBox;
this.handlerUnitBox = handlerUnitBox;
this.unitBoxes = Collections.unmodifiableList(Arrays.asList(beginUnitBox, endUnitBox, handlerUnitBox));
}
@Override
public Unit getBeginUnit() {
return beginUnitBox.getUnit();
}
@Override
public Unit getEndUnit() {
return endUnitBox.getUnit();
}
@Override
public Unit getHandlerUnit() {
return handlerUnitBox.getUnit();
}
@Override
public UnitBox getHandlerUnitBox() {
return handlerUnitBox;
}
@Override
public UnitBox getBeginUnitBox() {
return beginUnitBox;
}
@Override
public UnitBox getEndUnitBox() {
return endUnitBox;
}
@Override
public List<UnitBox> getUnitBoxes() {
return unitBoxes;
}
@Override
public void clearUnitBoxes() {
for (UnitBox box : getUnitBoxes()) {
box.setUnit(null);
}
}
@Override
public SootClass getException() {
return exception;
}
@Override
public void setBeginUnit(Unit beginUnit) {
beginUnitBox.setUnit(beginUnit);
}
@Override
public void setEndUnit(Unit endUnit) {
endUnitBox.setUnit(endUnit);
}
@Override
public void setHandlerUnit(Unit handlerUnit) {
handlerUnitBox.setUnit(handlerUnit);
}
@Override
public void setException(SootClass exception) {
this.exception = exception;
}
@Override
public Object clone() {
throw new RuntimeException();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
exception = Scene.v().getSootClass((String) in.readObject());
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(exception.getName());
}
}