[project @ 1999-08-27 11:48:08 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Unique.lhs
index 0f65b85..604a980 100644 (file)
@@ -26,6 +26,7 @@ module Unique (
        getKey,                         -- Used in Var only!
 
        incrUnique,                     -- Used for renumbering
+       deriveUnique,                   -- Ditto
        initTyVarUnique,
        initTidyUniques,
 
@@ -95,16 +96,13 @@ module Unique (
        funTyConKey,
        functorClassKey,
        geClassOpKey,
+       getTagIdKey,
        intDataConKey,
        intPrimTyConKey,
        intTyConKey,
        int8TyConKey,
-       int8DataConKey,
        int16TyConKey,
-       int16DataConKey,
        int32TyConKey,
-       int32DataConKey,
-       int64DataConKey,
        int64PrimTyConKey,
        int64TyConKey,
        smallIntegerDataConKey,
@@ -155,6 +153,7 @@ module Unique (
        recSelErrIdKey,
        recUpdErrorIdKey,
        returnMClassOpKey,
+       runSTRepIdKey,
        showClassKey,
        ioTyConKey,
        ioDataConKey,
@@ -188,12 +187,8 @@ module Unique (
        wordPrimTyConKey,
        wordTyConKey,
        word8TyConKey,
-       word8DataConKey,
        word16TyConKey,
-       word16DataConKey,
        word32TyConKey,
-       word32DataConKey,
-       word64DataConKey,
        word64PrimTyConKey,
        word64TyConKey,
        zipIdKey
@@ -239,6 +234,7 @@ mkUniqueGrimily :: Int# -> Unique           -- A trap-door for UniqSupply
 getKey         :: Unique -> Int#               -- for Var
 
 incrUnique     :: Unique -> Unique
+deriveUnique   :: Unique -> Int -> Unique
 \end{code}
 
 
@@ -250,6 +246,10 @@ getKey (MkUnique x) = x
 
 incrUnique (MkUnique i) = MkUnique (i +# 1#)
 
+-- deriveUnique uses an 'X' tag so that it won't clash with
+-- any of the uniques produced any other way
+deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
+
 -- pop the Char in the top 8 bits of the Unique(Supply)
 
 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
@@ -259,12 +259,15 @@ i2w x = int2Word# x
 i2w_s x = (x::Int#)
 
 mkUnique (C# c) (I# i)
-  = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
+  = MkUnique (w2i (tag `or#` bits))
+  where
+    tag  = i2w (ord# c) `shiftL#` i2w_s 24#
+    bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
 
 unpkUnique (MkUnique u)
   = let
        tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
-       i   = I#  (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
+       i   = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
     in
     (tag, i)
   where
@@ -410,6 +413,7 @@ Allocation of unique supply characters:
        other a-z: lower case chars for unique supplies (see Main.lhs)
        B:   builtin
        C-E: pseudo uniques     (used in native-code generator)
+       X:   uniques derived by deriveUnique
        _:   unifiable tyvars   (above)
        0-9: prelude things below
 
@@ -556,10 +560,6 @@ doubleDataConKey                   = mkPreludeDataConUnique  4
 falseDataConKey                                = mkPreludeDataConUnique  5
 floatDataConKey                                = mkPreludeDataConUnique  6
 intDataConKey                          = mkPreludeDataConUnique  7
-int8DataConKey                         = mkPreludeDataConUnique  8
-int16DataConKey                                = mkPreludeDataConUnique  9
-int32DataConKey                                = mkPreludeDataConUnique 10
-int64DataConKey                                = mkPreludeDataConUnique 11
 smallIntegerDataConKey                 = mkPreludeDataConUnique 12
 largeIntegerDataConKey                 = mkPreludeDataConUnique 13
 foreignObjDataConKey                   = mkPreludeDataConUnique 14
@@ -569,10 +569,6 @@ stablePtrDataConKey                        = mkPreludeDataConUnique 17
 stableNameDataConKey                   = mkPreludeDataConUnique 18
 trueDataConKey                         = mkPreludeDataConUnique 34
 wordDataConKey                         = mkPreludeDataConUnique 35
-word8DataConKey                                = mkPreludeDataConUnique 36
-word16DataConKey                       = mkPreludeDataConUnique 37
-word32DataConKey                       = mkPreludeDataConUnique 38
-word64DataConKey                       = mkPreludeDataConUnique 39
 stDataConKey                           = mkPreludeDataConUnique 40
 ioDataConKey                           = mkPreludeDataConUnique 42
 \end{code}
@@ -622,6 +618,7 @@ zipIdKey                  = mkPreludeMiscIdUnique 35
 bindIOIdKey                  = mkPreludeMiscIdUnique 36
 deRefStablePtrIdKey          = mkPreludeMiscIdUnique 37
 makeStablePtrIdKey           = mkPreludeMiscIdUnique 38
+getTagIdKey                  = mkPreludeMiscIdUnique 39
 \end{code}
 
 Certain class operations from Prelude classes.  They get their own
@@ -654,4 +651,5 @@ mapIdKey                  = mkPreludeMiscIdUnique 120
 
 \begin{code}
 assertIdKey                  = mkPreludeMiscIdUnique 121
+runSTRepIdKey                = mkPreludeMiscIdUnique 122
 \end{code}