# HG changeset patch # User twisti # Date 1389411045 28800 # Node ID 24353c21ef34f328f991263033910f5a3dbb34ee # Parent 805a904eae8fb49eb63cd7c197122786662b9de4 slightly better (denser) Class.isArray check diff -r 805a904eae8f -r 24353c21ef34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Jan 10 19:30:45 2014 -0800 @@ -1101,11 +1101,6 @@ return (layoutHelperArrayTagTypeValue & ~layoutHelperArrayTagObjectValue) << layoutHelperArrayTagShift; } - /** - * Bit pattern in the klass layout helper that can be used to identify arrays. - */ - public final int arrayKlassLayoutHelperIdentifier = 0x80000000; - @HotSpotVMField(name = "ArrayKlass::_component_mirror", type = "oop", get = HotSpotVMField.Type.OFFSET) @Stable public int arrayKlassComponentMirrorOffset; @HotSpotVMField(name = "java_lang_Class::_klass_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int klassOffset; @@ -1320,7 +1315,8 @@ } assert codeEntryAlignment > 0 : codeEntryAlignment; - assert (layoutHelperArrayTagObjectValue & layoutHelperArrayTagTypeValue & arrayKlassLayoutHelperIdentifier) != 0 : "object array and type array must have first bit set"; + assert (layoutHelperArrayTagObjectValue & (1 << (Integer.SIZE - 1))) != 0 : "object array must have first bit set"; + assert (layoutHelperArrayTagTypeValue & (1 << (Integer.SIZE - 1))) != 0 : "type array must have first bit set"; return true; } diff -r 805a904eae8f -r 24353c21ef34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jan 10 19:30:45 2014 -0800 @@ -71,7 +71,7 @@ if (klass.equal(0)) { return false; } else { - return (readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0; + return klassIsArray(klass); } } @@ -89,7 +89,7 @@ if (klass.notEqual(0)) { int accessFlags = klass.readInt(klassAccessFlagsOffset(), LocationIdentity.FINAL_LOCATION); if ((accessFlags & Modifier.INTERFACE) == 0) { - if ((readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0) { + if (klassIsArray(klass)) { return Object.class; } else { Word superKlass = klass.readWord(klassSuperKlassOffset(), LocationIdentity.FINAL_LOCATION); @@ -109,7 +109,7 @@ public static Class getComponentType(final Class thisObj) { Word klass = loadWordFromObject(thisObj, klassOffset()); if (klass.notEqual(0)) { - if ((readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0) { + if (klassIsArray(klass)) { return piCast(klass.readObject(arrayKlassComponentMirrorOffset(), LocationIdentity.FINAL_LOCATION), Class.class, true, true); } } diff -r 805a904eae8f -r 24353c21ef34 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Fri Jan 10 19:30:45 2014 -0800 @@ -237,9 +237,22 @@ return hub.readInt(klassLayoutHelperOffset(), LocationIdentity.FINAL_LOCATION); } - @Fold - public static int arrayKlassLayoutHelperIdentifier() { - return config().arrayKlassLayoutHelperIdentifier; + /** + * Checks if class {@code klass} is an array. + * + * See: Klass::layout_helper_is_array + * + * @param klass the class to be checked + * @return true if klass is an array, false otherwise + */ + public static boolean klassIsArray(Word klass) { + /* + * The less-than check only works if both values are ints. We use local variables to make + * sure these are still ints and haven't changed. + */ + final int layoutHelper = readLayoutHelper(klass); + final int layoutHelperNeutralValue = config().klassLayoutHelperNeutralValue; + return (layoutHelper < layoutHelperNeutralValue); } @Fold