# HG changeset patch # User sundar # Date 1385090565 -19800 # Node ID 73d741231651953b43e0d505c22beefe4d1b4066 # Parent 779e155419b8db7d8009b6044ac515b2c797fd9d# Parent b375d261e56c97690238ede599ff9be478adccd7 Merge diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/codegen/CodeGenerator.java Fri Nov 22 08:52:45 2013 +0530 @@ -2186,15 +2186,14 @@ @Override public boolean enterWhileNode(final WhileNode whileNode) { - lineNumber(whileNode); - final Expression test = whileNode.getTest(); final Block body = whileNode.getBody(); final Label breakLabel = whileNode.getBreakLabel(); final Label continueLabel = whileNode.getContinueLabel(); + final boolean isDoWhile = whileNode.isDoWhile(); final Label loopLabel = new Label("loop"); - if (!whileNode.isDoWhile()) { + if (!isDoWhile) { method._goto(continueLabel); } @@ -2202,6 +2201,7 @@ body.accept(this); if (!whileNode.isTerminal()) { method.label(continueLabel); + lineNumber(whileNode); new BranchOptimizer(this, method).execute(test, loopLabel, true); method.label(breakLabel); } diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/ir/debug/PrintVisitor.java --- a/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java Fri Nov 22 08:52:45 2013 +0530 @@ -28,6 +28,7 @@ import java.util.List; import jdk.nashorn.internal.ir.BinaryNode; import jdk.nashorn.internal.ir.Block; +import jdk.nashorn.internal.ir.BlockStatement; import jdk.nashorn.internal.ir.CaseNode; import jdk.nashorn.internal.ir.CatchNode; import jdk.nashorn.internal.ir.ExpressionStatement; @@ -141,7 +142,6 @@ @Override public boolean enterBlock(final Block block) { sb.append(' '); - //sb.append(Debug.id(block)); sb.append('{'); indent += TABWIDTH; @@ -190,8 +190,13 @@ sb.append(EOLN); indent(); sb.append('}'); - // sb.append(Debug.id(block)); + + return false; + } + @Override + public boolean enterBlockStatement(final BlockStatement statement) { + statement.getBlock().accept(this); return false; } @@ -233,7 +238,6 @@ public boolean enterFunctionNode(final FunctionNode functionNode) { functionNode.toString(sb); enterBlock(functionNode.getBody()); - //sb.append(EOLN); return false; } diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/objects/NativeArguments.java --- a/src/jdk/nashorn/internal/objects/NativeArguments.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/objects/NativeArguments.java Fri Nov 22 08:52:45 2013 +0530 @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.BitSet; import jdk.nashorn.internal.runtime.AccessorProperty; +import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.Property; import jdk.nashorn.internal.runtime.PropertyDescriptor; import jdk.nashorn.internal.runtime.PropertyMap; @@ -140,8 +141,9 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = ArrayIndex.getArrayIndex(key); - return isMapped(index) ? deleteMapped(index, strict) : super.delete(key, strict); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isMapped(index) ? deleteMapped(index, strict) : super.delete(primitiveKey, strict); } /** diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/objects/NativeObject.java --- a/src/jdk/nashorn/internal/objects/NativeObject.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/objects/NativeObject.java Fri Nov 22 08:52:45 2013 +0530 @@ -484,10 +484,12 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object hasOwnProperty(final Object self, final Object v) { - final String str = JSType.toString(v); + // Convert ScriptObjects to primitive with String.class hint + // but no need to convert other primitives to string. + final Object key = JSType.toPrimitive(v, String.class); final Object obj = Global.toObject(self); - return (obj instanceof ScriptObject) && ((ScriptObject)obj).hasOwnProperty(str); + return (obj instanceof ScriptObject) && ((ScriptObject)obj).hasOwnProperty(key); } /** diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/objects/NativeString.java --- a/src/jdk/nashorn/internal/objects/NativeString.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/objects/NativeString.java Fri Nov 22 08:52:45 2013 +0530 @@ -167,11 +167,12 @@ @SuppressWarnings("unused") private static Object get(final Object self, final Object key) { final CharSequence cs = JSType.toCharSequence(self); - final int index = ArrayIndex.getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); if (index >= 0 && index < cs.length()) { return String.valueOf(cs.charAt(index)); } - return ((ScriptObject) Global.toObject(self)).get(key); + return ((ScriptObject) Global.toObject(self)).get(primitiveKey); } @SuppressWarnings("unused") @@ -202,11 +203,12 @@ // String characters can be accessed with array-like indexing.. @Override public Object get(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); if (index >= 0 && index < value.length()) { return String.valueOf(value.charAt(index)); } - return super.get(key); + return super.get(primitiveKey); } @Override @@ -295,8 +297,9 @@ @Override public boolean has(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); - return isValid(index) || super.has(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isValid(index) || super.has(primitiveKey); } @Override @@ -318,8 +321,9 @@ @Override public boolean hasOwnProperty(final Object key) { - final int index = ArrayIndex.getArrayIndex(key); - return isValid(index) || super.hasOwnProperty(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return isValid(index) || super.hasOwnProperty(primitiveKey); } @Override @@ -358,8 +362,9 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = ArrayIndex.getArrayIndex(key); - return checkDeleteIndex(index, strict)? false : super.delete(key, strict); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = ArrayIndex.getArrayIndex(primitiveKey); + return checkDeleteIndex(index, strict)? false : super.delete(primitiveKey, strict); } private boolean checkDeleteIndex(final int index, final boolean strict) { diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/parser/Parser.java --- a/src/jdk/nashorn/internal/parser/Parser.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/parser/Parser.java Fri Nov 22 08:52:45 2013 +0530 @@ -1210,21 +1210,24 @@ */ private void whileStatement() { // Capture WHILE token. - final int whileLine = line; final long whileToken = token; // WHILE tested in caller. next(); // Construct WHILE node. - WhileNode whileNode = new WhileNode(whileLine, whileToken, Token.descPosition(whileToken), false); + WhileNode whileNode = new WhileNode(line, whileToken, Token.descPosition(whileToken), false); lc.push(whileNode); try { expect(LPAREN); - whileNode = whileNode.setTest(lc, expression()); + final int whileLine = line; + final Expression test = expression(); expect(RPAREN); - whileNode = whileNode.setBody(lc, getStatement()); - appendStatement(whileNode); + final Block body = getStatement(); + appendStatement(whileNode = + new WhileNode(whileLine, whileToken, finish, false). + setTest(lc, test). + setBody(lc, body)); } finally { lc.pop(whileNode); } @@ -1242,28 +1245,33 @@ */ private void doStatement() { // Capture DO token. - final int doLine = line; final long doToken = token; // DO tested in the caller. next(); - WhileNode doWhileNode = new WhileNode(doLine, doToken, Token.descPosition(doToken), true); + WhileNode doWhileNode = new WhileNode(-1, doToken, Token.descPosition(doToken), true); lc.push(doWhileNode); try { // Get DO body. - doWhileNode = doWhileNode.setBody(lc, getStatement()); + final Block body = getStatement(); expect(WHILE); expect(LPAREN); - doWhileNode = doWhileNode.setTest(lc, expression()); + final int doLine = line; + final Expression test = expression(); expect(RPAREN); if (type == SEMICOLON) { endOfLine(); } doWhileNode.setFinish(finish); - appendStatement(doWhileNode); + + //line number is last + appendStatement(doWhileNode = + new WhileNode(doLine, doToken, finish, true). + setBody(lc, body). + setTest(lc, test)); } finally { lc.pop(doWhileNode); } diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/runtime/ScriptObject.java --- a/src/jdk/nashorn/internal/runtime/ScriptObject.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java Fri Nov 22 08:52:45 2013 +0530 @@ -2373,11 +2373,13 @@ private int getInt(final int index, final String key) { if (isValidArrayIndex(index)) { - for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getIntValue(find); + for (ScriptObject object = this; ; ) { + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getIntValue(find); + } } if ((object = object.getProto()) == null) { @@ -2389,7 +2391,7 @@ if (array.has(index)) { return array.getInt(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2403,14 +2405,15 @@ @Override public int getInt(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getInt(index); } - return getInt(index, JSType.toString(key)); + return getInt(index, JSType.toString(primitiveKey)); } @Override @@ -2439,22 +2442,25 @@ @Override public int getInt(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getInt(key); + if (array.has(index)) { + return array.getInt(index); } - return getInt(key, JSType.toString(key)); + return getInt(index, JSType.toString(key)); } private long getLong(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getLongValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getLongValue(find); + } } if ((object = object.getProto()) == null) { @@ -2466,7 +2472,7 @@ if (array.has(index)) { return array.getLong(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2480,14 +2486,15 @@ @Override public long getLong(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getLong(index); } - return getLong(index, JSType.toString(key)); + return getLong(index, JSType.toString(primitiveKey)); } @Override @@ -2516,22 +2523,25 @@ @Override public long getLong(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getLong(key); + if (array.has(index)) { + return array.getLong(index); } - return getLong(key, JSType.toString(key)); + return getLong(index, JSType.toString(key)); } private double getDouble(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getDoubleValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getDoubleValue(find); + } } if ((object = object.getProto()) == null) { @@ -2543,7 +2553,7 @@ if (array.has(index)) { return array.getDouble(index); } - } + } } else { final FindProperty find = findProperty(key, true); @@ -2557,14 +2567,15 @@ @Override public double getDouble(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getDouble(index); } - return getDouble(index, JSType.toString(key)); + return getDouble(index, JSType.toString(primitiveKey)); } @Override @@ -2593,22 +2604,25 @@ @Override public double getDouble(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getDouble(key); + if (array.has(index)) { + return array.getDouble(index); } - return getDouble(key, JSType.toString(key)); + return getDouble(index, JSType.toString(key)); } private Object get(final int index, final String key) { if (isValidArrayIndex(index)) { for (ScriptObject object = this; ; ) { - final FindProperty find = object.findProperty(key, false, false, this); - - if (find != null) { - return getObjectValue(find); + if (object.getMap().containsArrayKeys()) { + final FindProperty find = object.findProperty(key, false, false, this); + + if (find != null) { + return getObjectValue(find); + } } if ((object = object.getProto()) == null) { @@ -2634,14 +2648,15 @@ @Override public Object get(final Object key) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { return array.getObject(index); } - return get(index, JSType.toString(key)); + return get(index, JSType.toString(primitiveKey)); } @Override @@ -2670,13 +2685,14 @@ @Override public Object get(final int key) { + final int index = getArrayIndex(key); final ArrayData array = getArray(); - if (array.has(key)) { - return array.getObject(key); + if (array.has(index)) { + return array.getObject(index); } - return get(key, JSType.toString(key)); + return get(index, JSType.toString(key)); } /** @@ -2688,7 +2704,7 @@ */ private void doesNotHave(final int index, final Object value, final boolean strict) { final long oldLength = getArray().length(); - final long longIndex = index & JSType.MAX_UINT; + final long longIndex = ArrayIndex.toLongIndex(index); if (getMap().containsArrayKeys()) { final String key = JSType.toString(longIndex); @@ -2774,7 +2790,8 @@ @Override public void set(final Object key, final int value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2786,13 +2803,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final long value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2804,13 +2822,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final double value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2822,13 +2841,14 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, JSType.toObject(value)); } @Override public void set(final Object key, final Object value, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); if (isValidArrayIndex(index)) { if (getArray().has(index)) { @@ -2840,7 +2860,7 @@ return; } - final String propName = JSType.toString(key); + final String propName = JSType.toString(primitiveKey); setObject(findProperty(propName, true), strict, propName, value); } @@ -3062,82 +3082,69 @@ @Override public boolean has(final Object key) { - final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + final Object primitiveKey = JSType.toPrimitive(key); + final int index = getArrayIndex(primitiveKey); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(primitiveKey), true); } @Override public boolean has(final double key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); } @Override public boolean has(final long key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } - } - } - - return hasProperty(JSType.toString(key), true); + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); } @Override public boolean has(final int key) { final int index = getArrayIndex(key); - - if (isValidArrayIndex(index)) { - for (ScriptObject self = this; self != null; self = self.getProto()) { - if (self.getArray().has(index)) { - return true; - } + return isValidArrayIndex(index) ? hasArrayProperty(index) : hasProperty(JSType.toString(key), true); + } + + private boolean hasArrayProperty(final int index) { + boolean hasArrayKeys = false; + + for (ScriptObject self = this; self != null; self = self.getProto()) { + if (self.getArray().has(index)) { + return true; } + hasArrayKeys = hasArrayKeys || self.getMap().containsArrayKeys(); } - return hasProperty(JSType.toString(key), true); + return hasArrayKeys && hasProperty(ArrayIndex.toKey(index), true); } @Override public boolean hasOwnProperty(final Object key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(primitiveKey), false); } @Override public boolean hasOwnProperty(final int key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); } @Override public boolean hasOwnProperty(final long key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); } @Override public boolean hasOwnProperty(final double key) { - return getArray().has(getArrayIndex(key)) || hasProperty(JSType.toString(key), false); + final int index = getArrayIndex(key); + return isValidArrayIndex(index) ? hasOwnArrayProperty(index) : hasProperty(JSType.toString(key), false); + } + + private boolean hasOwnArrayProperty(final int index) { + return getArray().has(index) || (getMap().containsArrayKeys() && hasProperty(ArrayIndex.toKey(index), false)); } @Override @@ -3190,7 +3197,8 @@ @Override public boolean delete(final Object key, final boolean strict) { - final int index = getArrayIndex(key); + final Object primitiveKey = JSType.toPrimitive(key, String.class); + final int index = getArrayIndex(primitiveKey); final ArrayData array = getArray(); if (array.has(index)) { @@ -3201,7 +3209,7 @@ return false; } - return deleteObject(key, strict); + return deleteObject(primitiveKey, strict); } private boolean deleteObject(final Object key, final boolean strict) { diff -r 779e155419b8 -r 73d741231651 src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java --- a/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Mon Nov 04 11:11:03 2013 +0100 +++ b/src/jdk/nashorn/internal/runtime/arrays/ArrayIndex.java Fri Nov 22 08:52:45 2013 +0530 @@ -27,6 +27,7 @@ import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; +import jdk.nashorn.internal.runtime.ScriptObject; /** * Array index computation helpers. that both throw exceptions or return @@ -80,7 +81,12 @@ * Returns a valid array index in an int, if the object represents one. This * routine needs to perform quickly since all keys are tested with it. * - * @param key key to check for array index + *

The {@code key} parameter must be a JavaScript primitive type, i.e. one of + * {@code String}, {@code Number}, {@code Boolean}, {@code null}, or {@code undefined}. + * {@code ScriptObject} instances should be converted to primitive with + * {@code String.class} hint before being passed to this method.

+ * + * @param key key to check for array index. * @return the array index, or {@code -1} if {@code key} does not represent a valid index. * Note that negative return values other than {@code -1} are considered valid and can be converted to * the actual index using {@link #toLongIndex(int)}. @@ -88,18 +94,31 @@ public static int getArrayIndex(final Object key) { if (key instanceof Integer) { return getArrayIndex(((Integer) key).intValue()); - } else if (key instanceof Number) { - return getArrayIndex(((Number) key).doubleValue()); + } else if (key instanceof Double) { + return getArrayIndex(((Double) key).doubleValue()); } else if (key instanceof String) { return (int)fromString((String) key); + } else if (key instanceof Long) { + return getArrayIndex(((Long) key).longValue()); } else if (key instanceof ConsString) { return (int)fromString(key.toString()); } + assert !(key instanceof ScriptObject); return INVALID_ARRAY_INDEX; } /** + * Returns a valid array index in an int, if {@code key} represents one. + * + * @param key key to check + * @return the array index, or {@code -1} if {@code key} is not a valid array index. + */ + public static int getArrayIndex(final int key) { + return (key >= 0) ? key : INVALID_ARRAY_INDEX; + } + + /** * Returns a valid array index in an int, if the long represents one. * * @param key key to check @@ -129,10 +148,7 @@ */ public static int getArrayIndex(final double key) { if (JSType.isRepresentableAsInt(key)) { - final int intKey = (int)key; - if (intKey >= 0) { - return intKey; - } + return getArrayIndex((int) key); } else if (JSType.isRepresentableAsLong(key)) { return getArrayIndex((long) key); } @@ -177,5 +193,16 @@ return index & JSType.MAX_UINT; } + /** + * Convert an index to a key string. This is the same as calling {@link #toLongIndex(int)} + * and converting the result to String. + * + * @param index index to convert + * @return index as string + */ + public static String toKey(final int index) { + return Long.toString(index & JSType.MAX_UINT); + } + } diff -r 779e155419b8 -r 73d741231651 test/script/basic/JDK-8028210.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028210.js Fri Nov 22 08:52:45 2013 +0530 @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2010, 2013, 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-8028210: Missing conversions on array index expression + * + * @test + * @run + */ + +var array = [1, 2]; +var key1 = [[[0]]]; +var key2 = new String("1"); +var key3 = { + toString: function() { + print("toString called"); + return "2"; + } +}; + +print(array[key1]); +print(array[key2]); +array[key3] = 3; +print(array[key3]); +print(key3 in array); +print(array.hasOwnProperty(key3)); +print(delete array[key3]); +print(array[key3]); + +// string access +print("abc"[key1]); +print("abc"[key2]); +print("abc"[key3]); + +// arguments object +(function(a, b, c) { + print(arguments[key3]); + delete arguments[key3]; + print(arguments[key3], c); +})(1, 2, 3); + +// int keys +array = []; +array[4294967294] = 1; +print(array[-2]); +print(array[4294967294]); +print(-2 in array); +print(4294967294 in array); +print(delete(array[-2])); +print(array[4294967294]); +print(delete(array[4294967294])); +print(array[4294967294]); + +array = []; +array[-2] = 1; +print(array[-2]); +print(array[4294967294]); +print(-2 in array); +print(4294967294 in array); +print(delete(array[4294967294])); +print(array[-2]); +print(delete(array[-2])); +print(array[-2]); diff -r 779e155419b8 -r 73d741231651 test/script/basic/JDK-8028210.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028210.js.EXPECTED Fri Nov 22 08:52:45 2013 +0530 @@ -0,0 +1,38 @@ +1 +2 +toString called +toString called +3 +toString called +true +toString called +true +toString called +true +toString called +undefined +a +b +toString called +c +toString called +3 +toString called +toString called +undefined 3 +undefined +1 +false +true +true +1 +true +undefined +1 +undefined +true +false +true +1 +true +undefined diff -r 779e155419b8 -r 73d741231651 test/script/basic/JDK-8028434.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028434.js Fri Nov 22 08:52:45 2013 +0530 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2010, 2013, 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-8028434: Check that the line number of the tests in while and do while loops + * is correct. It needs to correspond to the line with the test expression. + * + * @test + * @run + */ + +try { + while (test.apa < 0) { + print("x"); + } +} catch (e) { + var st = e.getStackTrace(); + if (st.length != 1) { + print("erroneous stacktrace length " + s.length); + } + if (st[0].lineNumber !== 33) { + print("erroneous stacktrace element, lineNumber=" + st[0].lineNumber + " elem=" + st); + } +} + +try { + do { + print("x"); + } while (test.apa < 0); +} catch (e) { + var st = e.getStackTrace(); + if (st.length != 1) { + print("erroneous stacktrace length " + s.length); + } + if (st[0].lineNumber !== 49) { + print("erroneous stacktrace element, lineNumber= " + st[0].lineNumber + " elem=" + st); + } +} diff -r 779e155419b8 -r 73d741231651 test/script/basic/JDK-8028434.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8028434.js.EXPECTED Fri Nov 22 08:52:45 2013 +0530 @@ -0,0 +1,1 @@ +x diff -r 779e155419b8 -r 73d741231651 test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java --- a/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Mon Nov 04 11:11:03 2013 +0100 +++ b/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Fri Nov 22 08:52:45 2013 +0530 @@ -50,7 +50,7 @@ * * @test * @build jdk.nashorn.api.scripting.Window jdk.nashorn.api.scripting.WindowEventHandler jdk.nashorn.api.scripting.VariableArityTestInterface jdk.nashorn.api.scripting.ScriptEngineTest - * @run testng jdk.nashorn.api.scripting.ScriptEngineTest + * @run testng/othervm jdk.nashorn.api.scripting.ScriptEngineTest */ public class ScriptEngineTest {