| /* |
| * This file is part of the Jikes RVM project (http://jikesrvm.org). |
| * |
| * This file is licensed to You under the Eclipse Public License (EPL); |
| * You may not use this file except in compliance with the License. You |
| * may obtain a copy of the License at |
| * |
| * http://www.opensource.org/licenses/eclipse-1.0.php |
| * |
| * See the COPYRIGHT.txt file distributed with this work for information |
| * regarding copyright ownership. |
| */ |
| package org.mmtk.vm; |
| |
| import org.vmmagic.pragma.Uninterruptible; |
| import org.vmmagic.unboxed.*; |
| |
| @Uninterruptible public abstract class ObjectModel { |
| /** |
| * Copy an object using a plan's allocCopy to get space and install |
| * the forwarding pointer. On entry, <code>from</code> must have |
| * been reserved for copying by the caller. This method calls the |
| * plan's <code>getStatusForCopy()</code> method to establish a new |
| * status word for the copied object and <code>postCopy()</code> to |
| * allow the plan to perform any post copy actions. |
| * |
| * @param from the address of the object to be copied |
| * @param allocator The allocator to use. |
| * @return the address of the new object |
| */ |
| public abstract ObjectReference copy(ObjectReference from, int allocator); |
| |
| /** |
| * Copy an object to be pointer to by the to address. This is required |
| * for delayed-copy collectors such as compacting collectors. During the |
| * collection, MMTk reserves a region in the heap for an object as per |
| * requirements found from ObjectModel and then asks ObjectModel to |
| * determine what the object's reference will be post-copy. |
| * |
| * @param from the address of the object to be copied |
| * @param to The target location. |
| * @param region The start of the region that was reserved for this object |
| * @return Address The address past the end of the copied object |
| */ |
| public abstract Address copyTo(ObjectReference from, ObjectReference to, Address region); |
| |
| /** |
| * Return the reference that an object will be refered to after it is copied |
| * to the specified region. Used in delayed-copy collectors such as compacting |
| * collectors. |
| * |
| * @param from The object to be copied. |
| * @param to The region to be copied to. |
| * @return The resulting reference. |
| */ |
| public abstract ObjectReference getReferenceWhenCopiedTo(ObjectReference from, Address to); |
| |
| |
| /** |
| * Return the size required to copy an object |
| * |
| * @param object The object whose size is to be queried |
| * @return The size required to copy <code>obj</code> |
| */ |
| public abstract int getSizeWhenCopied(ObjectReference object); |
| |
| /** |
| * Return the alignment requirement for a copy of this object |
| * |
| * @param object The object whose size is to be queried |
| * @return The alignment required for a copy of <code>obj</code> |
| */ |
| public abstract int getAlignWhenCopied(ObjectReference object); |
| |
| /** |
| * Return the alignment offset requirements for a copy of this object |
| * |
| * @param object The object whose size is to be queried |
| * @return The alignment offset required for a copy of <code>obj</code> |
| */ |
| public abstract int getAlignOffsetWhenCopied(ObjectReference object); |
| |
| |
| /** |
| * Return the size used by an object |
| * |
| * @param object The object whose size is to be queried |
| * @return The size of <code>obj</code> |
| */ |
| public abstract int getCurrentSize(ObjectReference object); |
| |
| /** |
| * Return the next object in the heap under contiguous allocation |
| */ |
| public abstract ObjectReference getNextObject(ObjectReference object); |
| |
| /** |
| * Return an object reference from knowledge of the low order word |
| */ |
| public abstract ObjectReference getObjectFromStartAddress(Address start); |
| /** |
| * Gets a pointer to the address just past the end of the object. |
| * |
| * @param object The objecty. |
| */ |
| public abstract Address getObjectEndAddress(ObjectReference object); |
| |
| |
| /** |
| * Get the type descriptor for an object. |
| * |
| * @param ref address of the object |
| * @return byte array with the type descriptor |
| */ |
| public abstract byte[] getTypeDescriptor(ObjectReference ref); |
| |
| /** |
| * Is the passed object an array? |
| * |
| * @param object address of the object |
| */ |
| public abstract boolean isArray(ObjectReference object); |
| |
| /** |
| * Is the passed object a primitive array? |
| * |
| * @param object address of the object |
| */ |
| public abstract boolean isPrimitiveArray(ObjectReference object); |
| |
| /** |
| * Get the length of an array object. |
| * |
| * @param object address of the object |
| * @return The array length, in elements |
| */ |
| public abstract int getArrayLength(ObjectReference object); |
| |
| /** |
| * Attempts to set the bits available for memory manager use in an |
| * object. The attempt will only be successful if the current value |
| * of the bits matches <code>oldVal</code>. The comparison with the |
| * current value and setting are atomic with respect to other |
| * allocators. |
| * |
| * @param object the address of the object |
| * @param oldVal the required current value of the bits |
| * @param newVal the desired new value of the bits |
| * @return <code>true</code> if the bits were set, |
| * <code>false</code> otherwise |
| */ |
| public abstract boolean attemptAvailableBits(ObjectReference object, |
| Word oldVal, Word newVal); |
| |
| /** |
| * Gets the value of bits available for memory manager use in an |
| * object, in preparation for setting those bits. |
| * |
| * @param object the address of the object |
| * @return the value of the bits |
| */ |
| public abstract Word prepareAvailableBits(ObjectReference object); |
| |
| /** |
| * Sets the byte available for memory manager use in an object. |
| * |
| * @param object the address of the object |
| * @param val the new value of the byte |
| */ |
| public abstract void writeAvailableByte(ObjectReference object, byte val); |
| /** |
| * Read the byte available for memory manager use in an object. |
| * |
| * @param object the address of the object |
| * @return the value of the byte |
| */ |
| public abstract byte readAvailableByte(ObjectReference object); |
| |
| /** |
| * Sets the bits available for memory manager use in an object. |
| * |
| * @param object the address of the object |
| * @param val the new value of the bits |
| */ |
| public abstract void writeAvailableBitsWord(ObjectReference object, Word val); |
| /** |
| * Read the bits available for memory manager use in an object. |
| * |
| * @param object the address of the object |
| * @return the value of the bits |
| */ |
| public abstract Word readAvailableBitsWord(ObjectReference object); |
| |
| /** |
| * Gets the offset of the memory management header from the object |
| * reference address. XXX The object model / memory manager |
| * interface should be improved so that the memory manager does not |
| * need to know this. |
| * |
| * @return the offset, relative the object reference address |
| */ |
| public abstract Offset GC_HEADER_OFFSET(); |
| |
| /** |
| * Returns the lowest address of the storage associated with an object. |
| * |
| * @param object the reference address of the object |
| * @return the lowest address of the object |
| */ |
| public abstract Address objectStartRef(ObjectReference object); |
| |
| /** |
| * Returns an address guaranteed to be inside the storage assocatied |
| * with and object. |
| * |
| * @param object the reference address of the object |
| * @return an address inside the object |
| */ |
| public abstract Address refToAddress(ObjectReference object); |
| |
| /** |
| * Checks if a reference of the given type in another object is |
| * inherently acyclic. The type is given as a TIB. |
| * |
| * @return <code>true</code> if a reference of the type is |
| * inherently acyclic |
| */ |
| public abstract boolean isAcyclic(ObjectReference typeRef); |
| |
| /** |
| * Dump debugging information for an object. |
| * |
| * @param object The object whose information is to be dumped |
| */ |
| public abstract void dumpObject(ObjectReference object); |
| |
| /* |
| * NOTE: The following methods must be implemented by subclasses of this |
| * class, but are internal to the VM<->MM interface glue, so are never |
| * called by MMTk users. |
| */ |
| /** @return The offset from array reference to element zero */ |
| protected abstract Offset getArrayBaseOffset(); |
| |
| /* |
| * NOTE: These methods should not be called by anything other than the |
| * reflective mechanisms in org.mmtk.vm.VM, and are not implemented by |
| * subclasses. |
| * |
| * This hack exists only to allow us to declare the respective |
| * methods as protected. |
| */ |
| static Offset arrayBaseOffsetTrapdoor(ObjectModel o) { |
| return o.getArrayBaseOffset(); |
| } |
| } |