8075366: Slow scope access to global let/const does not work
Reviewed-by: sundar, attila, lagergren
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Mar 26 16:17:38 2015 +0100
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Mar 26 21:39:25 2015 +0100
@@ -60,6 +60,7 @@
import jdk.nashorn.internal.objects.annotations.Setter;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ECMAErrors;
+import jdk.nashorn.internal.runtime.FindProperty;
import jdk.nashorn.internal.runtime.GlobalConstants;
import jdk.nashorn.internal.runtime.GlobalFunctions;
import jdk.nashorn.internal.runtime.JSType;
@@ -2204,6 +2205,17 @@
}
@Override
+ protected FindProperty findProperty(final String key, final boolean deep, final ScriptObject start) {
+ if (lexicalScope != null && start != this && start.isScope()) {
+ final FindProperty find = lexicalScope.findProperty(key, false);
+ if (find != null) {
+ return find;
+ }
+ }
+ return super.findProperty(key, deep, start);
+ }
+
+ @Override
public GuardedInvocation findSetMethod(final CallSiteDescriptor desc, final LinkRequest request) {
final boolean isScope = NashornCallSiteDescriptor.isScope(desc);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Mar 26 16:17:38 2015 +0100
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Mar 26 21:39:25 2015 +0100
@@ -812,7 +812,7 @@
*
* @return FindPropertyData or null if not found.
*/
- FindProperty findProperty(final String key, final boolean deep, final ScriptObject start) {
+ protected FindProperty findProperty(final String key, final boolean deep, final ScriptObject start) {
final PropertyMap selfMap = getMap();
final Property property = selfMap.findProperty(key);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Mar 26 16:17:38 2015 +0100
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Mar 26 21:39:25 2015 +0100
@@ -198,7 +198,7 @@
* @return FindPropertyData or null if not found.
*/
@Override
- FindProperty findProperty(final String key, final boolean deep, final ScriptObject start) {
+ protected FindProperty findProperty(final String key, final boolean deep, final ScriptObject start) {
// We call findProperty on 'expression' with 'expression' itself as start parameter.
// This way in ScriptObject.setObject we can tell the property is from a 'with' expression
// (as opposed from another non-scope object in the proto chain such as Object.prototype).
--- a/nashorn/test/script/basic/es6/let-eval.js Thu Mar 26 16:17:38 2015 +0100
+++ b/nashorn/test/script/basic/es6/let-eval.js Thu Mar 26 21:39:25 2015 +0100
@@ -96,3 +96,9 @@
f();
print(typeof a, typeof b, typeof c, typeof x, typeof z);
+
+let v = 1;
+eval("print('v: ' + v); v = 2; print ('v: ' + v);");
+print("this.v: " + this.v);
+print("v: " + v);
+
--- a/nashorn/test/script/basic/es6/let-eval.js.EXPECTED Thu Mar 26 16:17:38 2015 +0100
+++ b/nashorn/test/script/basic/es6/let-eval.js.EXPECTED Thu Mar 26 21:39:25 2015 +0100
@@ -14,3 +14,7 @@
2 1 0
2 1 0 undefined
undefined undefined undefined undefined undefined
+v: 1
+v: 2
+this.v: undefined
+v: 2