--- old/test/src/jdk/dynalink/test/DynamicLinkerFactoryTest.java 2016-02-29 10:05:10.413151900 +0530 +++ new/test/src/jdk/dynalink/test/DynamicLinkerFactoryTest.java 2016-02-29 10:05:10.033151400 +0530 @@ -30,10 +30,13 @@ import java.lang.invoke.MethodType; import java.util.List; import java.util.ServiceConfigurationError; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; import jdk.dynalink.CallSiteDescriptor; import jdk.dynalink.DynamicLinker; import jdk.dynalink.DynamicLinkerFactory; import jdk.dynalink.NoSuchDynamicMethodException; +import jdk.dynalink.NamedOperation; import jdk.dynalink.Operation; import jdk.dynalink.StandardOperation; import jdk.dynalink.linker.GuardingDynamicLinker; @@ -41,6 +44,7 @@ import jdk.dynalink.linker.LinkerServices; import jdk.dynalink.support.SimpleRelinkableCallSite; import jdk.dynalink.linker.GuardedInvocation; +import jdk.nashorn.api.scripting.AbstractJSObject; import org.testng.Assert; import org.testng.annotations.Test; @@ -254,4 +258,44 @@ Assert.assertTrue(reachedAutoLinker); } + + @Test + public void nashornExportedLinkersTest() { + final DynamicLinkerFactory factory = newDynamicLinkerFactory(false); + final DynamicLinker linker = factory.createLinker(); + + final MethodType mt = MethodType.methodType(Object.class, Object.class); + final NamedOperation op = new NamedOperation(StandardOperation.GET_PROPERTY, "foo"); + final CallSite cs = linker.link(new SimpleRelinkableCallSite(new CallSiteDescriptor( + MethodHandles.publicLookup(), op, mt))); + final boolean[] reachedGetMember = new boolean[1]; + // check that the nashorn exported linker can be used for user defined JSObject + Object obj = new AbstractJSObject() { + @Override + public Object getMember(String name) { + reachedGetMember[0] = true; + return name.equals("foo")? "bar" : ""; + } + }; + + Object value = null; + try { + value = cs.getTarget().invoke(obj); + } catch (Throwable th) { + throw new RuntimeException(th); + } + + Assert.assertTrue(reachedGetMember[0]); + Assert.assertEquals(value, "bar"); + + // check that the nashorn exported linker can be used for ScriptObjectMirror + final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); + try { + obj = engine.eval("({ foo: 'hello' })"); + value = cs.getTarget().invoke(obj); + } catch (Throwable th) { + throw new RuntimeException(th); + } + Assert.assertEquals(value, "hello"); + } }