1 /* 2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package org.graalvm.compiler.graph; 24 25 import org.graalvm.compiler.debug.GraalError; 26 27 /** 28 * This error is the graph/node aware extension of {@link GraalError}. 29 */ 30 public class GraalGraphError extends GraalError { 31 32 private static final long serialVersionUID = -989290015525497919L; 33 private Node node; 34 private Graph graph; 35 36 /** 37 * This constructor creates a {@link GraalGraphError} with a message assembled via 38 * {@link String#format(String, Object...)}. It always uses the ENGLISH locale in order to 39 * always generate the same output. 40 * 41 * @param msg the message that will be associated with the error, in String.format syntax 42 * @param args parameters to String.format - parameters that implement {@link Iterable} will be 43 * expanded into a [x, x, ...] representation. 44 */ 45 public GraalGraphError(String msg, Object... args) { 46 super(msg, args); 47 } 48 49 /** 50 * This constructor creates a {@link GraalGraphError} for a given causing Throwable instance. 51 * 52 * @param cause the original exception that contains additional information on this error 53 */ 54 public GraalGraphError(Throwable cause) { 55 super(cause); 56 } 57 58 /** 59 * This constructor creates a {@link GraalGraphError} from a given GraalError instance. 60 * 61 * @param e the original GraalError 62 */ 63 protected GraalGraphError(GraalError e) { 64 super(e); 65 if (e instanceof GraalGraphError) { 66 node = ((GraalGraphError) e).node; 67 graph = ((GraalGraphError) e).graph; 68 } 69 } 70 71 /** 72 * Adds a graph to the context of this VerificationError. The first graph added via this method 73 * will be returned by {@link #graph()}. 74 * 75 * @param newGraph the graph which is in a incorrect state, if the verification error was not 76 * caused by a specific node 77 */ 78 GraalGraphError addContext(Graph newGraph) { 79 if (newGraph != this.graph) { 80 addContext("graph", newGraph); 81 if (this.graph == null) { 82 this.graph = newGraph; 83 } 84 } 85 return this; 86 } 87 88 /** 89 * Adds a node to the context of this VerificationError. The first node added via this method 90 * will be returned by {@link #node()}. 91 * 92 * @param newNode the node which is in a incorrect state, if the verification error was caused 93 * by a node 94 */ 95 public GraalGraphError addContext(Node newNode) { 96 if (newNode != this.node) { 97 addContext("node", newNode); 98 if (this.node == null) { 99 this.node = newNode; 100 } 101 } 102 return this; 103 } 104 105 /** 106 * Transform a GraalError into a GraalGraphInternalError and add a graph to the context. 107 * 108 * @param e the previous error 109 * @param newGraph the graph which is in a incorrect state, if the verification error was not 110 * caused by a specific node 111 */ 112 public static GraalGraphError transformAndAddContext(GraalError e, Graph newGraph) { 113 GraalGraphError graphError; 114 if (e instanceof GraalGraphError) { 115 graphError = (GraalGraphError) e; 116 } else { 117 graphError = new GraalGraphError(e); 118 } 119 return graphError.addContext(newGraph); 120 } 121 122 /** 123 * Transform a GraalError into a GraalGraphInternalError and add a node to the context. 124 * 125 * @param e the previous error 126 * @param newNode the node which is in a incorrect state, if the verification error was caused 127 * by a node 128 */ 129 public static GraalGraphError transformAndAddContext(GraalError e, Node newNode) { 130 GraalGraphError graphError; 131 if (e instanceof GraalGraphError) { 132 graphError = (GraalGraphError) e; 133 } else { 134 graphError = new GraalGraphError(e); 135 } 136 return graphError.addContext(newNode); 137 } 138 139 public Node node() { 140 return node; 141 } 142 143 public Graph graph() { 144 return graph; 145 } 146 }