8058545: With strict mode, bean property assignment of a non-existent property should result in TypeError
authorsundar
Tue, 16 Sep 2014 17:04:35 +0530
changeset 26649 1d7a917a35e2
parent 26648 9a64e15eff37
child 26650 6652a6d37d93
8058545: With strict mode, bean property assignment of a non-existent property should result in TypeError Reviewed-by: hannesw, lagergren
nashorn/README
nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java
nashorn/test/script/basic/JDK-8058545.js
--- 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);
+    }
+}