AdaptationResult.java revision 1609:c9406f325a23
1/* 2 * Copyright (c) 2010, 2013, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package jdk.nashorn.internal.runtime.linker; 27 28import jdk.nashorn.internal.runtime.ECMAErrors; 29import jdk.nashorn.internal.runtime.ECMAException; 30 31/** 32 * A result of generating an adapter for a class. A tuple of an outcome and - in case of an error outcome - a list of 33 * classes that caused the error. 34 */ 35final class AdaptationResult { 36 /** 37 * Contains various outcomes for attempting to generate an adapter class. These are stored in AdapterInfo instances. 38 * We have a successful outcome (adapter class was generated) and four possible error outcomes: superclass is final, 39 * superclass is not public, superclass has no public or protected constructor, more than one superclass was 40 * specified. We don't throw exceptions when we try to generate the adapter, but rather just record these error 41 * conditions as they are still useful as partial outcomes, as Nashorn's linker can still successfully check whether 42 * the class can be autoconverted from a script function even when it is not possible to generate an adapter for it. 43 */ 44 enum Outcome { 45 SUCCESS, 46 ERROR_FINAL_CLASS, 47 ERROR_NON_PUBLIC_CLASS, 48 ERROR_NO_ACCESSIBLE_CONSTRUCTOR, 49 ERROR_MULTIPLE_SUPERCLASSES, 50 ERROR_NO_COMMON_LOADER, 51 ERROR_FINAL_FINALIZER, 52 ERROR_OTHER 53 } 54 55 static final AdaptationResult SUCCESSFUL_RESULT = new AdaptationResult(Outcome.SUCCESS, ""); 56 57 private final Outcome outcome; 58 private final RuntimeException cause; 59 private final String[] messageArgs; 60 61 AdaptationResult(final Outcome outcome, final RuntimeException cause, final String... messageArgs) { 62 this.outcome = outcome; 63 this.cause = cause; 64 this.messageArgs = messageArgs; 65 } 66 67 AdaptationResult(final Outcome outcome, final String... messageArgs) { 68 this(outcome, null, messageArgs); 69 } 70 71 Outcome getOutcome() { 72 return outcome; 73 } 74 75 ECMAException typeError() { 76 return ECMAErrors.typeError(cause, "extend." + outcome, messageArgs); 77 } 78} 79