# HG changeset patch # User Roland Schatz # Date 1362993224 -3600 # Node ID 0e583eb213f12f50b5c38c56efbe1948c5a910d3 # Parent 87cb93643a478fea0e5249589c6384733af4f549 Check that OperandFlags is consistent with declared type of operand field. diff -r 87cb93643a47 -r 0e583eb213f1 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 Mon Mar 11 10:13:42 2013 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Mon Mar 11 10:13:44 2013 +0100 @@ -22,11 +22,14 @@ */ package com.oracle.graal.lir; +import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; + import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; import java.util.Map.Entry; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.lir.LIRInstruction.OperandFlag; @@ -37,6 +40,8 @@ private static final Class VALUE_CLASS = Value.class; private static final Class CONSTANT_CLASS = Constant.class; + private static final Class REGISTER_VALUE_CLASS = RegisterValue.class; + private static final Class STACK_SLOT_CLASS = StackSlot.class; private static final Class VALUE_ARRAY_CLASS = Value[].class; public LIRIntrospection(Class clazz) { @@ -82,11 +87,15 @@ OperandModeAnnotation annotation = getOperandModeAnnotation(field); assert annotation != null : "Field must have operand mode annotation: " + field; annotation.scalarOffsets.add(offset); + EnumSet flags = getFlags(field); + assert verifyFlags(field, type, flags); annotation.flags.put(offset, getFlags(field)); } else if (VALUE_ARRAY_CLASS.isAssignableFrom(type)) { OperandModeAnnotation annotation = getOperandModeAnnotation(field); assert annotation != null : "Field must have operand mode annotation: " + field; annotation.arrayOffsets.add(offset); + EnumSet flags = getFlags(field); + assert verifyFlags(field, type.getComponentType(), flags); annotation.flags.put(offset, getFlags(field)); } else { assert getOperandModeAnnotation(field) == null : "Field must not have operand mode annotation: " + field; @@ -94,6 +103,19 @@ dataOffsets.add(offset); } } + + private static boolean verifyFlags(Field field, Class type, EnumSet flags) { + if (flags.contains(REG)) { + assert type.isAssignableFrom(REGISTER_VALUE_CLASS) : "Cannot assign RegisterValue to field with REG flag:" + field; + } + if (flags.contains(STACK)) { + assert type.isAssignableFrom(STACK_SLOT_CLASS) : "Cannot assign StackSlot to field with STACK flag:" + field; + } + if (flags.contains(CONST)) { + assert type.isAssignableFrom(CONSTANT_CLASS) : "Cannot assign Constant to field with CONST flag:" + field; + } + return true; + } } protected static void forEach(Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, ValueProcedure proc) {