# HG changeset patch # User Christian Wimmer # Date 1431645456 25200 # Node ID 8cc395785d0a1bcf6decbf458e01d7cc74aaab2d # Parent f9024b74dd9ebf693c869469019331ece89190a7 Expand functionality of FieldIntrospection diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldIntrospection.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldIntrospection.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldIntrospection.java Thu May 14 16:17:36 2015 -0700 @@ -45,4 +45,6 @@ public Fields getData() { return data; } + + public abstract Fields[] getAllFields(); } diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/Fields.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/Fields.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/Fields.java Thu May 14 16:17:36 2015 -0700 @@ -48,6 +48,8 @@ */ private final Class[] types; + private final Class[] declaringClasses; + public static Fields forClass(Class clazz, Class endClazz, boolean includeTransient, FieldsScanner.CalcOffset calcOffset) { FieldsScanner scanner = new FieldsScanner(calcOffset == null ? new FieldsScanner.DefaultCalcOffset() : calcOffset); scanner.scan(clazz, endClazz, includeTransient); @@ -59,11 +61,13 @@ this.offsets = new long[fields.size()]; this.names = new String[offsets.length]; this.types = new Class[offsets.length]; + this.declaringClasses = new Class[offsets.length]; int index = 0; for (FieldsScanner.FieldInfo f : fields) { offsets[index] = f.offset; names[index] = f.name; types[index] = f.type; + declaringClasses[index] = f.declaringClass; index++; } } @@ -77,7 +81,7 @@ public static void translateInto(Fields fields, ArrayList infos) { for (int index = 0; index < fields.getCount(); index++) { - infos.add(new FieldsScanner.FieldInfo(fields.offsets[index], fields.names[index], fields.types[index])); + infos.add(new FieldsScanner.FieldInfo(fields.offsets[index], fields.names[index], fields.types[index], fields.declaringClasses[index])); } } @@ -217,6 +221,10 @@ return other.offsets[index] == offsets[index]; } + public long[] getOffsets() { + return offsets; + } + /** * Gets the name of a field. * @@ -235,6 +243,10 @@ return types[index]; } + public Class getDeclaringClass(int index) { + return declaringClasses[index]; + } + /** * Checks that a given field is assignable from a given value. * diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldsScanner.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldsScanner.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/FieldsScanner.java Thu May 14 16:17:36 2015 -0700 @@ -60,11 +60,13 @@ public final long offset; public final String name; public final Class type; + public final Class declaringClass; - public FieldInfo(long offset, String name, Class type) { + public FieldInfo(long offset, String name, Class type, Class declaringClass) { this.offset = offset; this.name = name; this.type = type; + this.declaringClass = declaringClass; } /** @@ -117,6 +119,6 @@ } protected void scanField(Field field, long offset) { - data.add(new FieldsScanner.FieldInfo(offset, field.getName(), field.getType())); + data.add(new FieldsScanner.FieldInfo(offset, field.getName(), field.getType(), field.getDeclaringClass())); } } diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Edges.java Thu May 14 16:17:36 2015 -0700 @@ -57,7 +57,7 @@ public static void translateInto(Edges edges, ArrayList infos) { for (int index = 0; index < edges.getCount(); index++) { - infos.add(new EdgeInfo(edges.offsets[index], edges.getName(index), edges.getType(index))); + infos.add(new EdgeInfo(edges.offsets[index], edges.getName(index), edges.getType(index), edges.getDeclaringClass(index))); } } @@ -547,10 +547,6 @@ } } - public long[] getOffsets() { - return this.offsets; - } - public void pushAll(Node node, NodeStack stack) { int index = 0; int curDirectCount = this.directCount; diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/InputEdges.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/InputEdges.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/InputEdges.java Thu May 14 16:17:36 2015 -0700 @@ -47,7 +47,7 @@ public static void translateInto(InputEdges inputs, ArrayList infos) { for (int index = 0; index < inputs.getCount(); index++) { - infos.add(new InputInfo(inputs.offsets[index], inputs.getName(index), inputs.getType(index), inputs.inputTypes[index], inputs.isOptional(index))); + infos.add(new InputInfo(inputs.offsets[index], inputs.getName(index), inputs.getType(index), inputs.getDeclaringClass(index), inputs.inputTypes[index], inputs.isOptional(index))); } } diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Thu May 14 16:17:36 2015 -0700 @@ -241,6 +241,11 @@ return shortName; } + @Override + public Fields[] getAllFields() { + return new Fields[]{data, inputs, successors}; + } + public int[] iterableIds() { nodeIterableCount.increment(); return iterableIds; @@ -288,8 +293,8 @@ */ protected static class EdgeInfo extends FieldsScanner.FieldInfo { - public EdgeInfo(long offset, String name, Class type) { - super(offset, name, type); + public EdgeInfo(long offset, String name, Class type, Class declaringClass) { + super(offset, name, type, declaringClass); } /** @@ -317,8 +322,8 @@ final InputType inputType; final boolean optional; - public InputInfo(long offset, String name, Class type, InputType inputType, boolean optional) { - super(offset, name, type); + public InputInfo(long offset, String name, Class type, Class declaringClass, InputType inputType, boolean optional) { + super(offset, name, type, declaringClass); this.inputType = inputType; this.optional = optional; } @@ -375,7 +380,7 @@ } else { inputType = optionalInputAnnotation.value(); } - inputs.add(new InputInfo(offset, field.getName(), type, inputType, field.isAnnotationPresent(Node.OptionalInput.class))); + inputs.add(new InputInfo(offset, field.getName(), type, field.getDeclaringClass(), inputType, field.isAnnotationPresent(Node.OptionalInput.class))); } else if (successorAnnotation != null) { if (SUCCESSOR_LIST_CLASS.isAssignableFrom(type)) { // NodeSuccessorList fields should not be final since they are @@ -387,7 +392,7 @@ GraalInternalError.guarantee(!Modifier.isFinal(modifiers), "Node successor field %s should not be final", field); directSuccessors++; } - successors.add(new EdgeInfo(offset, field.getName(), type)); + successors.add(new EdgeInfo(offset, field.getName(), type, field.getDeclaringClass())); } else { GraalInternalError.guarantee(!NODE_CLASS.isAssignableFrom(type) || field.getName().equals("Null"), "suspicious node field: %s", field); GraalInternalError.guarantee(!INPUT_LIST_CLASS.isAssignableFrom(type), "suspicious node input list field: %s", field); diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java Thu May 14 16:17:36 2015 -0700 @@ -39,7 +39,7 @@ * such fields. * */ -public final class CompositeValueClass { +public final class CompositeValueClass extends FieldIntrospection { /** * The CompositeValueClass is only used for formatting for the most part so cache it as a @@ -56,16 +56,15 @@ }; - public static CompositeValueClass get(Class type) { - return compositeClass.get(type); + @SuppressWarnings("unchecked") + public static CompositeValueClass get(Class type) { + return (CompositeValueClass) compositeClass.get(type); } - private final Class clazz; private final Values values; - private final Fields data; private CompositeValueClass(Class clazz) { - this.clazz = clazz; + super(clazz); CompositeValueFieldsScanner vfs = new CompositeValueFieldsScanner(new FieldsScanner.DefaultCalcOffset()); vfs.scan(clazz, CompositeValue.class, false); @@ -94,9 +93,14 @@ } @Override + public Fields[] getAllFields() { + return new Fields[]{data, values}; + } + + @Override public String toString() { StringBuilder str = new StringBuilder(); - str.append(getClass().getSimpleName()).append(" ").append(clazz.getSimpleName()).append(" components["); + str.append(getClass().getSimpleName()).append(" ").append(getClazz().getSimpleName()).append(" components["); values.appendFields(str); str.append("] data["); data.appendFields(str); diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Thu May 14 16:17:36 2015 -0700 @@ -76,6 +76,17 @@ } } + @SuppressWarnings("unchecked") + public static LIRInstructionClass get(Class clazz) { + try { + Field field = clazz.getDeclaredField("TYPE"); + field.setAccessible(true); + return (LIRInstructionClass) field.get(null); + } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { + throw new RuntimeException(e); + } + } + private static class LIRInstructionFieldsScanner extends LIRFieldsScanner { private String opcodeConstant; @@ -137,7 +148,7 @@ if (STATE_CLASS.isAssignableFrom(type)) { assert getOperandModeAnnotation(field) == null : "Field must not have operand mode annotation: " + field; assert field.getAnnotation(LIRInstruction.State.class) != null : "Field must have state annotation: " + field; - states.add(new FieldsScanner.FieldInfo(offset, field.getName(), type)); + states.add(new FieldsScanner.FieldInfo(offset, field.getName(), type, field.getDeclaringClass())); } else { super.scanField(field, offset); } @@ -151,6 +162,12 @@ } @Override + public Fields[] getAllFields() { + assert values == null; + return new Fields[]{data, uses, alives, temps, defs, states}; + } + + @Override public String toString() { StringBuilder str = new StringBuilder(); str.append(getClass().getSimpleName()).append(" ").append(getClazz().getSimpleName()).append(" use["); diff -r f9024b74dd9e -r 8cc395785d0a graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Thu May 14 16:16:43 2015 -0700 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Thu May 14 16:17:36 2015 -0700 @@ -100,8 +100,8 @@ final EnumSet flags; - public ValueFieldInfo(long offset, String name, Class type, EnumSet flags) { - super(offset, name, type); + public ValueFieldInfo(long offset, String name, Class type, Class declaringClass, EnumSet flags) { + super(offset, name, type, declaringClass); assert VALUE_ARRAY_CLASS.isAssignableFrom(type) || VALUE_CLASS.isAssignableFrom(type); this.flags = flags; } @@ -171,14 +171,14 @@ assert annotation != null : "Field must have operand mode annotation: " + field; EnumSet flags = getFlags(field); assert verifyFlags(field, type, flags); - annotation.values.add(new ValueFieldInfo(offset, field.getName(), type, flags)); + annotation.values.add(new ValueFieldInfo(offset, field.getName(), type, field.getDeclaringClass(), flags)); annotation.directCount++; } else if (VALUE_ARRAY_CLASS.isAssignableFrom(type)) { OperandModeAnnotation annotation = getOperandModeAnnotation(field); assert annotation != null : "Field must have operand mode annotation: " + field; EnumSet flags = getFlags(field); assert verifyFlags(field, type.getComponentType(), flags); - annotation.values.add(new ValueFieldInfo(offset, field.getName(), type, flags)); + annotation.values.add(new ValueFieldInfo(offset, field.getName(), type, field.getDeclaringClass(), flags)); } else { assert getOperandModeAnnotation(field) == null : "Field must not have operand mode annotation: " + field; assert field.getAnnotation(LIRInstruction.State.class) == null : "Field must not have state annotation: " + field;