changeset 7029:d918b5ba3e89

Merge.
author Doug Simon <doug.simon@oracle.com>
date Mon, 26 Nov 2012 18:21:22 +0100
parents 0353b031235a (diff) 635349143c4f (current diff)
children d78c83e8b70b
files
diffstat 7 files changed, 93 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Mon Nov 26 18:21:22 2012 +0100
@@ -257,6 +257,7 @@
             Assert.assertTrue("expected " + expect.exception, actual.exception != null);
             Assert.assertEquals(expect.exception.getClass(), actual.exception.getClass());
         } else {
+            //System.out.println(name + "(" + Arrays.toString(args) + "): expected=" + expect.returnValue + ", actual=" + actual.returnValue);
             assertEquals(expect.returnValue, actual.returnValue);
         }
     }
@@ -288,8 +289,13 @@
     protected InstalledCode getCode(final ResolvedJavaMethod method, final StructuredGraph graph, boolean forceCompile) {
         if (!forceCompile) {
             InstalledCode cached = cache.get(method);
-            if (cached != null && cached.isValid()) {
-                return cached;
+            if (cached != null) {
+                if (cached.isValid()) {
+                    return cached;
+                } else {
+                    //System.out.println(cached.getMethod() + " was invalidated");
+                }
+
             }
         }
         InstalledCode installedCode = Debug.scope("Compiling", new DebugDumpScope(String.valueOf(compilationId++), true), new Callable<InstalledCode>() {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Mon Nov 26 18:21:22 2012 +0100
@@ -104,6 +104,17 @@
      */
     void initializeMethodData(long metaspaceMethodData, HotSpotMethodData methodData);
 
+    /**
+     * Converts a name to a Java type.
+     *
+     * @param name a well formed Java type in {@linkplain JavaType#getName() internal} format
+     * @param accessingClass the context of resolution (may be null)
+     * @param eagerResolve force resolution to a {@link ResolvedJavaType}. If true, this method will either return a
+     *            {@link ResolvedJavaType} or throw an exception
+     * @return a Java type for {@code name} which is guaranteed to be of type {@link ResolvedJavaType} if
+     *         {@code eagerResolve == true}
+     * @throws LinkageError if {@code eagerResolve == true} and the resolution failed
+     */
     JavaType lookupType(String name, HotSpotResolvedJavaType accessingClass, boolean eagerResolve);
 
     Object lookupConstantInPool(HotSpotResolvedJavaType pool, int cpi);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypeUnresolved.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypeUnresolved.java	Mon Nov 26 18:21:22 2012 +0100
@@ -36,10 +36,9 @@
     public final int dimensions;
 
     public HotSpotTypeUnresolved(String name, String simpleName, int dimensions) {
-        super(getFullName(name, dimensions));
+        super(name);
         assert dimensions >= 0;
         this.simpleName = simpleName;
-
         this.dimensions = dimensions;
     }
 
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java	Mon Nov 26 18:21:22 2012 +0100
@@ -327,22 +327,63 @@
 
     abstract static class A {}
     static class B extends A {}
+    static class C extends B {}
+    abstract static class D extends C {}
 
     public static boolean isArrayOfA(Object o) {
         return o instanceof A[];
     }
 
     public static boolean isArrayOfB(Object o) {
-        return o instanceof A[];
+        return o instanceof B[];
+    }
+
+    public static boolean isArrayOfC(Object o) {
+        return o instanceof C[];
+    }
+
+    public static boolean isArrayOfD(Object o) {
+        return o instanceof D[];
     }
 
     @Test
     public void testArray() {
-        Object bArray = new A[10];
-        Object aArray = new B[10];
+        Object aArray = new A[10];
+        test("isArrayOfA", aArray);
+
+        Object bArray = new B[10];
         test("isArrayOfA", aArray);
         test("isArrayOfA", bArray);
         test("isArrayOfB", aArray);
         test("isArrayOfB", bArray);
+
+        Object cArray = new C[10];
+        test("isArrayOfA", aArray);
+        test("isArrayOfA", bArray);
+        test("isArrayOfA", cArray);
+        test("isArrayOfB", aArray);
+        test("isArrayOfB", bArray);
+        test("isArrayOfB", cArray);
+        test("isArrayOfC", aArray);
+        test("isArrayOfC", bArray);
+        test("isArrayOfC", cArray);
+
+        Object dArray = new D[10];
+        test("isArrayOfA", aArray);
+        test("isArrayOfA", bArray);
+        test("isArrayOfA", cArray);
+        test("isArrayOfA", dArray);
+        test("isArrayOfB", aArray);
+        test("isArrayOfB", bArray);
+        test("isArrayOfB", cArray);
+        test("isArrayOfB", dArray);
+        test("isArrayOfC", aArray);
+        test("isArrayOfC", bArray);
+        test("isArrayOfC", cArray);
+        test("isArrayOfC", dArray);
+        test("isArrayOfD", aArray);
+        test("isArrayOfD", bArray);
+        test("isArrayOfD", cArray);
+        test("isArrayOfD", dArray);
     }
 }
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetIntrinsificationPhase.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetIntrinsificationPhase.java	Mon Nov 26 18:21:22 2012 +0100
@@ -82,12 +82,13 @@
     private void tryIntrinsify(Invoke invoke) {
         ResolvedJavaMethod target = invoke.methodCallTarget().targetMethod();
         NodeIntrinsic intrinsic = target.getAnnotation(Node.NodeIntrinsic.class);
+        ResolvedJavaType declaringClass = target.getDeclaringClass();
         if (intrinsic != null) {
             assert target.getAnnotation(Fold.class) == null;
             assert Modifier.isNative(target.getModifiers()) : "node intrinsic " + target + " should be native";
 
-            Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.getSignature(), target.getDeclaringClass());
-            ResolvedJavaType returnType = (ResolvedJavaType) target.getSignature().getReturnType(target.getDeclaringClass());
+            Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.getSignature(), declaringClass);
+            ResolvedJavaType returnType = target.getSignature().getReturnType(declaringClass).resolve(declaringClass);
 
             // Prepare the arguments for the reflective constructor call on the node class.
             Object[] nodeConstructorArguments = prepareArguments(invoke, parameterTypes, target, false);
@@ -103,7 +104,7 @@
             // Clean up checkcast instructions inserted by javac if the return type is generic.
             cleanUpReturnCheckCast(newInstance);
         } else if (target.getAnnotation(Fold.class) != null) {
-            Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.getSignature(), target.getDeclaringClass());
+            Class< ? >[] parameterTypes = MetaUtil.signatureToTypes(target.getSignature(), declaringClass);
 
             // Prepare the arguments for the reflective method call
             Object[] arguments = prepareArguments(invoke, parameterTypes, target, true);
@@ -114,7 +115,7 @@
             }
 
             // Call the method
-            Constant constant = callMethod(target.getSignature().getReturnKind(), target.getDeclaringClass().toJava(), target.getName(), parameterTypes, receiver, arguments);
+            Constant constant = callMethod(target.getSignature().getReturnKind(), declaringClass.toJava(), target.getName(), parameterTypes, receiver, arguments);
 
             if (constant != null) {
                 // Replace the invoke with the result of the call
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/WordTypeRewriterPhase.java	Mon Nov 26 16:08:10 2012 +0100
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/WordTypeRewriterPhase.java	Mon Nov 26 18:21:22 2012 +0100
@@ -169,7 +169,8 @@
                     case W2A: {
                         assert arguments.size() == 1;
                         ValueNode value = arguments.first();
-                        ResolvedJavaType targetType = (ResolvedJavaType) targetMethod.getSignature().getReturnType(targetMethod.getDeclaringClass());
+                        ResolvedJavaType declaringClass = targetMethod.getDeclaringClass();
+                        ResolvedJavaType targetType = targetMethod.getSignature().getReturnType(declaringClass).resolve(declaringClass);
                         UnsafeCastNode cast = graph.unique(new UnsafeCastNode(value, targetType));
                         replace(invoke, cast);
                         break;
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Mon Nov 26 16:08:10 2012 +0100
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Mon Nov 26 18:21:22 2012 +0100
@@ -301,8 +301,9 @@
 
   Symbol* nameSymbol = VmIds::toSymbol(jname);
   Handle name = JNIHandles::resolve(jname);
+  assert(nameSymbol != NULL, "name to symbol creation failed");
 
-  oop result;
+  oop result = NULL;
   if (nameSymbol == vmSymbols::int_signature()) {
     result = VMToCompiler::createPrimitiveJavaType((int) T_INT, THREAD);
   } else if (nameSymbol == vmSymbols::long_signature()) {
@@ -323,38 +324,28 @@
     result = VMToCompiler::createPrimitiveJavaType((int) T_VOID, THREAD);
   } else {
     Klass* resolved_type = NULL;
-    // if the name isn't in the symbol table then the class isn't loaded anyway...
-    if (nameSymbol != NULL) {
-      Handle classloader;
-      Handle protectionDomain;
-      if (JNIHandles::resolve(accessingClass) != NULL) {
-        classloader = java_lang_Class::as_Klass(HotSpotResolvedJavaType::javaMirror(accessingClass))->class_loader();
-        protectionDomain = java_lang_Class::as_Klass(HotSpotResolvedJavaType::javaMirror(accessingClass))->protection_domain();
-      }
-      if (eagerResolve) {
-        resolved_type = SystemDictionary::resolve_or_null(nameSymbol, classloader, protectionDomain, THREAD);
+    Handle classloader;
+    Handle protectionDomain;
+    if (JNIHandles::resolve(accessingClass) != NULL) {
+      classloader = java_lang_Class::as_Klass(HotSpotResolvedJavaType::javaMirror(accessingClass))->class_loader();
+      protectionDomain = java_lang_Class::as_Klass(HotSpotResolvedJavaType::javaMirror(accessingClass))->protection_domain();
+    }
+
+    if (eagerResolve) {
+      resolved_type = SystemDictionary::resolve_or_fail(nameSymbol, classloader, protectionDomain, true, THREAD);
+    } else {
+      resolved_type = SystemDictionary::resolve_or_null(nameSymbol, classloader, protectionDomain, THREAD);
+    }
+
+    if (!HAS_PENDING_EXCEPTION) {
+      if (resolved_type == NULL) {
+        assert(!eagerResolve, "failed eager resolution should have caused an exception");
+        Handle type = VMToCompiler::createUnresolvedJavaType(name, THREAD);
+        result = type();
       } else {
-        if (FieldType::is_obj(nameSymbol)) {
-          ResourceMark rm(THREAD);
-          // Ignore wrapping L and ;.
-          TempNewSymbol tmp_name = SymbolTable::new_symbol(nameSymbol->as_C_string() + 1,
-                                         nameSymbol->utf8_length() - 2, CHECK_NULL);
-          resolved_type = SystemDictionary::find_instance_or_array_klass(tmp_name, classloader, protectionDomain, THREAD);
-        } else {
-          resolved_type = SystemDictionary::find_instance_or_array_klass(nameSymbol, classloader, protectionDomain, THREAD);
-        }
+        Handle type = GraalCompiler::createHotSpotResolvedJavaType(resolved_type, name, CHECK_NULL);
+        result = type();
       }
-      if (HAS_PENDING_EXCEPTION) {
-        CLEAR_PENDING_EXCEPTION;
-        resolved_type = NULL;
-      }
-    }
-    if (resolved_type != NULL) {
-      Handle type = GraalCompiler::createHotSpotResolvedJavaType(resolved_type, name, CHECK_NULL);
-      result = type();
-    } else {
-      Handle type = VMToCompiler::createUnresolvedJavaType(name, THREAD);
-      result = type();
     }
   }