/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.max.vm.reference; import com.sun.max.annotate.*; import com.sun.max.unsafe.*; import com.sun.max.vm.*; /** * Reference-based object access methods for mutator use. * * @see Reference */ public interface ReferenceScheme extends VMScheme { Reference fromOrigin(Pointer origin); Reference fromJava(Object object); Object toJava(Reference reference); Pointer toOrigin(Reference reference); /** * @return the "zero" ref that represents 'null'. */ Reference zero(); boolean isZero(Reference ref); boolean isAllOnes(Reference ref); boolean isMarked(Reference ref); boolean isTagged(Reference ref); Reference marked(Reference ref); Reference unmarked(Reference ref); byte readByte(Reference reference, Offset offset); byte readByte(Reference reference, int offset); byte getByte(Reference reference, int displacement, int index); boolean readBoolean(Reference reference, Offset offset); boolean readBoolean(Reference reference, int offset); boolean getBoolean(Reference reference, int displacement, int index); short readShort(Reference reference, Offset offset); short readShort(Reference reference, int offset); short getShort(Reference reference, int displacement, int index); char readChar(Reference reference, Offset offset); char readChar(Reference reference, int offset); char getChar(Reference reference, int displacement, int index); int readInt(Reference reference, Offset offset); int readInt(Reference reference, int offset); int getInt(Reference reference, int displacement, int index); float readFloat(Reference reference, Offset offset); float readFloat(Reference reference, int offset); float getFloat(Reference reference, int displacement, int index); long readLong(Reference reference, Offset offset); long readLong(Reference reference, int offset); long getLong(Reference reference, int displacement, int index); double readDouble(Reference reference, Offset offset); double readDouble(Reference reference, int offset); double getDouble(Reference reference, int displacement, int index); Word readWord(Reference reference, Offset offset); Word readWord(Reference reference, int offset); Word getWord(Reference reference, int displacement, int index); Reference readReference(Reference reference, Offset offset); Reference readReference(Reference reference, int offset); Reference getReference(Reference reference, int displacement, int index); void writeByte(Reference reference, Offset offset, byte value); void writeByte(Reference reference, int offset, byte value); void setByte(Reference reference, int displacement, int index, byte value); void writeBoolean(Reference reference, Offset offset, boolean value); void writeBoolean(Reference reference, int offset, boolean value); void setBoolean(Reference reference, int displacement, int index, boolean value); void writeShort(Reference reference, Offset offset, short value); void writeShort(Reference reference, int offset, short value); void setShort(Reference reference, int displacement, int index, short value); void writeChar(Reference reference, Offset offset, char value); void writeChar(Reference reference, int offset, char value); void setChar(Reference reference, int displacement, int index, char value); void writeInt(Reference reference, Offset offset, int value); void writeInt(Reference reference, int offset, int value); void setInt(Reference reference, int displacement, int index, int value); void writeFloat(Reference reference, Offset offset, float value); void writeFloat(Reference reference, int offset, float value); void setFloat(Reference reference, int displacement, int index, float value); void writeLong(Reference reference, Offset offset, long value); void writeLong(Reference reference, int offset, long value); void setLong(Reference reference, int displacement, int index, long value); void writeDouble(Reference reference, Offset offset, double value); void writeDouble(Reference reference, int offset, double value); void setDouble(Reference reference, int displacement, int index, double value); void writeWord(Reference reference, Offset offset, Word value); void writeWord(Reference reference, int offset, Word value); void setWord(Reference reference, int displacement, int index, Word value); void writeReference(Reference reference, Offset offset, Reference value); void writeReference(Reference reference, int offset, Reference value); void setReference(Reference reference, int displacement, int index, Reference value); /** * Atomically compares the contents of the memory location addressed by adding {@code offset} to {@code reference} * to a given value and, if they are the same, modifies the contents of that memory location to a given new value. * * @param reference the base of the memory location * @param offset the offset of the memory location * @param expectedValue the value that must currently exist in the memory location for the update to occur * @param newValue the value to which the memory is updated if its current value is {@code expectedValue} * @return the value of the memory location before this call; if it is equal to {@code expectedValue}, then the * update occurred, otherwise the update did not occur (assuming {@code expectedValue != newValue}) */ int compareAndSwapInt(Reference reference, Offset offset, int expectedValue, int newValue); /** * @see #compareAndSwapInt(Reference, Offset, int, int) */ int compareAndSwapInt(Reference reference, int offset, int expectedValue, int newValue); /** * @see #compareAndSwapInt(Reference, Offset, int, int) */ Word compareAndSwapWord(Reference reference, Offset offset, Word expectedValue, Word newValue); /** * @see #compareAndSwapInt(Reference, Offset, int, int) */ Word compareAndSwapWord(Reference reference, int offset, Word expectedValue, Word newValue); Reference compareAndSwapReference(Reference reference, Offset offset, Reference expectedValue, Reference newValue); Reference compareAndSwapReference(Reference reference, int offset, Reference expectedValue, Reference newValue); void copyElements(int displacement, Reference src, int srcIndex, Object dst, int dstIndex, int length); /** * Gets the byte pattern for a reference to be written into the boot image. * * @param origin the origin of the reference to be written */ @HOSTED_ONLY byte[] asBytes(Pointer origin); /** * Gets the byte pattern for a null reference to be written into the boot image. */ @HOSTED_ONLY byte[] nullAsBytes(); }