8062030: Nashorn bug retrieving array property after key string concatenation

Reviewed-by: sundar, lagergren, attila
This commit is contained in:
Hannes Wallnöfer 2014-12-15 12:32:34 +01:00
parent b7637531a9
commit 49252804f2
5 changed files with 47 additions and 11 deletions
nashorn
src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker
test

@ -40,6 +40,7 @@ import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker;
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 @@ final class BrowserJSObjectLinker implements TypeBasedGuardingDynamicLinker {
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 @@ final class BrowserJSObjectLinker implements TypeBasedGuardingDynamicLinker {
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);
}
}

@ -42,6 +42,7 @@ import jdk.internal.dynalink.support.CallSiteDescriptorFactory;
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 @@ final class JSObjectLinker implements TypeBasedGuardingDynamicLinker, GuardingTy
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 @@ final class JSObjectLinker implements TypeBasedGuardingDynamicLinker, GuardingTy
((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);
}
}

@ -74,9 +74,12 @@ function test(JSObject) {
}
};
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");
}

@ -1,5 +1,7 @@
FOO
ABC
0
bar set to 23
abc set to 23
[3] set to 23
func called with hello

@ -109,6 +109,35 @@ public class PluggableJSObjectTest {
}
}
// @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;