/* * Copyright (c) 2007, 2012, 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 static com.sun.max.vm.VMConfiguration.*; import com.sun.max.annotate.*; import com.sun.max.unsafe.*; import com.sun.max.vm.layout.*; /** * A runtime value (of type {@link java.lang.Object}) that * can be stored in fields and array elements of other objects, and * which is used by the mutator to refer to objects and parts thereof. */ public abstract class Reference implements Accessor { protected Reference() { } @FOLD private static ReferenceScheme referenceScheme() { return vmConfig().referenceScheme(); } @INLINE public static Reference fromJava(Object object) { return referenceScheme().fromJava(object); } @INLINE public final Object toJava() { return referenceScheme().toJava(this); } @INLINE public static Reference fromOrigin(Pointer origin) { return referenceScheme().fromOrigin(origin); } @INLINE public final Pointer toOrigin() { return referenceScheme().toOrigin(this); } @INLINE public final Reference readHubReference() { return Layout.readHubReference(this); } @INLINE public final boolean isZero() { return referenceScheme().isZero(this); } @INLINE public static Reference zero() { return referenceScheme().zero(); } @INLINE public final boolean isAllOnes() { return referenceScheme().isAllOnes(this); } @INLINE public final boolean isTagged() { return referenceScheme().isTagged(this); } @INLINE public boolean equals(Reference other) { return other == this; } @INLINE public final boolean isMarked() { return referenceScheme().isMarked(this); } @INLINE public final Reference marked() { return referenceScheme().marked(this); } @INLINE public final Reference unmarked() { return referenceScheme().unmarked(this); } @INLINE public final byte readByte(Offset offset) { return referenceScheme().readByte(this, offset); } @INLINE public final byte readByte(int offset) { return referenceScheme().readByte(this, offset); } @INLINE public final byte getByte(int displacement, int index) { return referenceScheme().getByte(this, displacement, index); } @INLINE public final boolean readBoolean(Offset offset) { return referenceScheme().readBoolean(this, offset); } @INLINE public final boolean readBoolean(int offset) { return referenceScheme().readBoolean(this, offset); } @INLINE public final boolean getBoolean(int displacement, int index) { return referenceScheme().getBoolean(this, displacement, index); } @INLINE public final short readShort(Offset offset) { return referenceScheme().readShort(this, offset); } @INLINE public final short readShort(int offset) { return referenceScheme().readShort(this, offset); } @INLINE public final short getShort(int displacement, int index) { return referenceScheme().getShort(this, displacement, index); } @INLINE public final char readChar(Offset offset) { return referenceScheme().readChar(this, offset); } @INLINE public final char readChar(int offset) { return referenceScheme().readChar(this, offset); } @INLINE public final char getChar(int displacement, int index) { return referenceScheme().getChar(this, displacement, index); } @INLINE public final int readInt(Offset offset) { return referenceScheme().readInt(this, offset); } @INLINE public final int readInt(int offset) { return referenceScheme().readInt(this, offset); } @INLINE public final int getInt(int displacement, int index) { return referenceScheme().getInt(this, displacement, index); } @INLINE public final float readFloat(Offset offset) { return referenceScheme().readFloat(this, offset); } @INLINE public final float readFloat(int offset) { return referenceScheme().readFloat(this, offset); } @INLINE public final float getFloat(int displacement, int index) { return referenceScheme().getFloat(this, displacement, index); } @INLINE public final long readLong(Offset offset) { return referenceScheme().readLong(this, offset); } @INLINE public final long readLong(int offset) { return referenceScheme().readLong(this, offset); } @INLINE public final long getLong(int displacement, int index) { return referenceScheme().getLong(this, displacement, index); } @INLINE public final double readDouble(Offset offset) { return referenceScheme().readDouble(this, offset); } @INLINE public final double readDouble(int offset) { return referenceScheme().readDouble(this, offset); } @INLINE public final double getDouble(int displacement, int index) { return referenceScheme().getDouble(this, displacement, index); } @INLINE public final Word readWord(Offset offset) { return referenceScheme().readWord(this, offset); } @INLINE public final Word readWord(int offset) { return referenceScheme().readWord(this, offset); } @INLINE public final Word getWord(int displacement, int index) { return referenceScheme().getWord(this, displacement, index); } @INLINE public final Reference readReference(Offset offset) { return referenceScheme().readReference(this, offset); } @INLINE public final Reference readReference(int offset) { return referenceScheme().readReference(this, offset); } @INLINE public final Reference getReference(int displacement, int index) { return referenceScheme().getReference(this, displacement, index); } @INLINE public final void writeByte(Offset offset, byte value) { referenceScheme().writeByte(this, offset, value); } @INLINE public final void writeByte(int offset, byte value) { referenceScheme().writeByte(this, offset, value); } @INLINE public final void setByte(int displacement, int index, byte value) { referenceScheme().setByte(this, displacement, index, value); } @INLINE public final void writeBoolean(Offset offset, boolean value) { referenceScheme().writeBoolean(this, offset, value); } @INLINE public final void writeBoolean(int offset, boolean value) { referenceScheme().writeBoolean(this, offset, value); } @INLINE public final void setBoolean(int displacement, int index, boolean value) { referenceScheme().setBoolean(this, displacement, index, value); } @INLINE public final void writeShort(Offset offset, short value) { referenceScheme().writeShort(this, offset, value); } @INLINE public final void writeShort(int offset, short value) { referenceScheme().writeShort(this, offset, value); } @INLINE public final void setShort(int displacement, int index, short value) { referenceScheme().setShort(this, displacement, index, value); } @INLINE public final void writeChar(Offset offset, char value) { referenceScheme().writeChar(this, offset, value); } @INLINE public final void writeChar(int offset, char value) { referenceScheme().writeChar(this, offset, value); } @INLINE public final void setChar(int displacement, int index, char value) { referenceScheme().setChar(this, displacement, index, value); } @INLINE public final void writeInt(Offset offset, int value) { referenceScheme().writeInt(this, offset, value); } @INLINE public final void writeInt(int offset, int value) { referenceScheme().writeInt(this, offset, value); } @INLINE public final void setInt(int displacement, int index, int value) { referenceScheme().setInt(this, displacement, index, value); } @INLINE public final void writeFloat(Offset offset, float value) { referenceScheme().writeFloat(this, offset, value); } @INLINE public final void writeFloat(int offset, float value) { referenceScheme().writeFloat(this, offset, value); } @INLINE public final void setFloat(int displacement, int index, float value) { referenceScheme().setFloat(this, displacement, index, value); } @INLINE public final void writeLong(Offset offset, long value) { referenceScheme().writeLong(this, offset, value); } @INLINE public final void writeLong(int offset, long value) { referenceScheme().writeLong(this, offset, value); } @INLINE public final void setLong(int displacement, int index, long value) { referenceScheme().setLong(this, displacement, index, value); } @INLINE public final void writeDouble(Offset offset, double value) { referenceScheme().writeDouble(this, offset, value); } @INLINE public final void writeDouble(int offset, double value) { referenceScheme().writeDouble(this, offset, value); } @INLINE public final void setDouble(int displacement, int index, double value) { referenceScheme().setDouble(this, displacement, index, value); } @INLINE public final void writeWord(Offset offset, Word value) { referenceScheme().writeWord(this, offset, value); } @INLINE public final void writeWord(int offset, Word value) { referenceScheme().writeWord(this, offset, value); } @INLINE public final void setWord(int displacement, int index, Word value) { referenceScheme().setWord(this, displacement, index, value); } @INLINE public final void writeReference(Offset offset, Reference value) { referenceScheme().writeReference(this, offset, value); } @INLINE public final void writeReference(int offset, Reference value) { referenceScheme().writeReference(this, offset, value); } @INLINE public final void setReference(int displacement, int index, Reference value) { referenceScheme().setReference(this, displacement, index, value); } /** * Atomically compares the contents of a memory location to a given value and, if they are the same, modifies the * contents of that memory location to a given new value. * * @param offset the offset from this reference of the memory location to be tested and potentially updated * @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}) */ @INLINE public final int compareAndSwapInt(Offset offset, int expectedValue, int newValue) { return referenceScheme().compareAndSwapInt(this, offset, expectedValue, newValue); } /** * @see #compareAndSwapInt(Offset, int, int) */ @INLINE public final int compareAndSwapInt(int offset, int expectedValue, int newValue) { return referenceScheme().compareAndSwapInt(this, offset, expectedValue, newValue); } /** * @see #compareAndSwapInt(Offset, int, int) */ @INLINE public final Word compareAndSwapWord(Offset offset, Word expectedValue, Word newValue) { return referenceScheme().compareAndSwapWord(this, offset, expectedValue, newValue); } /** * @see #compareAndSwapInt(Offset, int, int) */ @INLINE public final Word compareAndSwapWord(int offset, Word expectedValue, Word newValue) { return referenceScheme().compareAndSwapWord(this, offset, expectedValue, newValue); } /** * @see #compareAndSwapInt(Offset, int, int) */ @INLINE public final Reference compareAndSwapReference(Offset offset, Reference expectedValue, Reference newValue) { return referenceScheme().compareAndSwapReference(this, offset, expectedValue, newValue); } /** * @see #compareAndSwapInt(Offset, int, int) */ @INLINE public final Reference compareAndSwapReference(int offset, Reference expectedValue, Reference newValue) { return referenceScheme().compareAndSwapReference(this, offset, expectedValue, newValue); } @HOSTED_ONLY public final void copyElements(int displacement, int srcIndex, Object dst, int dstIndex, int length) { referenceScheme().copyElements(displacement, this, srcIndex, dst, dstIndex, length); } }