# HG changeset patch # User hannesw # Date 1418643154 -3600 # Node ID 118973efb1d3843e575545b617eadd58e1491586 # Parent 7737b6eae7cb67bfabbcab477c414ef05d0ecf14 8062030: Nashorn bug retrieving array property after key string concatenation Reviewed-by: sundar, lagergren, attila diff -r 7737b6eae7cb -r 118973efb1d3 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Mon Dec 15 12:08:36 2014 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java Mon Dec 15 12:32:34 2014 +0100 @@ -40,6 +40,7 @@ import jdk.internal.dynalink.support.CallSiteDescriptorFactory; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; +import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; /** @@ -185,12 +186,12 @@ if (index > -1) { return JSOBJECT_GETSLOT.invokeExact(jsobj, index); } - } else if (key instanceof String) { - final String name = (String)key; + } else if (key instanceof String || key instanceof ConsString) { + final String name = key.toString(); if (name.indexOf('(') != -1) { - return fallback.invokeExact(jsobj, key); + return fallback.invokeExact(jsobj, (Object) name); } - return JSOBJECT_GETMEMBER.invokeExact(jsobj, (String)key); + return JSOBJECT_GETMEMBER.invokeExact(jsobj, name); } return null; } @@ -201,8 +202,8 @@ JSOBJECT_SETSLOT.invokeExact(jsobj, (int)key, value); } else if (key instanceof Number) { JSOBJECT_SETSLOT.invokeExact(jsobj, getIndex((Number)key), value); - } else if (key instanceof String) { - JSOBJECT_SETMEMBER.invokeExact(jsobj, (String)key, value); + } else if (key instanceof String || key instanceof ConsString) { + JSOBJECT_SETMEMBER.invokeExact(jsobj, key.toString(), value); } } diff -r 7737b6eae7cb -r 118973efb1d3 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Mon Dec 15 12:08:36 2014 +0100 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java Mon Dec 15 12:32:34 2014 +0100 @@ -42,6 +42,7 @@ import jdk.nashorn.api.scripting.JSObject; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; +import jdk.nashorn.internal.runtime.ConsString; import jdk.nashorn.internal.runtime.JSType; /** @@ -185,11 +186,11 @@ if (index > -1) { return ((JSObject)jsobj).getSlot(index); } - } else if (key instanceof String) { - final String name = (String)key; + } else if (key instanceof String || key instanceof ConsString) { + final String name = key.toString(); // get with method name and signature. delegate it to beans linker! if (name.indexOf('(') != -1) { - return fallback.invokeExact(jsobj, key); + return fallback.invokeExact(jsobj, (Object) name); } return ((JSObject)jsobj).getMember(name); } @@ -202,8 +203,8 @@ ((JSObject)jsobj).setSlot((Integer)key, value); } else if (key instanceof Number) { ((JSObject)jsobj).setSlot(getIndex((Number)key), value); - } else if (key instanceof String) { - ((JSObject)jsobj).setMember((String)key, value); + } else if (key instanceof String || key instanceof ConsString) { + ((JSObject)jsobj).setMember(key.toString(), value); } } diff -r 7737b6eae7cb -r 118973efb1d3 nashorn/test/script/basic/JDK-8055762.js --- a/nashorn/test/script/basic/JDK-8055762.js Mon Dec 15 12:08:36 2014 +0100 +++ b/nashorn/test/script/basic/JDK-8055762.js Mon Dec 15 12:32:34 2014 +0100 @@ -74,9 +74,12 @@ } }; + var a = "a"; print(obj["foo"]); + print(obj[a + "bc"]); print(obj[2]); obj.bar = 23; + obj[a + "bc"] = 23; obj[3] = 23; obj.func("hello"); } diff -r 7737b6eae7cb -r 118973efb1d3 nashorn/test/script/basic/JDK-8055762.js.EXPECTED --- a/nashorn/test/script/basic/JDK-8055762.js.EXPECTED Mon Dec 15 12:08:36 2014 +0100 +++ b/nashorn/test/script/basic/JDK-8055762.js.EXPECTED Mon Dec 15 12:32:34 2014 +0100 @@ -1,5 +1,7 @@ FOO +ABC 0 bar set to 23 +abc set to 23 [3] set to 23 func called with hello diff -r 7737b6eae7cb -r 118973efb1d3 nashorn/test/src/jdk/nashorn/api/scripting/PluggableJSObjectTest.java --- a/nashorn/test/src/jdk/nashorn/api/scripting/PluggableJSObjectTest.java Mon Dec 15 12:08:36 2014 +0100 +++ b/nashorn/test/src/jdk/nashorn/api/scripting/PluggableJSObjectTest.java Mon Dec 15 12:32:34 2014 +0100 @@ -109,6 +109,35 @@ } } + // @bug 8062030: Nashorn bug retrieving array property after key string concatenation + @Test + // ConsString attribute access on a JSObject + public void consStringTest() { + final ScriptEngineManager m = new ScriptEngineManager(); + final ScriptEngine e = m.getEngineByName("nashorn"); + try { + final MapWrapperObject obj = new MapWrapperObject(); + e.put("obj", obj); + e.put("f", "f"); + e.eval("obj[f + 'oo'] = 'bar';"); + + assertEquals(obj.getMap().get("foo"), "bar"); + assertEquals(e.eval("obj[f + 'oo']"), "bar"); + assertEquals(e.eval("obj['foo']"), "bar"); + assertEquals(e.eval("f + 'oo' in obj"), Boolean.TRUE); + assertEquals(e.eval("'foo' in obj"), Boolean.TRUE); + e.eval("delete obj[f + 'oo']"); + assertFalse(obj.getMap().containsKey("foo")); + assertEquals(e.eval("obj[f + 'oo']"), null); + assertEquals(e.eval("obj['foo']"), null); + assertEquals(e.eval("f + 'oo' in obj"), Boolean.FALSE); + assertEquals(e.eval("'foo' in obj"), Boolean.FALSE); + } catch (final Exception exp) { + exp.printStackTrace(); + fail(exp.getMessage()); + } + } + public static class BufferObject extends AbstractJSObject { private final IntBuffer buf;