home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
mitsch75.zip
/
scheme-7_5_17-src.zip
/
scheme-7.5.17
/
src
/
microcode
/
object.h
< prev
next >
Wrap
C/C++ Source or Header
|
2000-12-05
|
19KB
|
512 lines
/* -*-C-*-
$Id: object.h,v 9.50 2000/12/05 21:23:46 cph Exp $
Copyright (c) 1987-2000 Massachusetts Institute of Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program 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 for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* This file defines the macros which define and manipulate Scheme
objects. This is the lowest level of abstraction in this program.
*/
#ifndef SCM_OBJECT_H
#define SCM_OBJECT_H
/* The value in "Wsize.c" for `TYPE_CODE_LENGTH' must match this!! */
#ifndef TYPE_CODE_LENGTH
# define TYPE_CODE_LENGTH 8
#endif
#if defined(MIN_TYPE_CODE_LENGTH) && (TYPE_CODE_LENGTH < MIN_TYPE_CODE_LENGTH)
# include "Inconsistency between object.h and types.h: MIN_TYPE_CODE_LENGTH"
#endif
#if (SIZEOF_UNSIGNED_LONG == 4) /* 32 bit word versions */
# if (TYPE_CODE_LENGTH == 8)
# define MAX_TYPE_CODE 0xFF
# define DATUM_LENGTH 24
# define FIXNUM_LENGTH 23
# define FIXNUM_SIGN_BIT 0x00800000
# define SIGN_MASK 0xFF800000
# define SMALLEST_FIXNUM ((long) 0xFF800000)
# define BIGGEST_FIXNUM ((long) 0x007FFFFF)
# define HALF_DATUM_LENGTH 12
# define HALF_DATUM_MASK 0x00000FFF
# define DATUM_MASK 0x00FFFFFF
# define TYPE_CODE_MASK 0xFF000000
# endif
# if (TYPE_CODE_LENGTH == 6)
# define MAX_TYPE_CODE 0x3F
# define DATUM_LENGTH 26
# define FIXNUM_LENGTH 25
# define FIXNUM_SIGN_BIT 0x02000000
# define SIGN_MASK 0xFE000000
# define SMALLEST_FIXNUM ((long) 0xFE000000)
# define BIGGEST_FIXNUM ((long) 0x01FFFFFF)
# define HALF_DATUM_LENGTH 13
# define HALF_DATUM_MASK 0x00001FFF
# define DATUM_MASK 0x03FFFFFF
# define TYPE_CODE_MASK 0XFC000000
# endif
#endif
#ifndef DATUM_LENGTH /* Safe versions */
# define MAX_TYPE_CODE ((1 << TYPE_CODE_LENGTH) - 1)
# define DATUM_LENGTH (OBJECT_LENGTH - TYPE_CODE_LENGTH)
/* FIXNUM_LENGTH does NOT include the sign bit! */
# define FIXNUM_LENGTH (DATUM_LENGTH - 1)
# define FIXNUM_SIGN_BIT (1L << FIXNUM_LENGTH)
# define SIGN_MASK ((long) (-1L << FIXNUM_LENGTH))
# define SMALLEST_FIXNUM ((long) (-1L << FIXNUM_LENGTH))
# define BIGGEST_FIXNUM ((1L << FIXNUM_LENGTH) - 1)
# define HALF_DATUM_LENGTH (DATUM_LENGTH / 2)
# define HALF_DATUM_MASK ((1L << HALF_DATUM_LENGTH) - 1)
# define DATUM_MASK ((1L << DATUM_LENGTH) - 1)
# define TYPE_CODE_MASK (~ DATUM_MASK)
#endif
/* Basic object structure */
#ifndef OBJECT_TYPE
#ifdef UNSIGNED_SHIFT_BUG
/* This fixes bug in some compilers. */
#define OBJECT_TYPE(object) (((object) >> DATUM_LENGTH) & MAX_TYPE_CODE)
#else
/* Faster for logical shifts */
#define OBJECT_TYPE(object) ((object) >> DATUM_LENGTH)
#endif
#endif
#define OBJECT_DATUM(object) ((object) & DATUM_MASK)
#define OBJECT_ADDRESS(object) (DATUM_TO_ADDRESS ((object) & DATUM_MASK))
#define MAKE_OBJECT(type, datum) \
((((unsigned long) (type)) << DATUM_LENGTH) | (datum))
#define OBJECT_NEW_DATUM(type_object, datum) \
(((type_object) & TYPE_CODE_MASK) | (datum))
#define OBJECT_NEW_TYPE(type, datum_object) \
(MAKE_OBJECT ((type), (OBJECT_DATUM (datum_object))))
#define MAKE_OBJECT_FROM_OBJECTS(type_object, datum_object) \
(((type_object) & TYPE_CODE_MASK) | ((datum_object) & DATUM_MASK))
#define MAKE_POINTER_OBJECT(type, address) \
(MAKE_OBJECT ((type), (ADDRESS_TO_DATUM (address))))
#define OBJECT_NEW_ADDRESS(object, address) \
(OBJECT_NEW_DATUM ((object), (ADDRESS_TO_DATUM (address))))
/* Machine dependencies */
#ifndef HEAP_MALLOC
# define HEAP_MALLOC malloc
#endif
#ifdef HEAP_IN_LOW_MEMORY /* Storing absolute addresses */
typedef long relocation_type; /* Used to relocate pointers on fasload */
#define ALLOCATE_HEAP_SPACE(space,low,high) do \
{ \
unsigned long _space = (space); \
SCHEME_OBJECT * _low \
= ((SCHEME_OBJECT *) \
(HEAP_MALLOC ((sizeof (SCHEME_OBJECT)) * _space))); \
\
(low) = _low; \
(high) = (_low + _space); \
} while (0)
#ifndef DATUM_TO_ADDRESS
#define DATUM_TO_ADDRESS(datum) ((SCHEME_OBJECT *) (datum))
#endif
#ifndef ADDRESS_TO_DATUM
#define ADDRESS_TO_DATUM(address) ((SCHEME_OBJECT) (address))
#endif
#else /* not HEAP_IN_LOW_MEMORY (portable version) */
/* Used to relocate pointers on fasload */
typedef SCHEME_OBJECT * relocation_type;
extern SCHEME_OBJECT * memory_base;
#define ALLOCATE_HEAP_SPACE(space,low,high) do \
{ \
unsigned long _space = (space); \
memory_base = ((SCHEME_OBJECT *) \
(HEAP_MALLOC ((sizeof (SCHEME_OBJECT)) * _space))); \
(low) = memory_base; \
(high) = (memory_base + _space); \
} while (0)
#ifndef DATUM_TO_ADDRESS
#define DATUM_TO_ADDRESS(datum) ((SCHEME_OBJECT *) ((datum) + memory_base))
#endif
#ifndef ADDRESS_TO_DATUM
#define ADDRESS_TO_DATUM(address) ((SCHEME_OBJECT) ((address) - memory_base))
#endif
#endif /* HEAP_IN_LOW_MEMORY */
#ifndef SCHEME_ADDR_TO_ADDR
typedef SCHEME_OBJECT * SCHEME_ADDR;
# define SCHEME_ADDR_TO_ADDR(saddr) ((SCHEME_OBJECT *) (saddr))
# define ADDR_TO_SCHEME_ADDR(caddr) ((SCHEME_OBJECT) (caddr))
#endif /* SCHEME_ADDR_TO_ADDR */
/* Lots of type predicates */
#define FIXNUM_P(object) ((OBJECT_TYPE (object)) == TC_FIXNUM)
#define BIGNUM_P(object) ((OBJECT_TYPE (object)) == TC_BIG_FIXNUM)
#define FLONUM_P(object) ((OBJECT_TYPE (object)) == TC_BIG_FLONUM)
#define COMPLEX_P(object) ((OBJECT_TYPE (object)) == TC_COMPLEX)
#define CHARACTER_P(object) ((OBJECT_TYPE (object)) == TC_CHARACTER)
#define STRING_P(object) ((OBJECT_TYPE (object)) == TC_CHARACTER_STRING)
#define BIT_STRING_P(object) ((OBJECT_TYPE (object)) == TC_BIT_STRING)
#define CELL_P(object) ((OBJECT_TYPE (object)) == TC_CELL)
#define PAIR_P(object) ((OBJECT_TYPE (object)) == TC_LIST)
#define WEAK_PAIR_P(object) ((OBJECT_TYPE (object)) == TC_WEAK_CONS)
#define VECTOR_P(object) ((OBJECT_TYPE (object)) == TC_VECTOR)
#define RECORD_P(object) ((OBJECT_TYPE (object)) == TC_RECORD)
#define BOOLEAN_P(object) (((object) == SHARP_T) || ((object) == SHARP_F))
#define REFERENCE_TRAP_P(object) ((OBJECT_TYPE (object)) == TC_REFERENCE_TRAP)
#define PRIMITIVE_P(object) ((OBJECT_TYPE (object)) == TC_PRIMITIVE)
#define FUTURE_P(object) ((OBJECT_TYPE (object)) == TC_FUTURE)
#define PROMISE_P(object) ((OBJECT_TYPE (object)) == TC_DELAYED)
#define APPARENT_LIST_P(object) (((object) == EMPTY_LIST) || (PAIR_P (object)))
#define CONTROL_POINT_P(object) ((OBJECT_TYPE (object)) == TC_CONTROL_POINT)
#define BROKEN_HEART_P(object) ((OBJECT_TYPE (object)) == TC_BROKEN_HEART)
#define GC_NON_POINTER_P(object) ((GC_Type (object)) == GC_Non_Pointer)
#define GC_CELL_P(object) ((GC_Type (object)) == GC_Cell)
#define GC_PAIR_P(object) ((GC_Type (object)) == GC_Pair)
#define GC_TRIPLE_P(object) ((GC_Type (object)) == GC_Triple)
#define GC_QUADRUPLE_P(object) ((GC_Type (object)) == GC_Quadruple)
#define GC_VECTOR_P(object) ((GC_Type (object)) == GC_Vector)
#define COMPILED_CODE_ADDRESS_P(object) \
((OBJECT_TYPE (object)) == TC_COMPILED_ENTRY)
#define STACK_ADDRESS_P(object) \
((OBJECT_TYPE (object)) == TC_STACK_ENVIRONMENT)
#define NON_MARKED_VECTOR_P(object) \
((OBJECT_TYPE (object)) == TC_NON_MARKED_VECTOR)
#define SYMBOL_P(object) \
(((OBJECT_TYPE (object)) == TC_INTERNED_SYMBOL) || \
((OBJECT_TYPE (object)) == TC_UNINTERNED_SYMBOL))
#define INTEGER_P(object) \
(((OBJECT_TYPE (object)) == TC_FIXNUM) || \
((OBJECT_TYPE (object)) == TC_BIG_FIXNUM))
#define REAL_P(object) \
(((OBJECT_TYPE (object)) == TC_FIXNUM) || \
((OBJECT_TYPE (object)) == TC_BIG_FIXNUM) || \
((OBJECT_TYPE (object)) == TC_BIG_FLONUM))
#define NUMBER_P(object) \
(((OBJECT_TYPE (object)) == TC_FIXNUM) || \
((OBJECT_TYPE (object)) == TC_BIG_FIXNUM) || \
((OBJECT_TYPE (object)) == TC_BIG_FLONUM) \
((OBJECT_TYPE (object)) == TC_COMPLEX))
#define HUNK3_P(object) \
(((OBJECT_TYPE (object)) == TC_HUNK3_A) || \
((OBJECT_TYPE (object)) == TC_HUNK3_B))
#define INTERPRETER_APPLICABLE_P interpreter_applicable_p
#define ENVIRONMENT_P(env) \
((OBJECT_TYPE (env) == TC_ENVIRONMENT) || \
(OBJECT_TYPE (env) == GLOBAL_ENV))
/* Memory Operations */
/* The FAST_ operations are used only where the object is known to be
immutable. On a parallel processor they don't require atomic
references. */
#define FAST_MEMORY_REF(object, offset) \
((OBJECT_ADDRESS (object)) [(offset)])
#define FAST_MEMORY_SET(object, offset, value) \
((OBJECT_ADDRESS (object)) [(offset)]) = (value)
#define MEMORY_LOC(object, offset) \
(& ((OBJECT_ADDRESS (object)) [(offset)]))
/* General case memory access requires atomicity for parallel processors. */
#define MEMORY_REF(object, offset) \
(MEMORY_FETCH ((OBJECT_ADDRESS (object)) [(offset)]))
#define MEMORY_SET(object, offset, value) \
MEMORY_STORE (((OBJECT_ADDRESS (object)) [(offset)]), (value))
/* Pair Operations */
#define FAST_PAIR_CAR(pair) (FAST_MEMORY_REF ((pair), CONS_CAR))
#define FAST_PAIR_CDR(pair) (FAST_MEMORY_REF ((pair), CONS_CDR))
#define FAST_SET_PAIR_CAR(pair, car) FAST_MEMORY_SET ((pair), CONS_CAR, (car))
#define FAST_SET_PAIR_CDR(pair, cdr) FAST_MEMORY_SET ((pair), CONS_CDR, (cdr))
#define PAIR_CAR_LOC(pair) (MEMORY_LOC ((pair), CONS_CAR))
#define PAIR_CDR_LOC(pair) (MEMORY_LOC ((pair), CONS_CDR))
#define PAIR_CAR(pair) (MEMORY_REF ((pair), CONS_CAR))
#define PAIR_CDR(pair) (MEMORY_REF ((pair), CONS_CDR))
#define SET_PAIR_CAR(pair, car) MEMORY_SET ((pair), CONS_CAR, (car))
#define SET_PAIR_CDR(pair, cdr) MEMORY_SET ((pair), CONS_CDR, (cdr))
/* Vector Operations */
#define VECTOR_LENGTH(vector) (OBJECT_DATUM (FAST_MEMORY_REF ((vector), 0)))
#define SET_VECTOR_LENGTH(vector, length) \
FAST_MEMORY_SET \
((vector), \
0, \
(OBJECT_NEW_DATUM ((FAST_MEMORY_REF ((vector), 0)), (length))));
#define FAST_VECTOR_REF(vector, index) \
(FAST_MEMORY_REF ((vector), ((index) + 1)))
#define FAST_VECTOR_SET(vector, index, value) \
FAST_MEMORY_SET ((vector), ((index) + 1), (value))
#define VECTOR_LOC(vector, index) (MEMORY_LOC ((vector), ((index) + 1)))
#define VECTOR_REF(vector, index) (MEMORY_REF ((vector), ((index) + 1)))
#define VECTOR_SET(vector, index, value) \
MEMORY_SET ((vector), ((index) + 1), (value))
/* String Operations */
/* Add 1 byte to length to account for '\0' at end of string.
Add 1 word to length to account for string header word. */
#define STRING_LENGTH_TO_GC_LENGTH(length) \
((BYTES_TO_WORDS ((length) + 1)) + 1)
#define STRING_LENGTH(string) \
((long) (MEMORY_REF ((string), STRING_LENGTH_INDEX)))
#define SET_STRING_LENGTH(string, length) do \
{ \
MEMORY_SET ((string), STRING_LENGTH_INDEX, (length)); \
STRING_SET ((string), (length), '\0'); \
} while (0)
/* Subtract 1 to account for the fact that we maintain a '\0'
at the end of the string. */
#define MAXIMUM_STRING_LENGTH(string) \
((long) ((((VECTOR_LENGTH (string)) - 1) * (sizeof (SCHEME_OBJECT))) - 1))
#define SET_MAXIMUM_STRING_LENGTH(string, length) \
SET_VECTOR_LENGTH ((string), (STRING_LENGTH_TO_GC_LENGTH (length)))
#define STRING_LOC(string, index) \
(((unsigned char *) (MEMORY_LOC (string, STRING_CHARS))) + (index))
#define STRING_REF(string, index) \
((int) (* (STRING_LOC ((string), (index)))))
#define STRING_SET(string, index, c_char) \
(* (STRING_LOC ((string), (index)))) = (c_char)
/* Character Operations */
#define ASCII_LENGTH CHAR_BIT /* CHAR_BIT in config.h - 8 for unix */
#define CODE_LENGTH 16
#define BITS_LENGTH 5
#define MIT_ASCII_LENGTH 21
#define CHAR_BITS_META 01
#define CHAR_BITS_CONTROL 02
#define CHAR_BITS_CONTROL_META 03
#define MAX_ASCII (1L << ASCII_LENGTH)
#define MAX_CODE (1L << CODE_LENGTH)
#define MAX_BITS (1L << BITS_LENGTH)
#define MAX_MIT_ASCII (1L << MIT_ASCII_LENGTH)
#define MASK_ASCII (MAX_ASCII - 1)
#define CHAR_MASK_CODE (MAX_CODE - 1)
#define CHAR_MASK_BITS (MAX_BITS - 1)
#define MASK_MIT_ASCII (MAX_MIT_ASCII - 1)
#define ASCII_TO_CHAR(ascii) (MAKE_OBJECT (TC_CHARACTER, (ascii)))
#define CHAR_TO_ASCII_P(object) ((OBJECT_DATUM (object)) < MAX_ASCII)
#define CHAR_TO_ASCII(object) ((object) & MASK_ASCII)
#define MAKE_CHAR(bucky_bits, code) \
(MAKE_OBJECT \
(TC_CHARACTER, \
(((unsigned long) (bucky_bits)) << (CODE_LENGTH)) | (code)))
#define CHAR_BITS(chr) \
((((unsigned long) (OBJECT_DATUM (chr))) >> CODE_LENGTH) & CHAR_MASK_BITS)
#define CHAR_CODE(chr) ((OBJECT_DATUM (chr)) & CHAR_MASK_CODE)
/* Fixnum Operations */
#define FIXNUM_ZERO_P(fixnum) ((OBJECT_DATUM (fixnum)) == 0)
#define FIXNUM_NEGATIVE_P(fixnum) (((fixnum) & FIXNUM_SIGN_BIT) != 0)
#define UNSIGNED_FIXNUM_P(x) ((FIXNUM_P (x)) && (! (FIXNUM_NEGATIVE_P (x))))
#define FIXNUM_EQUAL_P(x, y) ((OBJECT_DATUM (x)) == (OBJECT_DATUM (y)))
#define FIXNUM_LESS_P(x, y) ((FIXNUM_TO_LONG (x)) < (FIXNUM_TO_LONG (y)))
#define FIXNUM_POSITIVE_P(fixnum) \
(! ((FIXNUM_ZERO_P (fixnum)) || (FIXNUM_NEGATIVE_P (fixnum))))
#define UNSIGNED_FIXNUM_TO_LONG(fixnum) ((long) (OBJECT_DATUM (fixnum)))
#define LONG_TO_UNSIGNED_FIXNUM_P(value) (((value) & SIGN_MASK) == 0)
#define LONG_TO_UNSIGNED_FIXNUM(value) (FIXNUM_ZERO + (value))
#define LONG_TO_FIXNUM(value) (OBJECT_NEW_TYPE (TC_FIXNUM, (value)))
#define LONG_TO_FIXNUM_P(value) \
((((value) & SIGN_MASK) == 0) || (((value) & SIGN_MASK) == SIGN_MASK))
#define FIXNUM_TO_LONG(fixnum) \
((((long) (fixnum)) ^ ((long) FIXNUM_SIGN_BIT)) \
- ((long) ((((unsigned long) TC_FIXNUM) << DATUM_LENGTH) \
| FIXNUM_SIGN_BIT)))
#define FIXNUM_TO_DOUBLE(fixnum) ((double) (FIXNUM_TO_LONG (fixnum)))
#define DOUBLE_TO_FIXNUM_P(number) \
(((number) > (((double) SMALLEST_FIXNUM) - 0.5)) && \
((number) < (((double) BIGGEST_FIXNUM) + 0.5)))
#ifdef HAVE_DOUBLE_TO_LONG_BUG
#define DOUBLE_TO_FIXNUM double_to_fixnum
#else
#define DOUBLE_TO_FIXNUM(number) (LONG_TO_FIXNUM ((long) (number)))
#endif
/* Bignum Operations */
#define BIGNUM_ZERO_P(bignum) \
((bignum_test (bignum)) == bignum_comparison_equal)
#define BIGNUM_NEGATIVE_P(bignum) \
((bignum_test (bignum)) == bignum_comparison_less)
#define BIGNUM_POSITIVE_P(bignum) \
((bignum_test (bignum)) == bignum_comparison_greater)
#define BIGNUM_LESS_P(x, y) \
((bignum_compare ((x), (y))) == bignum_comparison_less)
#define BIGNUM_TO_LONG_P(bignum) \
(bignum_fits_in_word_p ((bignum), ((sizeof (long)) * CHAR_BIT), 1))
#define BIGNUM_TO_ULONG_P(bignum) \
(bignum_fits_in_word_p ((bignum), ((sizeof (unsigned long)) * CHAR_BIT), 0))
/* If precision should not be lost,
compare to DBL_MANT_DIG instead. */
#define BIGNUM_TO_DOUBLE_P(bignum) \
(bignum_fits_in_word_p ((bignum), DBL_MAX_EXP, 0))
/* Flonum Operations */
#define FLONUM_SIZE (BYTES_TO_WORDS (sizeof (double)))
#define FLONUM_TO_DOUBLE(object) \
(* ((double *) (MEMORY_LOC ((object), 1))))
#define FLOAT_TO_FLONUM(expression) \
(double_to_flonum ((double) (expression)))
#define FLONUM_TRUNCATE(object) \
(double_to_flonum (double_truncate (FLONUM_TO_DOUBLE (object))))
/* Flonum-vector Operations */
#define FLOATING_VECTOR_LENGTH(vector) \
((VECTOR_LENGTH (vector)) / FLONUM_SIZE)
#define FLOATING_VECTOR_LOC(vector, index) \
((double *) (VECTOR_LOC ((vector), ((index) * FLONUM_SIZE))))
#define FLOATING_VECTOR_REF(vector, index) \
(* (FLOATING_VECTOR_LOC ((vector), (index))))
#define FLOATING_VECTOR_SET(vector, index, x) \
(* (FLOATING_VECTOR_LOC ((vector), (index)))) = ((double) (x))
/* Numeric Type Conversions */
#define BIGNUM_TO_FIXNUM_P(bignum) \
(bignum_fits_in_word_p ((bignum), (FIXNUM_LENGTH + 1), 1))
#define FIXNUM_TO_BIGNUM(fixnum) (long_to_bignum (FIXNUM_TO_LONG (fixnum)))
#define FIXNUM_TO_FLONUM(fixnum) (double_to_flonum (FIXNUM_TO_DOUBLE (fixnum)))
#define BIGNUM_TO_FIXNUM(bignum) (LONG_TO_FIXNUM (bignum_to_long (bignum)))
#define BIGNUM_TO_FLONUM_P BIGNUM_TO_DOUBLE_P
#define BIGNUM_TO_FLONUM(bignum) (double_to_flonum (bignum_to_double (bignum)))
#define FLONUM_TO_BIGNUM(flonum) (double_to_bignum (FLONUM_TO_DOUBLE (flonum)))
#define FLONUM_TO_INTEGER(x) (double_to_integer (FLONUM_TO_DOUBLE (x)))
#define INTEGER_TO_FLONUM_P integer_to_double_p
#define INTEGER_TO_FLONUM(n) (double_to_flonum (integer_to_double (n)))
#define BOOLEAN_TO_OBJECT(expression) ((expression) ? SHARP_T : SHARP_F)
#define OBJECT_TO_BOOLEAN(object) ((object) != SHARP_F)
#define MAKE_BROKEN_HEART(address) \
(BROKEN_HEART_ZERO + (ADDRESS_TO_DATUM (address)))
#define BYTES_TO_WORDS(nbytes) \
(((nbytes) + ((sizeof (SCHEME_OBJECT)) - 1)) / (sizeof (SCHEME_OBJECT)))
#define ADDRESS_CONSTANT_P(address) \
(((address) >= Constant_Space) && ((address) < Free_Constant))
#define ADDRESS_PURE_P(address) \
((ADDRESS_CONSTANT_P (address)) && (Pure_Test (address)))
#define ADDRESS_HEAP_P(address) \
(((address) >= Heap_Bottom) && ((address) < Heap_Top))
#define SIDE_EFFECT_IMPURIFY(Old_Pointer, Will_Contain) \
if ((ADDRESS_CONSTANT_P (OBJECT_ADDRESS (Old_Pointer))) && \
(GC_Type (Will_Contain) != GC_Non_Pointer) && \
(! (ADDRESS_CONSTANT_P (OBJECT_ADDRESS (Will_Contain)))) && \
(Pure_Test (OBJECT_ADDRESS (Old_Pointer)))) \
signal_error_from_primitive (ERR_WRITE_INTO_PURE_SPACE); \
#ifndef FLOATING_ALIGNMENT
#define FLOATING_ALIGNMENT 0
#endif /* not FLOATING_ALIGNMENT */
#define FLOATING_ALIGNED_P(ptr) \
((((unsigned long) ((ptr) + 1)) & FLOATING_ALIGNMENT) == 0)
#define ALIGN_FLOAT(Where) do \
{ \
while (! (FLOATING_ALIGNED_P (Where))) \
*Where++ = (MAKE_OBJECT (TC_MANIFEST_NM_VECTOR, 0)); \
} while (0)
#endif /* SCM_OBJECT_H */