/** * Check if an address appears to point to an instance of RVMType * * @param typeAddress the address to check * @return {@code true} if and only if the address appears to be an an instance of RVMType */ @Uninterruptible public static boolean validType(ObjectReference typeAddress) { if (!Space.isMappedObject(typeAddress)) { return false; // type address is outside of heap } // check if types tib is one of three possible values TIB typeTib = ObjectModel.getTIB(typeAddress); return ((typeTib == tibForClassType) || (typeTib == tibForArrayType) || (typeTib == tibForPrimitiveType)); }
@Uninterruptible public static boolean validRef(ObjectReference ref) { if (ref.isNull()) return true; if (!Space.isMappedObject(ref)) { VM.sysWrite("validRef: REF outside heap, ref = "); VM.sysWrite(ref); VM.sysWrite("\n"); Space.printVMMap(); return false; } if (MOVES_OBJECTS) { /* TODO: Work out how to check if forwarded if (Plan.isForwardedOrBeingForwarded(ref)) { // TODO: actually follow forwarding pointer // (need to bound recursion when things are broken!!) return true; } */ } TIB tib = ObjectModel.getTIB(ref); Address tibAddr = Magic.objectAsAddress(tib); if (!Space.isMappedObject(ObjectReference.fromObject(tib))) { VM.sysWrite("validRef: TIB outside heap, ref = "); VM.sysWrite(ref); VM.sysWrite(" tib = "); VM.sysWrite(tibAddr); VM.sysWrite("\n"); ObjectModel.dumpHeader(ref); return false; } if (tibAddr.isZero()) { VM.sysWrite("validRef: TIB is Zero! "); VM.sysWrite(ref); VM.sysWrite("\n"); ObjectModel.dumpHeader(ref); return false; } if (tib.length() == 0) { VM.sysWrite("validRef: TIB length zero, ref = "); VM.sysWrite(ref); VM.sysWrite(" tib = "); VM.sysWrite(tibAddr); VM.sysWrite("\n"); ObjectModel.dumpHeader(ref); return false; } ObjectReference type = ObjectReference.fromObject(tib.getType()); if (!validType(type)) { VM.sysWrite("validRef: invalid TYPE, ref = "); VM.sysWrite(ref); VM.sysWrite(" tib = "); VM.sysWrite(Magic.objectAsAddress(tib)); VM.sysWrite(" type = "); VM.sysWrite(type); VM.sysWrite("\n"); ObjectModel.dumpHeader(ref); return false; } return true; } // validRef
@Uninterruptible public static boolean mappedVMRef(ObjectReference ref) { return Space.isMappedObject(ref) && Mmapper.objectIsMapped(ref); }