# HG changeset patch # User Stefan Anzinger # Date 1434559355 -7200 # Node ID 5576d06db82a9e9268214fa7905c357cd04c85b4 # Parent d333f1cf2c429545f35f712cd0c8a8bb67d52bba Fix substitution of CallSite.getTarget when receiver is ambigous; Unittests for all other substitutions which use GraphUtil.originalValue diff -r d333f1cf2c42 -r 5576d06db82a graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMethodSubstitutionTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMethodSubstitutionTest.java Wed Jun 17 16:19:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMethodSubstitutionTest.java Wed Jun 17 18:42:35 2015 +0200 @@ -22,8 +22,11 @@ */ package com.oracle.graal.hotspot.test; +import java.lang.invoke.*; + import org.junit.*; +import com.oracle.graal.api.directives.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.replacements.test.*; @@ -150,4 +153,67 @@ private static class TestClassA { } + + public static String testCallSiteGetTargetSnippet(int i) throws Exception { + ConstantCallSite site; + MethodHandles.Lookup lookup = MethodHandles.lookup(); + switch (i) { + case 1: + site = GraalDirectives.opaque(new ConstantCallSite(lookup.findVirtual(String.class, "replace", MethodType.methodType(String.class, char.class, char.class)))); + break; + default: + site = GraalDirectives.opaque(new ConstantCallSite(lookup.findStatic(java.util.Arrays.class, "asList", MethodType.methodType(java.util.List.class, Object[].class)))); + } + return site.getTarget().toString(); + } + + public static String testCastSnippet(int i, Object obj) throws Exception { + Class c; + switch (i) { + case 1: + c = GraalDirectives.opaque(Number.class); + break; + default: + c = GraalDirectives.opaque(Integer.class); + break; + } + return c.cast(obj).toString(); + } + + public static String testGetClassSnippet(int i) { + Object c; + switch (i) { + case 1: + c = GraalDirectives.opaque(new Object()); + break; + default: + c = GraalDirectives.opaque("TEST"); + break; + } + return c.getClass().toString(); + } + + /** + * Tests ambiguous receiver of CallSite.getTarget. + */ + @Test + public void testCallSiteGetTarget() { + test("testCallSiteGetTargetSnippet", 1); + } + + /** + * Tests ambiguous receiver of Class.cast. + */ + @Test + public void testCast() { + test("testCastSnippet", 1, new Integer(1)); + } + + /** + * Tests ambiguous receiver of Object.getClass. + */ + @Test + public void testGetClass() { + test("testGetClassSnippet", 1); + } } diff -r d333f1cf2c42 -r 5576d06db82a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Wed Jun 17 16:19:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Wed Jun 17 18:42:35 2015 +0200 @@ -145,12 +145,8 @@ private static void registerCallSitePlugins(InvocationPlugins plugins) { InvocationPlugin plugin = new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - ValueNode callSite = GraphUtil.originalValue(receiver.get()); - if (receiver.get() != null && callSite == null) { - // Original receiver could not be determined, we use the given receiver - callSite = receiver.get(); - } - ValueNode folded = CallSiteTargetNode.tryFold(callSite, b.getMetaAccess(), b.getAssumptions()); + ValueNode callSite = receiver.get(); + ValueNode folded = CallSiteTargetNode.tryFold(GraphUtil.originalValue(callSite), b.getMetaAccess(), b.getAssumptions()); if (folded != null) { b.addPush(Kind.Object, folded); } else {