154 }
155 };
156 }
157
158 public Effect get(int index) {
159 if (index >= size) {
160 throw new IndexOutOfBoundsException();
161 }
162 return effects[index];
163 }
164
165 public void clear() {
166 size = 0;
167 }
168
169 public boolean isEmpty() {
170 return size == 0;
171 }
172
173 public void apply(StructuredGraph graph, ArrayList<Node> obsoleteNodes, boolean cfgKills) {
174 for (int i = 0; i < size(); i++) {
175 Effect effect = effects[i];
176 if (effect.isCfgKill() == cfgKills) {
177 try {
178 effect.apply(graph, obsoleteNodes);
179 } catch (Throwable t) {
180 StringBuilder str = new StringBuilder();
181 toString(str, i);
182 throw new GraalError(t).addContext("effect", str);
183 }
184 if (effect.isVisible() && debug.isLogEnabled()) {
185 StringBuilder str = new StringBuilder();
186 toString(str, i);
187 debug.log(" %s", str);
188 }
189 }
190 }
191 }
192
193 private void toString(StringBuilder str, int i) {
194 Effect effect = effects[i];
195 str.append(getName(i)).append(" [");
196 boolean first = true;
197 for (Field field : effect.getClass().getDeclaredFields()) {
198 try {
199 field.setAccessible(true);
200 Object object = field.get(effect);
201 if (object == this) {
202 // Inner classes could capture the EffectList itself.
203 continue;
204 }
205 str.append(first ? "" : ", ").append(format(object));
206 first = false;
207 } catch (SecurityException | IllegalAccessException e) {
208 throw new RuntimeException(e);
209 }
210 }
211 str.append(']');
212 }
213
214 private static String format(Object object) {
215 if (object != null && Object[].class.isAssignableFrom(object.getClass())) {
216 return Arrays.toString((Object[]) object);
217 }
218 return "" + object;
219 }
220
221 @Override
222 public String toString() {
223 StringBuilder str = new StringBuilder();
224 for (int i = 0; i < size(); i++) {
225 Effect effect = get(i);
|
154 }
155 };
156 }
157
158 public Effect get(int index) {
159 if (index >= size) {
160 throw new IndexOutOfBoundsException();
161 }
162 return effects[index];
163 }
164
165 public void clear() {
166 size = 0;
167 }
168
169 public boolean isEmpty() {
170 return size == 0;
171 }
172
173 public void apply(StructuredGraph graph, ArrayList<Node> obsoleteNodes, boolean cfgKills) {
174 boolean message = false;
175 for (int i = 0; i < size(); i++) {
176 Effect effect = effects[i];
177 if (effect.isCfgKill() == cfgKills) {
178 if (!message) {
179 message = true;
180 debug.log(cfgKills ? " ==== cfg kill effects" : " ==== effects");
181 }
182 try {
183 effect.apply(graph, obsoleteNodes);
184 } catch (Throwable t) {
185 StringBuilder str = new StringBuilder();
186 toString(str, i);
187 throw new GraalError(t).addContext("effect", str);
188 }
189 if (effect.isVisible() && debug.isLogEnabled()) {
190 StringBuilder str = new StringBuilder();
191 toString(str, i);
192 debug.log(" %s", str);
193 }
194 }
195 }
196 }
197
198 private void toString(StringBuilder str, int i) {
199 Effect effect = effects[i];
200 str.append(getName(i)).append(" [");
201 boolean first = true;
202 for (Field field : effect.getClass().getDeclaredFields()) {
203 try {
204 field.setAccessible(true);
205 Object object = field.get(effect);
206 if (object == this) {
207 // Inner classes could capture the EffectList itself.
208 continue;
209 }
210 str.append(first ? "" : ", ").append(field.getName()).append("=").append(format(object));
211 first = false;
212 } catch (SecurityException | IllegalAccessException e) {
213 throw new RuntimeException(e);
214 }
215 }
216 str.append(']');
217 }
218
219 private static String format(Object object) {
220 if (object != null && Object[].class.isAssignableFrom(object.getClass())) {
221 return Arrays.toString((Object[]) object);
222 }
223 return "" + object;
224 }
225
226 @Override
227 public String toString() {
228 StringBuilder str = new StringBuilder();
229 for (int i = 0; i < size(); i++) {
230 Effect effect = get(i);
|