8058545: With strict mode, bean property assignment of a non-existent property should result in TypeError
Reviewed-by: hannesw, lagergren
--- a/nashorn/README Mon Sep 15 17:51:11 2014 +0200
+++ b/nashorn/README Tue Sep 16 17:04:35 2014 +0530
@@ -1,152 +1,1 @@
-- What is Nashorn?
-
-Nashorn is a runtime environment for programs written in ECMAScript 5.1
-that runs on top of JVM.
-
-- How to find out more about ECMAScript 5.1?
-
-The specification can be found at
-
- http://www.ecma-international.org/publications/standards/Ecma-262.htm
-
-- How to checkout sources of Nashorn project?
-
-Nashorn project uses Mercurial source code control system. You can
-download Mercurial from http://mercurial.selenic.com/wiki/Download
-
-Information about the forest extension can be found at
-
- http://mercurial.selenic.com/wiki/ForestExtension
-
-and downlaoded using
-
- hg clone https://bitbucket.org/gxti/hgforest
-
-You can clone Nashorn Mercurial forest using this command:
-
- hg fclone http://hg.openjdk.java.net/nashorn/jdk8 nashorn~jdk8
-
-To update your copy of the forest (fwith the latest code:
-
- (cd nashorn~jdk8 ; hg fpull)
-
-Or just the nashorn subdirectory with
-
- (cd nashorn~jdk8/nashorn ; hg pull -u)
-
-To learn about Mercurial in detail, please visit http://hgbook.red-bean.com.
-
-- How to build?
-
-To build Nashorn, you need to install JDK 8. You may use the Nashorn
-forest build (recommended) or down load from java.net. You will need to
-set JAVA_HOME environmental variable to point to your JDK installation
-directory.
-
- cd nashorn~jdk8/nashorn/make
- ant clean; ant
-
-- How to run?
-
-Use the jjs script (see RELESE_README):
-
- cd nashorn~jdk8/nashorn
- sh bin/jjs <your .js file>
-
-Nashorn supports javax.script API. It is possible to drop nashorn.jar in
-class path and request for "nashorn" script engine from
-javax.script.ScriptEngineManager.
-
-Look for samples under the directory test/src/jdk/nashorn/api/scripting/.
-
-- Documentation
-
-Comprehensive development documentation is found in the Nashorn JavaDoc. You can
-build it using:
-
- cd nashorn~jdk8/nashorn/make
- ant javadoc
-
-after which you can view the generated documentation at dist/javadoc/index.html.
-
-- Running tests
-
-Nashorn tests are TestNG based. Running tests requires downloading the
-TestNG library and placing its jar file into the lib subdirectory:
-
- # download and install TestNG
- wget http://testng.org/testng-x.y.z.zip
- unzip testng-x.y.z.zip
- cp testng-x.y.z/testng-x.y.z.jar test/lib/testng.jar
-
-After that, you can run the tests using:
- cd make
- ant clean test
-
-You can also run the ECMA-262 test suite with Nashorn. In order to do
-that, you will need to get a copy of it and put it in
-test/script/external/test262 directory. A convenient way to do it is:
-
- git clone https://github.com/tc39/test262 test/script/external/test262
-
-Alternatively, you can check it out elsewhere and make
-test/script/external/test262 a symbolic link to that directory. After
-you've done this, you can run the ECMA-262 tests using:
-
- cd nashorn~jdk8/nashorn/make
- ant test262
-
-Ant target to get/update external test suites:
-
- ant externals
- ant update-externals
-
-These tests take time, so we have a parallelized runner for them that
-takes advantage of all processor cores on the computer:
-
- cd nashorn~jdk8/nashorn/make
- ant test262parallel
-
-- How to write your own test?
-
-Nashorn uses it's own simple test framework. Any .js file dropped under
-nashorn/test directory is considered as a test. A test file can
-optionally have .js.EXPECTED (foo.js.EXPECTED for foo.js) associated
-with it. The .EXPECTED file, if exists, should contain the output
-expected from compiling and/or running the test file.
-
-The test runner crawls these directories for .js files and looks for
-JTReg-style @foo comments to identify tests.
-
- * @test - A test is tagged with @test.
-
- * @test/fail - Tests that are supposed to fail (compiling, see @run/fail
- for runtime) are tagged with @test/fail.
-
- * @test/compile-error - Test expects compilation to fail, compares
- output.
-
- * @test/warning - Test expects compiler warnings, compares output.
-
- * @test/nocompare - Test expects to compile [and/or run?]
- successfully(may be warnings), does not compare output.
-
- * @subtest - denotes necessary file for a main test file; itself is not
- a test.
-
- * @run - A test that should be run is also tagged with @run (otherwise
- the test runner only compiles the test).
-
- * @run/fail - A test that should compile but fail with a runtime error.
-
- * @run/ignore-std-error - script may produce output on stderr, ignore
- this output.
-
- * @argument - pass an argument to script.
-
- * @option \ - pass option to engine, sample.
-
-/**
- * @option --dump-ir-graph
- * @test
- */
+8058545: With strict mode, bean property assignment of a non-existent property should result in TypeError
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java Mon Sep 15 17:51:11 2014 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java Tue Sep 16 17:04:35 2014 +0530
@@ -131,11 +131,16 @@
}
return getInvocation(EMPTY_ELEM_GETTER, self, linkerServices, desc);
case "setProp":
- case "setElem":
+ case "setElem": {
+ final boolean strict = NashornCallSiteDescriptor.isStrict(desc);
+ if (strict) {
+ throw typeError("cant.set.property", getArgument(linkRequest), ScriptRuntime.safeToString(self));
+ }
if (desc.getOperand() != null) {
return getInvocation(EMPTY_PROP_SETTER, self, linkerServices, desc);
}
return getInvocation(EMPTY_ELEM_SETTER, self, linkerServices, desc);
+ }
default:
break;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8058545.js Tue Sep 16 17:04:35 2014 +0530
@@ -0,0 +1,41 @@
+/*
+ * 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-8058545: With strict mode, bean property assignment of a non-existent property should result in TypeError
+ *
+ * @test
+ * @run
+ */
+
+'use strict';
+var File = Java.type("java.io.File");
+var f = new File(".");
+try {
+ f.foo = 33;
+ fail("Should have thrown TypeError");
+} catch (e) {
+ if (! (e instanceof TypeError)) {
+ fail("Expected TypeError, got " + e);
+ }
+}