# HG changeset patch # User Christian Wimmer # Date 1352510113 28800 # Node ID d79098b9db3be187c064dd4b47b438d1b71b45bf # Parent f5715c5a106ae67a50361ee3ffd3868697826144 Support for interfaces in the Graal API: Make interfaces implemented by a ResolvedJavaType available; change semantics of ResolvedJavaType.getSuperclass to return null for interfaces (to conform with java.lang.Class); change semantics of ResolvedJavaType.isInstanceClass to return false for interfaces. diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Fri Nov 09 17:15:13 2012 -0800 @@ -37,6 +37,15 @@ public class MetaUtil { /** + * Returns true if the specified typed is exactly the type {@link java.lang.Object}. + */ + public static boolean isJavaLangObject(ResolvedJavaType type) { + boolean result = type.getSuperclass() == null && !type.isInterface() && type.getKind() == Kind.Object; + assert result == type.getName().equals("Ljava/lang/Object;") : type.getName(); + return result; + } + + /** * Extends the functionality of {@link Class#getSimpleName()} to include a non-empty string for anonymous and local * classes. * diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java Fri Nov 09 17:15:13 2012 -0800 @@ -152,6 +152,11 @@ ResolvedJavaType getSuperclass(); /** + * Gets the interfaces that this type defines. This method is analogous to {@link Class#getInterfaces()}. + */ + ResolvedJavaType[] getInterfaces(); + + /** * Walks the class hierarchy upwards and returns the least common class that is a superclass of both the current and * the given type. * diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Fri Nov 09 17:15:13 2012 -0800 @@ -49,6 +49,7 @@ private int instanceSize; private HashMap fieldCache; private ResolvedJavaType superType; + private ResolvedJavaType[] interfaces; private boolean superTypeSet; private ResolvedJavaField[] fields; private ConstantPool constantPool; @@ -94,13 +95,31 @@ @Override public ResolvedJavaType getSuperclass() { if (!superTypeSet) { - superType = (ResolvedJavaType) HotSpotGraalRuntime.getInstance().getCompilerToVM().getSuperType(this); + Class javaSuper = toJava().getSuperclass(); + if (javaSuper == null) { + superType = null; + } else { + superType = HotSpotGraalRuntime.getInstance().getRuntime().lookupJavaType(javaSuper); + } superTypeSet = true; } return superType; } @Override + public ResolvedJavaType[] getInterfaces() { + if (interfaces == null) { + Class[] javaInterfaces = toJava().getInterfaces(); + ResolvedJavaType[] result = new ResolvedJavaType[javaInterfaces.length]; + for (int i = 0; i < javaInterfaces.length; i++) { + result[i] = HotSpotGraalRuntime.getInstance().getRuntime().lookupJavaType(javaInterfaces[i]); + } + interfaces = result; + } + return interfaces; + } + + @Override public ResolvedJavaType findLeastCommonAncestor(ResolvedJavaType otherType) { if (otherType instanceof HotSpotTypePrimitive) { return null; @@ -145,6 +164,7 @@ @Override public boolean isArrayClass() { + assert isArrayClass ^ (isInterface || isInstanceClass); return isArrayClass; } @@ -171,11 +191,13 @@ @Override public boolean isInstanceClass() { + assert isInstanceClass ^ (isInterface || isArrayClass); return isInstanceClass; } @Override public boolean isInterface() { + assert isInterface ^ (isInstanceClass || isArrayClass); return isInterface; } diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Nov 09 17:15:13 2012 -0800 @@ -57,6 +57,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.phases.*; +import com.oracle.graal.printer.*; import com.oracle.graal.snippets.*; /** @@ -482,12 +483,10 @@ ResolvedJavaType arrayType = array.objectStamp().type(); if (arrayType != null && array.objectStamp().isExactType()) { ResolvedJavaType elementType = arrayType.getComponentType(); - if (elementType.getSuperclass() != null) { + if (!MetaUtil.isJavaLangObject(elementType)) { CheckCastNode checkcast = graph.add(new CheckCastNode(elementType, value, null)); graph.addBeforeFixed(storeIndexed, checkcast); value = checkcast; - } else { - assert elementType.getName().equals("Ljava/lang/Object;") : elementType.getName(); } } else { LoadHubNode arrayClass = graph.add(new LoadHubNode(array)); diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotTypePrimitive.java Fri Nov 09 17:15:13 2012 -0800 @@ -71,6 +71,11 @@ } @Override + public ResolvedJavaType[] getInterfaces() { + return new ResolvedJavaType[0]; + } + + @Override public ResolvedJavaType findLeastCommonAncestor(ResolvedJavaType otherType) { return null; } diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Fri Nov 09 17:15:13 2012 -0800 @@ -762,7 +762,7 @@ while (stream.currentBCI() <= block.endBci) { switch (stream.currentBC()) { case RETURN: - if (method.isConstructor() && method.getDeclaringClass().getSuperclass() == null) { + if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { // return from Object.init implicitly registers a finalizer // for the receiver if needed, so keep it alive. loadOne(block, 0); diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/FrameStateBuilder.java Fri Nov 09 17:15:13 2012 -0800 @@ -339,7 +339,7 @@ * @param i the index into the locals * @return the instruction that produced the value for the specified local */ - protected final ValueNode localAt(int i) { + public final ValueNode localAt(int i) { return locals[i]; } @@ -349,7 +349,7 @@ * @param i the index into the stack, with {@code 0} being the bottom of the stack * @return the instruction at the specified position in the stack */ - protected final ValueNode stackAt(int i) { + public final ValueNode stackAt(int i) { return stack[i]; } diff -r f5715c5a106a -r d79098b9db3b graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Nov 09 17:04:16 2012 -0800 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Nov 09 17:15:13 2012 -0800 @@ -1363,7 +1363,7 @@ } private void createReturn() { - if (method.isConstructor() && method.getDeclaringClass().getSuperclass() == null) { + if (method.isConstructor() && MetaUtil.isJavaLangObject(method.getDeclaringClass())) { callRegisterFinalizer(); } Kind returnKind = method.getSignature().getReturnKind().getStackKind(); diff -r f5715c5a106a -r d79098b9db3b src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Fri Nov 09 17:04:16 2012 -0800 +++ b/src/share/vm/graal/graalCompiler.cpp Fri Nov 09 17:15:13 2012 -0800 @@ -286,7 +286,7 @@ HotSpotResolvedJavaType::set_accessFlags(obj, klass->access_flags().as_int()); HotSpotResolvedJavaType::set_isInterface(obj, klass->is_interface()); HotSpotResolvedJavaType::set_superCheckOffset(obj, klass->super_check_offset()); - HotSpotResolvedJavaType::set_isInstanceClass(obj, klass->oop_is_instance()); + HotSpotResolvedJavaType::set_isInstanceClass(obj, klass->oop_is_instance() && !klass->is_interface()); if (klass->oop_is_javaArray()) { HotSpotResolvedJavaType::set_isArrayClass(obj, true);