/* -----------------------------------------------------------------------------
- * $Id: StgTypes.h,v 1.2 1998/12/02 13:21:41 simonm Exp $
+ * $Id: StgTypes.h,v 1.12 2000/06/12 11:04:12 simonmar Exp $
+ *
+ * (c) The GHC Team, 1998-1999
*
* Various C datatypes used in the run-time system.
* Specifically:
- StgInt8, 16, 32, 64
- StgNat8, 16, 32, 64
+ StgInt8, 16, 32, 64
+ StgWord8, 16, 32, 64
StgChar, StgFloat, StgDouble
***** All the same size: *****
StgInt Signed version of StgWord
StgAddr Generic address type
-
+ * WARNING: Keep this file and HsFFI.h in synch!
*
* ---------------------------------------------------------------------------*/
/*
* First, platform-dependent definitions of size-specific integers.
* Assume for now that the int type is 32 bits.
+ * NOTE: Synch the following definitions with MachDeps.h!
* ToDo: move these into a platform-dependent file.
*/
typedef signed char StgInt8;
-typedef unsigned char StgNat8;
+typedef unsigned char StgWord8;
typedef signed short StgInt16;
-typedef unsigned short StgNat16;
+typedef unsigned short StgWord16;
#if SIZEOF_UNSIGNED_INT == 4
typedef signed int StgInt32;
-typedef unsigned int StgNat32;
+typedef unsigned int StgWord32;
#else
-#error GHC untested on this architecture: sizeof(unisgned int) != 4
+#error GHC untested on this architecture: sizeof(unsigned int) != 4
#endif
/* This #define controls whether we need to support long longs on a particular
#ifdef SUPPORT_LONG_LONGS
/* assume long long is 64 bits */
-typedef unsigned long long int StgNat64;
+typedef unsigned long long int StgWord64;
typedef signed long long int StgInt64;
#elif SIZEOF_LONG == 8
typedef signed long StgInt64;
-typedef unsigned long StgNat64;
+typedef unsigned long StgWord64;
#else
#error GHC untested on this architecture: sizeof(void *) < 8 and no long longs.
#endif
#if SIZEOF_VOID_P == 8
typedef StgInt64 StgInt;
-typedef StgNat64 StgWord;
+typedef StgWord64 StgWord;
#else
#if SIZEOF_VOID_P == 4
typedef StgInt32 StgInt;
-typedef StgNat32 StgWord;
+typedef StgWord32 StgWord;
#else
#error GHC untested on this architecture: sizeof(void *) != 4 or 8
#endif
* Other commonly-used STG datatypes.
*/
-typedef StgNat8 StgChar;
-
+typedef StgWord8 StgChar;
+typedef int StgBool;
/*
* If a double fits in an StgWord, don't bother using floats.
*/
typedef struct StgTSO_* StgTSOPtr;
-typedef StgWord StgStablePtr;
-typedef void * StgForeignPtr;
+typedef void* StgForeignPtr;
typedef StgInt StgStackOffset; /* offset in words! */
typedef StgWord* StgStackPtr;
-typedef StgNat8 StgCode; /* close enough */
+typedef StgWord8 StgCode; /* close enough */
typedef StgCode* StgCodePtr;
typedef StgPtr* StgArray; /* the goods of an Array# */
typedef char* StgByteArray; /* the goods of a ByteArray# */
typedef StgInt64 LI_;
-typedef StgNat64 LW_;
+typedef StgWord64 LW_;
+
+/* Stable Pointers: A stable pointer is represented as an index into
+ * the stable pointer table in the low 24 bits with a weight in the
+ * upper 8 bits.
+ * SUP: StgStablePtr used to be a synonym for StgWord, but stable pointers
+ * are guaranteed to be void* on the C-side, so we have to do some occasional
+ * casting. Size is not a matter, because StgWord is always the same size as
+ * a void*.
+ */
+typedef void* StgStablePtr;
+
+#define STABLEPTR_WEIGHT_MASK ((StgWord)0xff << ((sizeof(StgWord)-1) * BITS_PER_BYTE))
+#define STABLEPTR_WEIGHT_SHIFT (BITS_IN(StgWord) - 8)
/*
Types for the generated C functions
typedef union {
StgWord w;
StgAddr a;
- StgChar c;
+ StgWord c;
StgFloat f;
StgInt i;
StgPtr p;
#define stgCast(ty,e) ((ty)(e))
-#endif STGTYPES_H
-
+#endif /* STGTYPES_H */