changeset 16500:48d26e6289c7

added tests for type resolution
author Doug Simon <doug.simon@oracle.com>
date Fri, 11 Jul 2014 17:54:57 +0200
parents a0f3688ce052
children f0f4402a4f65
files graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ResolvedJavaTypeResolveMethodTest.java graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestJavaType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java
diffstat 3 files changed, 96 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ResolvedJavaTypeResolveMethodTest.java	Fri Jul 11 16:48:59 2014 +0200
+++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ResolvedJavaTypeResolveMethodTest.java	Fri Jul 11 17:54:57 2014 +0200
@@ -156,7 +156,7 @@
 
     }
 
-    private static ResolvedJavaMethod getMethod(ResolvedJavaType type, String methodName) {
+    static ResolvedJavaMethod getMethod(ResolvedJavaType type, String methodName) {
         for (ResolvedJavaMethod method : type.getDeclaredMethods()) {
             if (method.getName().equals(methodName)) {
                 return method;
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestJavaType.java	Fri Jul 11 16:48:59 2014 +0200
+++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestJavaType.java	Fri Jul 11 17:54:57 2014 +0200
@@ -24,6 +24,11 @@
 
 import static org.junit.Assert.*;
 
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.stream.*;
+
 import org.junit.*;
 
 import com.oracle.graal.api.meta.*;
@@ -45,4 +50,91 @@
             assertEquals(expected, actual);
         }
     }
+
+    static class A {
+        A or(A other) {
+            return other;
+        }
+    }
+
+    @Test
+    public void testResolve() throws ClassNotFoundException {
+        String classPath = System.getProperty("java.class.path");
+        String[] parts = classPath.split(File.pathSeparator);
+        URL[] urls = Arrays.asList(parts).stream().map(e -> asURL(e)).collect(Collectors.toList()).toArray(new URL[parts.length]);
+        URLClassLoader clOne = newClassLoader(urls);
+        URLClassLoader clTwo = newClassLoader(urls);
+
+        String className = getClass().getName() + "$A";
+        Class<?> aClassOne = Class.forName(className, true, clOne);
+        Class<?> aClassTwo = Class.forName(getClass().getName() + "$A", true, clTwo);
+
+        assertNotEquals(aClassOne, aClassTwo);
+        assertNotEquals(aClassOne.getClassLoader(), aClassTwo.getClassLoader());
+
+        ResolvedJavaType aTypeOne = metaAccess.lookupJavaType(aClassOne);
+        ResolvedJavaType aTypeTwo = metaAccess.lookupJavaType(aClassTwo);
+
+        assertNotEquals(aTypeOne, aTypeTwo);
+
+        checkResolveWithoutAccessingClass(aTypeOne);
+        checkResolveWithoutAccessingClass(aTypeTwo);
+
+        assertEquals(aTypeOne.resolve(aTypeOne), aTypeOne);
+        assertNotEquals(aTypeOne.resolve(aTypeTwo), aTypeOne);
+        assertEquals(aTypeOne.resolve(aTypeTwo), aTypeTwo);
+
+        assertEquals(aTypeTwo.resolve(aTypeTwo), aTypeTwo);
+        assertNotEquals(aTypeTwo.resolve(aTypeOne), aTypeTwo);
+        assertEquals(aTypeTwo.resolve(aTypeOne), aTypeOne);
+
+        ResolvedJavaMethod m = ResolvedJavaTypeResolveMethodTest.getMethod(aTypeOne, "or");
+        JavaType resolvedTypeOne = m.getSignature().getParameterType(0, aTypeOne);
+        JavaType resolvedTypeTwo = m.getSignature().getReturnType(aTypeOne);
+        JavaType unresolvedTypeOne = m.getSignature().getParameterType(0, null);
+        JavaType unresolvedTypeTwo = m.getSignature().getReturnType(null);
+
+        assertTrue(resolvedTypeOne instanceof ResolvedJavaType);
+        assertTrue(resolvedTypeTwo instanceof ResolvedJavaType);
+        assertFalse(unresolvedTypeOne instanceof ResolvedJavaType);
+        assertFalse(unresolvedTypeTwo instanceof ResolvedJavaType);
+
+        assertEquals(resolvedTypeOne.resolve(aTypeOne), aTypeOne);
+        assertEquals(resolvedTypeOne.resolve(aTypeTwo), aTypeTwo);
+        assertEquals(resolvedTypeTwo.resolve(aTypeOne), aTypeOne);
+        assertEquals(resolvedTypeTwo.resolve(aTypeTwo), aTypeTwo);
+
+        checkResolveWithoutAccessingClass(unresolvedTypeOne);
+        checkResolveWithoutAccessingClass(unresolvedTypeTwo);
+
+        assertEquals(unresolvedTypeOne.resolve(aTypeOne), aTypeOne);
+        assertEquals(unresolvedTypeOne.resolve(aTypeTwo), aTypeTwo);
+    }
+
+    private static void checkResolveWithoutAccessingClass(JavaType type) {
+        try {
+            type.resolve(null);
+            fail();
+        } catch (NullPointerException e) {
+        }
+    }
+
+    private static URLClassLoader newClassLoader(URL[] urls) {
+        URLClassLoader cl = new URLClassLoader(urls) {
+            @Override
+            protected java.lang.Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+                boolean callSuper = name.startsWith("java/") || name.startsWith("java.");
+                return callSuper ? super.loadClass(name, resolve) : super.findClass(name);
+            }
+        };
+        return cl;
+    }
+
+    private static URL asURL(String e) {
+        try {
+            return new File(e).toURI().toURL();
+        } catch (MalformedURLException e1) {
+            throw new RuntimeException(e1);
+        }
+    }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Fri Jul 11 16:48:59 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Fri Jul 11 17:54:57 2014 +0200
@@ -380,11 +380,10 @@
      * @return a Java type for {@code name} which is guaranteed to be of type
      *         {@link ResolvedJavaType} if {@code resolve == true}
      * @throws LinkageError if {@code resolve == true} and the resolution failed
+     * @throws NullPointerException if {@code accessingClass} is {@code null}
      */
     public JavaType lookupType(String name, HotSpotResolvedObjectType accessingType, boolean resolve) {
-        if (accessingType == null) {
-            throw new GraalInternalError("cannot resolve " + name + " without an accessing class");
-        }
+        Objects.requireNonNull(accessingType, "cannot resolve type without an accessing class");
         // If the name represents a primitive type we can short-circuit the lookup.
         if (name.length() == 1) {
             Kind kind = Kind.fromPrimitiveOrVoidTypeChar(name.charAt(0));
@@ -392,7 +391,7 @@
         }
 
         // Resolve non-primitive types in the VM.
-        final long metaspaceKlass = compilerToVm.lookupType(name, accessingType != null ? accessingType.mirror() : null, resolve);
+        final long metaspaceKlass = compilerToVm.lookupType(name, accessingType.mirror(), resolve);
 
         if (metaspaceKlass == 0L) {
             assert resolve == false;