/*
* 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 referred 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);
/**
* @param object the current object
* @return the object reference for the next object in the heap under
* contiguous allocation
*/
public abstract ObjectReference getNextObject(ObjectReference object);
/**
* @param start the start address of the 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 object
* @return the address of the first word after the the object
*/
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);
/**
* @param object address of the object
* @return whether the passed object is an array
*/
public abstract boolean isArray(ObjectReference object);
/**
* @param object address of the object
* @return whether the passed object is a primitive array
*/
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.
*
* @param typeRef the type of the reference (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();
}
}