8062583: Throwing object with error prototype causes error proto to be caught
Reviewed-by: sundar, jlaskey
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ECMAException.java Fri Oct 31 10:06:52 2014 +0100
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ECMAException.java Fri Oct 31 16:50:31 2014 +0100
@@ -96,15 +96,17 @@
// If thrown object is an Error or sub-object like TypeError, then
// an ECMAException object has been already initialized at constructor.
if (thrown instanceof ScriptObject) {
- final ScriptObject sobj = (ScriptObject)thrown;
- final Object exception = getException(sobj);
+ final Object exception = getException((ScriptObject)thrown);
if (exception instanceof ECMAException) {
- // copy over file name, line number and column number.
final ECMAException ee = (ECMAException)exception;
- ee.setFileName(fileName);
- ee.setLineNumber(line);
- ee.setColumnNumber(column);
- return ee;
+ // Make sure exception has correct thrown reference because that's what will end up getting caught.
+ if (ee.getThrown() == thrown) {
+ // copy over file name, line number and column number.
+ ee.setFileName(fileName);
+ ee.setLineNumber(line);
+ ee.setColumnNumber(column);
+ return ee;
+ }
}
}
@@ -154,7 +156,11 @@
* @return a {@link ECMAException}
*/
public static Object getException(final ScriptObject errObj) {
- return errObj.get(ECMAException.EXCEPTION_PROPERTY);
+ // Exclude inherited properties that may belong to errors in the prototype chain.
+ if (errObj.hasOwnProperty(ECMAException.EXCEPTION_PROPERTY)) {
+ return errObj.get(ECMAException.EXCEPTION_PROPERTY);
+ }
+ return null;
}
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8062583.js Fri Oct 31 16:50:31 2014 +0100
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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 Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8062583: Throwing object with error prototype causes error proto to be caught
+ *
+ * @test
+ * @run
+ */
+
+function CustomError() {
+ this.name = "CustomError";
+}
+
+CustomError.prototype = new Error();
+
+var c1 = new CustomError();
+
+try {
+ throw c1;
+} catch (e) {
+ print(e === c1);
+ print(e === CustomError.prototype);
+ print(e.stack.replace(/\\/g, '/'));
+ print(e.nashornException.toString().replace(/\\/g, '/'));
+}
+
+var c2 = new CustomError();
+Error.captureStackTrace(c2);
+print(c2.stack.replace(/\\/g, '/'));
+print(c2.nashornException.toString().replace(/\\/g, '/'));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8062583.js.EXPECTED Fri Oct 31 16:50:31 2014 +0100
@@ -0,0 +1,8 @@
+true
+false
+CustomError
+ at <program> (test/script/basic/JDK-8062583.js:40)
+test/script/basic/JDK-8062583.js:40:4 CustomError
+CustomError
+ at <program> (test/script/basic/JDK-8062583.js:49)
+test/script/basic/JDK-8062583.js:49 CustomError