/* object.h

   Macros for manipulating objects.  Included in macros.h

 */

#ifndef __OBJECT_H
#define __OBJECT_H

/* Returns a pointer to the header word for object X. */
#define OBJECT_HEADER_PTR(X) ((X) - 1)

/* Returns the header word given a pointer to an object. */
#define OBJECT_HEADER(X) (*((X) - 1))

/* Extracts a header indirectly, i.e. if the object has been forwarded. *X
   should point to the forwarded object. */
#define INDIRECT_HEADER(X) (*(((Word *)X) - 1))

/* Forward a pointer X to F, where F is the forwarding pointer */
#define UPDATE_POINTER(X,F) (*(X) = (Word *)(F))

/* X is an object.  L is its new locations.  This macros sets up the forwarding pointer.*/
#define OBJECT_FORWARD(X,L) (OBJECT_HEADER(X) = (Word)L);

/* Returns non-zero if object X has been forwarded. */
#define OBJECT_FORWARDED(X) GC_FORWARDED(OBJECT_HEADER(X))

/* Pins the object X */
#define OBJECT_PIN(X) GC_PIN(OBJECT_HEADER(X))

/* Returns non-zero if object X is pinned. */
#define OBJECT_PINNED(X) (GC_EXTRACT_STATUS(OBJECT_HEADER(X)) == GC_PINNED)

/* Traverses the object X */
#define OBJECT_TRAVERSE(X) GC_TRAVERSE(OBJECT_HEADER(X))

/* Returns non-zero if object X has been traversed. */
#define OBJECT_TRAVERSED(X) (GC_EXTRACT_STATUS(OBJECT_HEADER(X))==GC_TRAVERSED)

/* Returns non-zero if object X has not been forwarded and is non-empty. */
#define OBJECT_VALID(X) (GC_EXTRACT_STATUS(OBJECT_HEADER(X))!= GC_MOVED)

#endif

/* (c) Frederick Smith, Greg Morrisett.
 *     October 1998, all rights reserved.
 *
 *
 *              Copyright 1990-1993 Digital Equipment Corporation
 *                         All Rights Reserved
 *
 * Permission to use, copy, and modify this software and its documentation is
 * hereby granted only under the following terms and conditions.  Both the
 * above copyright notice and this permission notice must appear in all copies
 * of the software, derivative works or modified versions, and any portions
 * thereof, and both notices must appear in supporting documentation.
 *
 * Users of this software agree to the terms and conditions set forth herein,
 * and hereby grant back to Digital a non-exclusive, unrestricted, royalty-free
 * right and license under any changes, enhancements or extensions made to the
 * core functions of the software, including but not limited to those affording
 * compatibility with other hardware or software environments, but excluding
 * applications which incorporate this software.  Users further agree to use
 * their best efforts to return to Digital any such changes, enhancements or
 * extensions that they make and inform Digital of noteworthy uses of this
 * software.  Correspondence should be provided to Digital at:
 * 
 *                       Director of Licensing
 *                       Western Research Laboratory
 *                       Digital Equipment Corporation
 *                       250 University Avenue
 *                       Palo Alto, California  94301  
 * 
 * This software may be distributed (but not offered for sale or transferred
 * for compensation) to third parties, provided such third parties agree to
 * abide by the terms and conditions of this notice.  
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 */
