changeset 18290:e7d219e9d01f

removed HotSpotObjectConstantImpl.asObject()
author Doug Simon <doug.simon@oracle.com>
date Thu, 06 Nov 2014 20:13:08 +0100
parents 7acff34abbf7
children 5415422cb32f
files graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotAssembler.java graal/com.oracle.graal.hotspot.server/src/com/oracle/graal/hotspot/server/ReplacingStreams.java graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaFieldImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethodImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectTypeImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSnippetReflectionProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java
diffstat 15 files changed, 128 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotAssembler.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotAssembler.java	Thu Nov 06 20:13:08 2014 +0100
@@ -28,6 +28,7 @@
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.asm.hsail.*;
+import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.hotspot.meta.*;
 
 /**
@@ -39,6 +40,22 @@
         super(target);
     }
 
+    // This means the HSAIL backend cannot (currently) be executed
+    // in remote/replay compilation mode.
+    private static Field objectField;
+
+    private static Object getObject(JavaConstant src) {
+        try {
+            if (objectField == null) {
+                objectField = HotSpotObjectConstantImpl.class.getDeclaredField("object");
+            }
+            return objectField.get(src);
+        } catch (Exception e) {
+            throw new GraalInternalError(e);
+        }
+
+    }
+
     @Override
     public final void mov(Register a, JavaConstant src) {
         String regName = "$d" + a.encoding();
@@ -46,7 +63,8 @@
         if (src.isNull()) {
             emitString("mov_b64 " + regName + ", 0x0;  // null object");
         } else {
-            Object obj = HotSpotObjectConstantImpl.asObject(src);
+            assert src instanceof HotSpotObjectConstantImpl;
+            Object obj = getObject(src);
             // Get a JNI reference handle to the object.
             long refHandle = OkraUtil.getRefHandle(obj);
             // Get the clasname of the object for emitting a comment.
--- a/graal/com.oracle.graal.hotspot.server/src/com/oracle/graal/hotspot/server/ReplacingStreams.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.server/src/com/oracle/graal/hotspot/server/ReplacingStreams.java	Thu Nov 06 20:13:08 2014 +0100
@@ -30,7 +30,6 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.hotspot.logging.*;
-import com.oracle.graal.hotspot.meta.*;
 
 public class ReplacingStreams {
 
@@ -147,7 +146,7 @@
     }
 
     /**
-     * Replaces certain cir objects that cannot easily be made Serializable.
+     * Replaces certain objects that cannot easily be made Serializable.
      */
     public class ReplacingOutputStream extends ObjectOutputStream {
 
@@ -169,29 +168,9 @@
                 return createRemoteCallPlaceholder(obj);
             }
 
-            // is the object a constant of object type?
-            if (obj.getClass() == JavaConstant.class) {
-                JavaConstant constant = (JavaConstant) obj;
-                if (constant.getKind() != Kind.Object) {
-                    return obj;
-                }
-                Object contents = HotSpotObjectConstantImpl.asObject(constant);
-                if (contents == null) {
-                    return obj;
-                }
-                // don't replace if the object already is a placeholder
-                if (contents instanceof Placeholder || contents instanceof Long) {
-                    return obj;
-                }
-                placeholder = objectMap.get(contents);
-                if (placeholder != null) {
-                    return HotSpotObjectConstantImpl.forObject(placeholder);
-                }
-                if (contents instanceof Remote) {
-                    return HotSpotObjectConstantImpl.forObject(createRemoteCallPlaceholder(contents));
-                }
-                return HotSpotObjectConstantImpl.forObject(createDummyPlaceholder(contents));
-            }
+            // Remote object constants must implement Remote
+            assert !(obj instanceof JavaConstant) || ((JavaConstant) obj).getKind() != Kind.Object;
+
             return obj;
         }
     }
@@ -203,10 +182,4 @@
         objectList.add(obj);
         return new NewRemoteCallPlaceholder(ProxyUtil.getAllInterfaces(obj.getClass()));
     }
-
-    public Object createDummyPlaceholder(Object obj) {
-        objectMap.put(obj, new Placeholder(objectList.size()));
-        objectList.add(obj);
-        return new NewDummyPlaceholder();
-    }
 }
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Thu Nov 06 20:13:08 2014 +0100
@@ -104,9 +104,9 @@
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(Class.class, mirror.getClass());
-        assertDeepEquals(AheadOfTimeCompilationTest.class, mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(Class.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo(AheadOfTimeCompilationTest.class));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -132,9 +132,9 @@
         StructuredGraph result = compile("getPrimitiveClassObject", false);
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(Class.class, mirror.getClass());
-        assertDeepEquals(Integer.TYPE, mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(Class.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo(Integer.TYPE));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -160,9 +160,9 @@
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(String.class, mirror.getClass());
-        assertDeepEquals("test string", mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(String.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo("test string"));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -193,7 +193,9 @@
         assertDeepEquals(1, getConstantNodes(result).count());
         ConstantNode constant = getConstantNodes(result).first();
         assertDeepEquals(Kind.Object, constant.getKind());
-        assertDeepEquals(Boolean.TRUE, HotSpotObjectConstantImpl.asObject(constant.asJavaConstant()));
+
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) constant.asJavaConstant();
+        Assert.assertTrue(c.isEqualTo(Boolean.TRUE));
     }
 
     private StructuredGraph compile(String test, boolean compileAOT) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Nov 06 20:13:08 2014 +0100
@@ -53,7 +53,7 @@
             return null;
         }
 
-        Object arrayObject = HotSpotObjectConstantImpl.asObject(array);
+        Object arrayObject = ((HotSpotObjectConstantImpl) array).object();
         if (!arrayObject.getClass().isArray()) {
             return null;
         }
@@ -65,7 +65,7 @@
         Object base;
         long displacement;
         if (baseConstant.getKind() == Kind.Object) {
-            base = HotSpotObjectConstantImpl.asObject(baseConstant);
+            base = ((HotSpotObjectConstantImpl) baseConstant).object();
             displacement = initialDisplacement;
             if (base == null) {
                 return null;
@@ -132,7 +132,7 @@
         Object base;
         long displacement;
         if (baseConstant.getKind() == Kind.Object) {
-            base = HotSpotObjectConstantImpl.asObject(baseConstant);
+            base = ((HotSpotObjectConstantImpl) baseConstant).object();
             displacement = initialDisplacement;
             if (base == null) {
                 return null;
@@ -197,7 +197,7 @@
         if (array.getKind() != Kind.Object || array.isNull()) {
             return null;
         }
-        Object a = HotSpotObjectConstantImpl.asObject(array);
+        Object a = ((HotSpotObjectConstantImpl) array).object();
 
         if (index < 0 || index >= Array.getLength(a)) {
             return null;
@@ -223,13 +223,13 @@
         if (!source.getKind().isObject()) {
             return null;
         }
-        return JavaConstant.forBoxedPrimitive(HotSpotObjectConstantImpl.asObject(source));
+        return JavaConstant.forBoxedPrimitive(((HotSpotObjectConstantImpl) source).object());
     }
 
     @Override
     public ResolvedJavaType asJavaType(JavaConstant constant) {
         if (constant instanceof HotSpotObjectConstant) {
-            Object obj = HotSpotObjectConstantImpl.asObject(constant);
+            Object obj = ((HotSpotObjectConstantImpl) constant).object();
             if (obj instanceof Class) {
                 return runtime.getHostProviders().getMetaAccess().lookupJavaType((Class<?>) obj);
             }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Thu Nov 06 20:13:08 2014 +0100
@@ -62,7 +62,7 @@
         if (constant.isNull() || !(constant instanceof HotSpotObjectConstant)) {
             return null;
         }
-        Object o = HotSpotObjectConstantImpl.asObject(constant);
+        Object o = ((HotSpotObjectConstantImpl) constant).object();
         return fromObjectClass(o.getClass());
     }
 
@@ -308,7 +308,7 @@
             } else {
                 if (lookupJavaType.isArray()) {
                     // TODO(tw): Add compressed pointer support.
-                    int length = Array.getLength(HotSpotObjectConstantImpl.asObject(constant));
+                    int length = Array.getLength(((HotSpotObjectConstantImpl) constant).object());
                     ResolvedJavaType elementType = lookupJavaType.getComponentType();
                     Kind elementKind = elementType.getKind();
                     final int headerSize = HotSpotGraalRuntime.getArrayBaseOffset(elementKind);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Thu Nov 06 20:13:08 2014 +0100
@@ -55,14 +55,6 @@
         }
     }
 
-    public static Object asObject(Constant constant) {
-        if (JavaConstant.isNull(constant)) {
-            return null;
-        } else {
-            return ((HotSpotObjectConstantImpl) constant).object;
-        }
-    }
-
     public static Object asBoxedValue(Constant constant) {
         if (JavaConstant.isNull(constant)) {
             return null;
@@ -83,6 +75,28 @@
         assert object != null;
     }
 
+    /**
+     * Package-private accessor for the object represented by this constant.
+     */
+    Object object() {
+        return object;
+    }
+
+    /**
+     * Determines if the object represented by this constant is {@link Object#equals(Object) equal}
+     * to a given object.
+     */
+    public boolean isEqualTo(Object obj) {
+        return object.equals(obj);
+    }
+
+    /**
+     * Gets the class of the object represented by this constant.
+     */
+    public Class<?> getObjectClass() {
+        return object.getClass();
+    }
+
     public boolean isCompressed() {
         return compressed;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaFieldImpl.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaFieldImpl.java	Thu Nov 06 20:13:08 2014 +0100
@@ -210,7 +210,7 @@
              * have a non-default value.
              */
             assert !isStatic();
-            Object object = HotSpotObjectConstantImpl.asObject(receiver);
+            Object object = ((HotSpotObjectConstantImpl) receiver).object();
 
             // Canonicalization may attempt to process an unsafe read before
             // processing a guard (e.g. a null check or a type check) for this read
@@ -268,7 +268,7 @@
             return null;
         } else {
             assert !isStatic();
-            assert receiver.isNonNull() && isInObject(HotSpotObjectConstantImpl.asObject(receiver));
+            assert receiver.isNonNull() && isInObject(((HotSpotObjectConstantImpl) receiver).object());
             return runtime().getHostProviders().getConstantReflection().readUnsafeConstant(getKind(), receiver, offset);
         }
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethodImpl.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethodImpl.java	Thu Nov 06 20:13:08 2014 +0100
@@ -711,7 +711,7 @@
         for (int i = 0; i < arguments.length; i++) {
             objArguments[i] = HotSpotObjectConstantImpl.asBoxedValue(arguments[i]);
         }
-        Object objReceiver = receiver != null ? HotSpotObjectConstantImpl.asObject(receiver) : null;
+        Object objReceiver = receiver != null ? ((HotSpotObjectConstantImpl) receiver).object() : null;
 
         try {
             Object objResult = javaMethod.invoke(objReceiver, objArguments);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectTypeImpl.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectTypeImpl.java	Thu Nov 06 20:13:08 2014 +0100
@@ -343,7 +343,7 @@
     @Override
     public boolean isInstance(JavaConstant obj) {
         if (obj.getKind() == Kind.Object && !obj.isNull()) {
-            return mirror().isInstance(HotSpotObjectConstantImpl.asObject(obj));
+            return mirror().isInstance(((HotSpotObjectConstantImpl) obj).object());
         }
         return false;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSnippetReflectionProvider.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSnippetReflectionProvider.java	Thu Nov 06 20:13:08 2014 +0100
@@ -34,7 +34,7 @@
 
     @Override
     public Object asObject(JavaConstant constant) {
-        return HotSpotObjectConstantImpl.asObject(constant);
+        return ((HotSpotObjectConstantImpl) constant).object();
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java	Thu Nov 06 20:13:08 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forInt(c.getModifiers());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forInt(type.getModifiers());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java	Thu Nov 06 20:13:08 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isArray());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isArray());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java	Thu Nov 06 20:13:08 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isInterface());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isInterface());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java	Thu Nov 06 20:13:08 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isPrimitive());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isPrimitive());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java	Thu Nov 06 14:52:46 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java	Thu Nov 06 20:13:08 2014 +0100
@@ -60,44 +60,48 @@
     }
 
     private ValueNode getClassConstantReplacement(StructuredGraph graph, PhaseContext context, JavaConstant constant) {
-        if (constant instanceof HotSpotObjectConstant && HotSpotObjectConstantImpl.asObject(constant) instanceof Class<?>) {
-            MetaAccessProvider metaAccess = context.getMetaAccess();
-            ResolvedJavaType type = metaAccess.lookupJavaType((Class<?>) HotSpotObjectConstantImpl.asObject(constant));
-            JavaConstant klass;
-            LocationNode location;
-            if (type instanceof HotSpotResolvedObjectType) {
-                location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, Kind.Object, classMirrorOffset, graph);
-                klass = ((HotSpotResolvedObjectType) type).klass();
-            } else {
-                /*
-                 * Primitive classes are more difficult since they don't have a corresponding Klass*
-                 * so get them from Class.TYPE for the java box type.
-                 */
-                HotSpotResolvedPrimitiveType primitive = (HotSpotResolvedPrimitiveType) type;
-                ResolvedJavaType boxingClass = metaAccess.lookupJavaType(primitive.getKind().toBoxedJavaClass());
-                klass = ((HotSpotResolvedObjectType) boxingClass).klass();
-                HotSpotResolvedJavaField[] a = (HotSpotResolvedJavaField[]) boxingClass.getStaticFields();
-                HotSpotResolvedJavaField typeField = null;
-                for (HotSpotResolvedJavaField f : a) {
-                    if (f.getName().equals("TYPE")) {
-                        typeField = f;
-                        break;
+        if (constant instanceof HotSpotObjectConstant) {
+            ConstantReflectionProvider constantReflection = context.getConstantReflection();
+            ResolvedJavaType c = constantReflection.asJavaType(constant);
+            if (c != null) {
+                MetaAccessProvider metaAccess = context.getMetaAccess();
+                ResolvedJavaType type = c;
+                JavaConstant klass;
+                LocationNode location;
+                if (type instanceof HotSpotResolvedObjectType) {
+                    location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, Kind.Object, classMirrorOffset, graph);
+                    klass = ((HotSpotResolvedObjectType) type).klass();
+                } else {
+                    /*
+                     * Primitive classes are more difficult since they don't have a corresponding
+                     * Klass* so get them from Class.TYPE for the java box type.
+                     */
+                    HotSpotResolvedPrimitiveType primitive = (HotSpotResolvedPrimitiveType) type;
+                    ResolvedJavaType boxingClass = metaAccess.lookupJavaType(primitive.getKind().toBoxedJavaClass());
+                    klass = ((HotSpotResolvedObjectType) boxingClass).klass();
+                    HotSpotResolvedJavaField[] a = (HotSpotResolvedJavaField[]) boxingClass.getStaticFields();
+                    HotSpotResolvedJavaField typeField = null;
+                    for (HotSpotResolvedJavaField f : a) {
+                        if (f.getName().equals("TYPE")) {
+                            typeField = f;
+                            break;
+                        }
                     }
-                }
-                if (typeField == null) {
-                    throw new GraalInternalError("Can't find TYPE field in class");
+                    if (typeField == null) {
+                        throw new GraalInternalError("Can't find TYPE field in class");
+                    }
+                    location = ConstantLocationNode.create(FINAL_LOCATION, Kind.Object, typeField.offset(), graph);
                 }
-                location = ConstantLocationNode.create(FINAL_LOCATION, Kind.Object, typeField.offset(), graph);
-            }
-            ConstantNode klassNode = ConstantNode.forConstant(klass, metaAccess, graph);
+                ConstantNode klassNode = ConstantNode.forConstant(klass, metaAccess, graph);
 
-            Stamp stamp = StampFactory.exactNonNull(metaAccess.lookupJavaType(Class.class));
-            FloatingReadNode freadNode = graph.unique(FloatingReadNode.create(klassNode, location, null, stamp));
+                Stamp stamp = StampFactory.exactNonNull(metaAccess.lookupJavaType(Class.class));
+                FloatingReadNode freadNode = graph.unique(FloatingReadNode.create(klassNode, location, null, stamp));
 
-            if (((HotSpotObjectConstant) constant).isCompressed()) {
-                return CompressionNode.compress(freadNode, oopEncoding);
-            } else {
-                return freadNode;
+                if (((HotSpotObjectConstant) constant).isCompressed()) {
+                    return CompressionNode.compress(freadNode, oopEncoding);
+                } else {
+                    return freadNode;
+                }
             }
         }
         return null;