src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ECMAException.java
author hannesw
Wed, 21 Mar 2018 16:55:34 +0100
changeset 49275 c639a6b33c5c
parent 47216 71c04702a3d5
permissions -rw-r--r--
8199869: Missing copyright headers in nashorn source code Reviewed-by: sundar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    28
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.codegen.CompilerConstants.virtualField;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import javax.script.ScriptException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.api.scripting.NashornException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.codegen.CompilerConstants.Call;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import jdk.nashorn.internal.codegen.CompilerConstants.FieldAccess;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 * Exception used to implement ECMAScript "throw" from scripts. The actual thrown
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
 * object from script need not be a Java exception and so it is wrapped as an
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
 * instance field called "thrown" here. This exception class is also used to
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
 * represent ECMA errors thrown from runtime code (for example, TypeError,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
 * ReferenceError thrown from Nashorn engine runtime).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
@SuppressWarnings("serial")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
public final class ECMAException extends NashornException {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
    /**
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    47
     * Method handle pointing to the constructor {@link ECMAException#create(Object, String, int, int)},
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
     */
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    49
    public static final Call CREATE = staticCallNoLookup(ECMAException.class, "create", ECMAException.class, Object.class, String.class, int.class, int.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
    /** Field handle to the{@link ECMAException#thrown} field, so that it can be accessed from generated code */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
    public static final FieldAccess THROWN = virtualField(ECMAException.class, "thrown", Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
18627
ef4e353a4a8f 8019482: Number("0x0.0p0") should evaluate to NaN
sundar
parents: 18616
diff changeset
    54
    private static final String EXCEPTION_PROPERTY = "nashornException";
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
    /** Object thrown. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    public final Object thrown;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    /**
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    60
     * Constructor. Called from the factory method 'create'.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
     * @param thrown    object to be thrown
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
     * @param fileName  script file name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
     * @param line      line number of throw
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
     * @param column    column number of throw
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
     */
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    67
    private ECMAException(final Object thrown, final String fileName, final int line, final int column) {
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16240
diff changeset
    68
        super(ScriptRuntime.safeToString(thrown), asThrowable(thrown), fileName, line, column);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
        this.thrown = thrown;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
        setExceptionToThrown();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    /**
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    74
     * Constructor. This is called from the runtime code.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
     * @param thrown   object to be thrown
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
     * @param cause    Java exception that triggered this throw
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    public ECMAException(final Object thrown, final Throwable cause) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
        super(ScriptRuntime.safeToString(thrown), cause);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
        this.thrown = thrown;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
        setExceptionToThrown();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    /**
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    86
     * Factory method to retrieve the underlying exception or create an exception.
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    87
     * This method is called from the generated code.
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    88
     *
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    89
     * @param thrown    object to be thrown
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    90
     * @param fileName  script file name
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    91
     * @param line      line number of throw
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    92
     * @param column    column number of throw
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    93
     * @return ECMAException object
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    94
     */
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    95
    public static ECMAException create(final Object thrown, final String fileName, final int line, final int column) {
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    96
        // If thrown object is an Error or sub-object like TypeError, then
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    97
        // an ECMAException object has been already initialized at constructor.
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
    98
        if (thrown instanceof ScriptObject) {
27357
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
    99
            final Object exception = getException((ScriptObject)thrown);
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   100
            if (exception instanceof ECMAException) {
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   101
                final ECMAException ee = (ECMAException)exception;
27357
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   102
                // Make sure exception has correct thrown reference because that's what will end up getting caught.
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   103
                if (ee.getThrown() == thrown) {
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   104
                    // copy over file name, line number and column number.
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   105
                    ee.setFileName(fileName);
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   106
                    ee.setLineNumber(line);
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   107
                    ee.setColumnNumber(column);
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   108
                    return ee;
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   109
                }
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   110
            }
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   111
        }
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   112
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   113
        return new ECMAException(thrown, fileName, line, column);
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   114
    }
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   115
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   116
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
     * Get the thrown object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
     * @return thrown object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
     */
22370
c150d042ffff 8029364: NashornException to expose thrown object
sundar
parents: 18627
diff changeset
   120
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
    public Object getThrown() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
        return thrown;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        final StringBuilder sb = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
        final String fileName = getFileName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
        final int line = getLineNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
        final int column = getColumnNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
        if (fileName != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
            sb.append(fileName);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
            if (line >= 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
                sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
                sb.append(line);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
            if (column >= 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
                sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
                sb.append(column);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
            sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
            sb.append("ECMAScript Exception: ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
        sb.append(getMessage());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
        return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
     * Get the {@link ECMAException}, i.e. the underlying Java object for the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
     * JavaScript error object from a {@link ScriptObject} representing an error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
     * @return a {@link ECMAException}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
    public static Object getException(final ScriptObject errObj) {
27357
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   159
        // Exclude inherited properties that may belong to errors in the prototype chain.
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   160
        if (errObj.hasOwnProperty(ECMAException.EXCEPTION_PROPERTY)) {
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   161
            return errObj.get(ECMAException.EXCEPTION_PROPERTY);
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   162
        }
8caab9a29b62 8062583: Throwing object with error prototype causes error proto to be caught
hannesw
parents: 26765
diff changeset
   163
        return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
     * Print the stack trace for a {@code ScriptObject} representing an error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
     * @return undefined
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    public static Object printStackTrace(final ScriptObject errObj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
        final Object exception = getException(errObj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
        if (exception instanceof Throwable) {
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16155
diff changeset
   175
            ((Throwable)exception).printStackTrace(Context.getCurrentErr());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
        } else {
16155
a8ab83cbaa49 8005788: Loggers and their corresponding system properties not working correctly
lagergren
parents: 16151
diff changeset
   177
            Context.err("<stack trace not available>");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
     * Get the line number for a {@code ScriptObject} representing an error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
     * @return the line number, or undefined if wrapped exception is not a ParserException
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    public static Object getLineNumber(final ScriptObject errObj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
        final Object e = getException(errObj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
        if (e instanceof NashornException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
            return ((NashornException)e).getLineNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
        } else if (e instanceof ScriptException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
            return ((ScriptException)e).getLineNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
     * Get the column number for a {@code ScriptObject} representing an error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
     * @return the column number, or undefined if wrapped exception is not a ParserException
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
    public static Object getColumnNumber(final ScriptObject errObj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
        final Object e = getException(errObj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
        if (e instanceof NashornException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
            return ((NashornException)e).getColumnNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
        } else if (e instanceof ScriptException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
            return ((ScriptException)e).getColumnNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
     * Get the file name for a {@code ScriptObject} representing an error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
     * @return the file name, or undefined if wrapped exception is not a ParserException
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
    public static Object getFileName(final ScriptObject errObj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
        final Object e = getException(errObj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
        if (e instanceof NashornException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
            return ((NashornException)e).getFileName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
        } else if (e instanceof ScriptException) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
            return ((ScriptException)e).getFileName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
     * Stateless string conversion for an error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
     * @param errObj the error object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
     * @return string representation of {@code errObj}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    public static String safeToString(final ScriptObject errObj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
        Object name = UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
            name = errObj.get("name");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
        } catch (final Exception e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
            //ignored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
        if (name == UNDEFINED) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
            name = "Error";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
            name = ScriptRuntime.safeToString(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
        Object msg = UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
            msg = errObj.get("message");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
        } catch (final Exception e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
            //ignored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
        if (msg == UNDEFINED) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
            msg = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
            msg = ScriptRuntime.safeToString(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
        if (((String)name).isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
            return (String)msg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
        if (((String)msg).isEmpty()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
            return (String)name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents: 16256
diff changeset
   274
        return name + ": " + msg;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
    private static Throwable asThrowable(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
        return (obj instanceof Throwable)? (Throwable)obj : null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
    private void setExceptionToThrown() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
        /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
         * Nashorn extension: errorObject.nashornException
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
         * Expose this exception via "nashornException" property of on the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
         * thrown object. This exception object can be used to print stack
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
         * trace and fileName, line number etc. from script code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
        if (thrown instanceof ScriptObject) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
            final ScriptObject sobj = (ScriptObject)thrown;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
            if (!sobj.has(EXCEPTION_PROPERTY)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
                sobj.addOwnProperty(EXCEPTION_PROPERTY, Property.NOT_ENUMERABLE, this);
22387
81639250d335 8031983: Error objects should capture stack at the constructor
sundar
parents: 22370
diff changeset
   293
            } else {
26765
97501edd2979 8047764: Indexed or polymorphic set on global affects Object.prototype
hannesw
parents: 25865
diff changeset
   294
                sobj.set(EXCEPTION_PROPERTY, this, 0);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
}