[project @ 1996-05-17 16:02:43 by partain]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Unique.lhs
index d3ee26e..7e7b719 100644 (file)
@@ -21,7 +21,7 @@ Haskell).
 --<mkdependHS:friends> UniqSupply
 
 module Unique (
-       Unique, Uniquable(..),
+       Unique,
        u2i,                            -- hack: used in UniqFM
 
        pprUnique, pprUnique10, showUnique,
@@ -29,6 +29,9 @@ module Unique (
        mkUnique,                       -- Used in UniqSupply
        mkUniqueGrimily,                -- Used in UniqSupply only!
 
+       incrUnique,                     -- Used for renumbering
+       initRenumberingUniques,
+
        -- now all the built-in Uniques (and functions to make them)
        -- [the Oh-So-Wonderful Haskell module system wins again...]
        mkAlphaTyVarUnique,
@@ -36,6 +39,9 @@ module Unique (
        mkTupleDataConUnique,
        mkTupleTyConUnique,
 
+       getBuiltinUniques, mkBuiltinUnique,
+       mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
+
        absentErrorIdKey,       -- alphabetical...
        addrDataConKey,
        addrPrimTyConKey,
@@ -43,17 +49,19 @@ module Unique (
        appendIdKey,
        arrayPrimTyConKey,
        augmentIdKey,
-       binaryClassKey,
        boolTyConKey,
+       boundedClassKey,
        buildDataConKey,
        buildIdKey,
        byteArrayPrimTyConKey,
        cCallableClassKey,
        cReturnableClassKey,
+       voidTyConKey,
        charDataConKey,
        charPrimTyConKey,
        charTyConKey,
        consDataConKey,
+       evalClassKey,
        doubleDataConKey,
        doublePrimTyConKey,
        doubleTyConKey,
@@ -99,11 +107,13 @@ module Unique (
        ltDataConKey,
        mainIdKey,
        mainPrimIOIdKey,
-       mallocPtrDataConKey,
-       mallocPtrPrimTyConKey,
-       mallocPtrTyConKey,
+       foreignObjDataConKey,
+       foreignObjPrimTyConKey,
+       foreignObjTyConKey,
        monadClassKey,
        monadZeroClassKey,
+       monadPlusClassKey,
+       functorClassKey,
        mutableArrayPrimTyConKey,
        mutableByteArrayPrimTyConKey,
        nilDataConKey,
@@ -114,6 +124,12 @@ module Unique (
        parErrorIdKey,
        parIdKey,
        patErrorIdKey,
+       recConErrorIdKey,
+       recUpdErrorIdKey,
+       irrefutPatErrorIdKey,
+       nonExhaustiveGuardsErrorIdKey,
+       noDefaultMethodErrorIdKey,
+       nonExplicitMethodErrorIdKey,
        primIoTyConKey,
        ratioDataConKey,
        ratioTyConKey,
@@ -149,8 +165,8 @@ module Unique (
        stateAndFloatPrimTyConKey,
        stateAndIntPrimDataConKey,
        stateAndIntPrimTyConKey,
-       stateAndMallocPtrPrimDataConKey,
-       stateAndMallocPtrPrimTyConKey,
+       stateAndForeignObjPrimDataConKey,
+       stateAndForeignObjPrimTyConKey,
        stateAndMutableArrayPrimDataConKey,
        stateAndMutableArrayPrimTyConKey,
        stateAndMutableByteArrayPrimDataConKey,
@@ -179,13 +195,14 @@ module Unique (
        wordDataConKey,
        wordPrimTyConKey,
        wordTyConKey
-#ifdef GRAN
        , copyableIdKey
        , noFollowIdKey
+       , parAtAbsIdKey
+       , parAtForNowIdKey
+       , parAtIdKey
+       , parAtRelIdKey
        , parGlobalIdKey
        , parLocalIdKey
-#endif
-       -- to make interface self-sufficient
     ) where
 
 import PreludeGlaST
@@ -216,25 +233,19 @@ Now come the functions which construct uniques from their pieces, and vice versa
 The stuff about unique *supplies* is handled further down this module.
 
 \begin{code}
-mkUnique                :: Char -> Int -> Unique       -- Builds a unique from pieces
-unpkUnique              :: Unique -> (Char, Int)       -- The reverse
-
-mkUnifiableTyVarUnique  :: Int -> Unique       -- Injects a subst-array index into the Unique type
-unpkUnifiableTyVarUnique :: Unique -> Int      -- The reverse process
+mkUnique       :: Char -> Int -> Unique        -- Builds a unique from pieces
+unpkUnique     :: Unique -> (Char, Int)        -- The reverse
 
 mkUniqueGrimily :: Int# -> Unique              -- A trap-door for UniqSupply
+
+incrUnique     :: Unique -> Unique
 \end{code}
 
 
 \begin{code}
 mkUniqueGrimily x = MkUnique x
 
-mkUnifiableTyVarUnique i = mkUnique '_'{-MAGIC CHAR-} i
-
-unpkUnifiableTyVarUnique uniq
-  = case (unpkUnique uniq) of { (tag, i) ->
-    ASSERT(tag == '_'{-MAGIC CHAR-})
-    i }
+incrUnique (MkUnique i) = MkUnique (i +# 1#)
 
 -- pop the Char in the top 8 bits of the Unique(Supply)
 
@@ -244,13 +255,13 @@ w2i x = word2Int# x
 i2w x = int2Word# x
 i2w_s x = (x::Int#)
 
-mkUnique (MkChar c#) (MkInt i#)
-  = MkUnique (w2i (((i2w (ord# c#)) `shiftL#` (i2w_s 24#)) `or#` (i2w i#)))
+mkUnique (C# c) (I# i)
+  = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
 
 unpkUnique (MkUnique u)
   = let
-       tag = MkChar (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
-       i   = MkInt  (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
+       tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
+       i   = I#  (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
     in
     (tag, i)
   where
@@ -290,9 +301,6 @@ instance Ord3 Unique where
     cmp = cmpUnique
 
 -----------------
-class Uniquable a where
-    uniqueOf :: a -> Unique
-
 instance Uniquable Unique where
     uniqueOf u = u
 \end{code}
@@ -370,9 +378,10 @@ chars62
 %************************************************************************
 
 Allocation of unique supply characters:
-       a-z: lower case chars for unique supplies (see Main.lhs)
-       B:   builtin            (see UniqSupply.lhs)
-       C-E: pseudo uniques     (see UniqSupply.lhs)
+       v,t,u : for renumbering value-, type- and usage- vars.
+       other a-z: lower case chars for unique supplies (see Main.lhs)
+       B:   builtin
+       C-E: pseudo uniques     (used in native-code generator)
        _:   unifiable tyvars   (above)
        1-8: prelude things below
 
@@ -388,6 +397,19 @@ mkTupleDataConUnique a             = mkUnique '6' a        -- ditto (*may* be used in C labels)
 
 mkPrimOpIdUnique op            = mkUnique '7' op
 mkPreludeMiscIdUnique i                = mkUnique '8' i
+
+initRenumberingUniques = (mkUnique 'v' 1, mkUnique 't' 1, mkUnique 'u' 1)
+
+mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
+ mkBuiltinUnique :: Int -> Unique
+
+mkBuiltinUnique i = mkUnique 'B' i
+mkPseudoUnique1 i = mkUnique 'C' i -- used for uniqueOf on Regs
+mkPseudoUnique2 i = mkUnique 'D' i -- ditto
+mkPseudoUnique3 i = mkUnique 'E' i -- ditto
+
+getBuiltinUniques :: Int -> [Unique]
+getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
 \end{code}
 
 %************************************************************************
@@ -397,24 +419,29 @@ mkPreludeMiscIdUnique i           = mkUnique '8' i
 %************************************************************************
 
 \begin{code}
-eqClassKey             = mkPreludeClassUnique 1
-ordClassKey            = mkPreludeClassUnique 2
-numClassKey            = mkPreludeClassUnique 3
-integralClassKey       = mkPreludeClassUnique 4
-fractionalClassKey     = mkPreludeClassUnique 5
-floatingClassKey       = mkPreludeClassUnique 6
-realClassKey           = mkPreludeClassUnique 7
-realFracClassKey       = mkPreludeClassUnique 8
-realFloatClassKey      = mkPreludeClassUnique 9
-ixClassKey             = mkPreludeClassUnique 10
-enumClassKey           = mkPreludeClassUnique 11
-showClassKey           = mkPreludeClassUnique 12
-readClassKey           = mkPreludeClassUnique 13
-monadClassKey          = mkPreludeClassUnique 14
-monadZeroClassKey      = mkPreludeClassUnique 15
-binaryClassKey         = mkPreludeClassUnique 16
-cCallableClassKey      = mkPreludeClassUnique 17       
-cReturnableClassKey    = mkPreludeClassUnique 18
+boundedClassKey                = mkPreludeClassUnique 1 
+enumClassKey           = mkPreludeClassUnique 2 
+eqClassKey             = mkPreludeClassUnique 3 
+evalClassKey           = mkPreludeClassUnique 4 
+floatingClassKey       = mkPreludeClassUnique 5 
+fractionalClassKey     = mkPreludeClassUnique 6 
+integralClassKey       = mkPreludeClassUnique 7 
+monadClassKey          = mkPreludeClassUnique 8 
+monadZeroClassKey      = mkPreludeClassUnique 9 
+monadPlusClassKey      = mkPreludeClassUnique 10
+functorClassKey                = mkPreludeClassUnique 11
+numClassKey            = mkPreludeClassUnique 12
+ordClassKey            = mkPreludeClassUnique 13
+readClassKey           = mkPreludeClassUnique 14
+realClassKey           = mkPreludeClassUnique 15
+realFloatClassKey      = mkPreludeClassUnique 16
+realFracClassKey       = mkPreludeClassUnique 17
+showClassKey           = mkPreludeClassUnique 18
+                                              
+cCallableClassKey      = mkPreludeClassUnique 19
+cReturnableClassKey    = mkPreludeClassUnique 20
+
+ixClassKey             = mkPreludeClassUnique 21
 \end{code}
 
 %************************************************************************
@@ -442,8 +469,8 @@ intTyConKey                         = mkPreludeTyConUnique 16
 integerTyConKey                                = mkPreludeTyConUnique 17
 liftTyConKey                           = mkPreludeTyConUnique 18
 listTyConKey                           = mkPreludeTyConUnique 19
-mallocPtrPrimTyConKey                  = mkPreludeTyConUnique 20
-mallocPtrTyConKey                      = mkPreludeTyConUnique 21
+foreignObjPrimTyConKey                 = mkPreludeTyConUnique 20
+foreignObjTyConKey                     = mkPreludeTyConUnique 21
 mutableArrayPrimTyConKey               = mkPreludeTyConUnique 22
 mutableByteArrayPrimTyConKey           = mkPreludeTyConUnique 23
 orderingTyConKey                       = mkPreludeTyConUnique 24
@@ -462,7 +489,7 @@ stateAndCharPrimTyConKey            = mkPreludeTyConUnique 36
 stateAndDoublePrimTyConKey             = mkPreludeTyConUnique 37
 stateAndFloatPrimTyConKey              = mkPreludeTyConUnique 38
 stateAndIntPrimTyConKey                        = mkPreludeTyConUnique 39
-stateAndMallocPtrPrimTyConKey          = mkPreludeTyConUnique 40
+stateAndForeignObjPrimTyConKey         = mkPreludeTyConUnique 40
 stateAndMutableArrayPrimTyConKey       = mkPreludeTyConUnique 41
 stateAndMutableByteArrayPrimTyConKey   = mkPreludeTyConUnique 42
 stateAndSynchVarPrimTyConKey           = mkPreludeTyConUnique 43
@@ -477,6 +504,7 @@ primIoTyConKey                              = mkPreludeTyConUnique 51
 voidPrimTyConKey                       = mkPreludeTyConUnique 52
 wordPrimTyConKey                       = mkPreludeTyConUnique 53
 wordTyConKey                           = mkPreludeTyConUnique 54
+voidTyConKey                           = mkPreludeTyConUnique 55
 \end{code}
 
 %************************************************************************
@@ -499,7 +527,7 @@ intDataConKey                               = mkPreludeDataConUnique 11
 integerDataConKey                      = mkPreludeDataConUnique 12
 liftDataConKey                         = mkPreludeDataConUnique 13
 ltDataConKey                           = mkPreludeDataConUnique 14
-mallocPtrDataConKey                    = mkPreludeDataConUnique 15
+foreignObjDataConKey                   = mkPreludeDataConUnique 15
 nilDataConKey                          = mkPreludeDataConUnique 18
 ratioDataConKey                                = mkPreludeDataConUnique 21
 return2GMPsDataConKey                  = mkPreludeDataConUnique 22
@@ -512,7 +540,7 @@ stateAndCharPrimDataConKey          = mkPreludeDataConUnique 28
 stateAndDoublePrimDataConKey           = mkPreludeDataConUnique 29
 stateAndFloatPrimDataConKey            = mkPreludeDataConUnique 30
 stateAndIntPrimDataConKey              = mkPreludeDataConUnique 31
-stateAndMallocPtrPrimDataConKey                = mkPreludeDataConUnique 32
+stateAndForeignObjPrimDataConKey               = mkPreludeDataConUnique 32
 stateAndMutableArrayPrimDataConKey     = mkPreludeDataConUnique 33
 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
 stateAndSynchVarPrimDataConKey         = mkPreludeDataConUnique 35
@@ -531,58 +559,62 @@ wordDataConKey                            = mkPreludeDataConUnique 41
 %************************************************************************
 
 \begin{code}
-absentErrorIdKey       = mkPreludeMiscIdUnique  1
-appendIdKey            = mkPreludeMiscIdUnique  2
-augmentIdKey           = mkPreludeMiscIdUnique  3
-buildIdKey             = mkPreludeMiscIdUnique  4
-errorIdKey             = mkPreludeMiscIdUnique  5
-foldlIdKey             = mkPreludeMiscIdUnique  6
-foldrIdKey             = mkPreludeMiscIdUnique  7
-forkIdKey              = mkPreludeMiscIdUnique  8
-int2IntegerIdKey       = mkPreludeMiscIdUnique  9
-integerMinusOneIdKey   = mkPreludeMiscIdUnique 10
-integerPlusOneIdKey    = mkPreludeMiscIdUnique 11
-integerPlusTwoIdKey    = mkPreludeMiscIdUnique 12
-integerZeroIdKey       = mkPreludeMiscIdUnique 13
-packCStringIdKey       = mkPreludeMiscIdUnique 14
-parErrorIdKey          = mkPreludeMiscIdUnique 15
-parIdKey               = mkPreludeMiscIdUnique 16
-patErrorIdKey          = mkPreludeMiscIdUnique 17
-realWorldPrimIdKey     = mkPreludeMiscIdUnique 18
-runSTIdKey             = mkPreludeMiscIdUnique 19
-seqIdKey               = mkPreludeMiscIdUnique 20
-traceIdKey             = mkPreludeMiscIdUnique 21
-unpackCString2IdKey    = mkPreludeMiscIdUnique 22
-unpackCStringAppendIdKey= mkPreludeMiscIdUnique        23
-unpackCStringFoldrIdKey        = mkPreludeMiscIdUnique 24
-unpackCStringIdKey     = mkPreludeMiscIdUnique 25
-voidPrimIdKey          = mkPreludeMiscIdUnique 26
-mainIdKey              = mkPreludeMiscIdUnique 27
-mainPrimIOIdKey                = mkPreludeMiscIdUnique 28
-
-#ifdef GRAN
-parLocalIdKey          = mkPreludeMiscIdUnique 29
-parGlobalIdKey         = mkPreludeMiscIdUnique 30
-noFollowIdKey          = mkPreludeMiscIdUnique 31
-copyableIdKey          = mkPreludeMiscIdUnique 32
-#endif
+absentErrorIdKey             = mkPreludeMiscIdUnique  1
+appendIdKey                  = mkPreludeMiscIdUnique  2
+augmentIdKey                 = mkPreludeMiscIdUnique  3
+buildIdKey                   = mkPreludeMiscIdUnique  4
+errorIdKey                   = mkPreludeMiscIdUnique  5
+foldlIdKey                   = mkPreludeMiscIdUnique  6
+foldrIdKey                   = mkPreludeMiscIdUnique  7
+forkIdKey                    = mkPreludeMiscIdUnique  8
+int2IntegerIdKey             = mkPreludeMiscIdUnique  9
+integerMinusOneIdKey         = mkPreludeMiscIdUnique 10
+integerPlusOneIdKey          = mkPreludeMiscIdUnique 11
+integerPlusTwoIdKey          = mkPreludeMiscIdUnique 12
+integerZeroIdKey             = mkPreludeMiscIdUnique 13
+packCStringIdKey             = mkPreludeMiscIdUnique 14
+parErrorIdKey                = mkPreludeMiscIdUnique 15
+parIdKey                     = mkPreludeMiscIdUnique 16
+patErrorIdKey                = mkPreludeMiscIdUnique 17
+realWorldPrimIdKey           = mkPreludeMiscIdUnique 18
+runSTIdKey                   = mkPreludeMiscIdUnique 19
+seqIdKey                     = mkPreludeMiscIdUnique 20
+traceIdKey                   = mkPreludeMiscIdUnique 21
+unpackCString2IdKey          = mkPreludeMiscIdUnique 22
+unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 23
+unpackCStringFoldrIdKey              = mkPreludeMiscIdUnique 24
+unpackCStringIdKey           = mkPreludeMiscIdUnique 25
+voidPrimIdKey                = mkPreludeMiscIdUnique 26
+mainIdKey                    = mkPreludeMiscIdUnique 27
+mainPrimIOIdKey                      = mkPreludeMiscIdUnique 28
+recConErrorIdKey             = mkPreludeMiscIdUnique 29
+recUpdErrorIdKey             = mkPreludeMiscIdUnique 30
+irrefutPatErrorIdKey         = mkPreludeMiscIdUnique 31
+nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 32
+noDefaultMethodErrorIdKey     = mkPreludeMiscIdUnique 33
+nonExplicitMethodErrorIdKey   = mkPreludeMiscIdUnique 34
+
+copyableIdKey          = mkPreludeMiscIdUnique 35
+noFollowIdKey          = mkPreludeMiscIdUnique 36
+parAtAbsIdKey          = mkPreludeMiscIdUnique 37
+parAtForNowIdKey       = mkPreludeMiscIdUnique 38
+parAtIdKey             = mkPreludeMiscIdUnique 39
+parAtRelIdKey          = mkPreludeMiscIdUnique 40
+parGlobalIdKey         = mkPreludeMiscIdUnique 41
+parLocalIdKey          = mkPreludeMiscIdUnique 42
 \end{code}
 
 Certain class operations from Prelude classes.  They get
 their own uniques so we can look them up easily when we want
 to conjure them up during type checking.        
 \begin{code}                                     
-fromIntClassOpKey      = mkPreludeMiscIdUnique 33
-fromIntegerClassOpKey  = mkPreludeMiscIdUnique 34
-fromRationalClassOpKey = mkPreludeMiscIdUnique 35
-enumFromClassOpKey     = mkPreludeMiscIdUnique 36
-enumFromThenClassOpKey = mkPreludeMiscIdUnique 37
-enumFromToClassOpKey   = mkPreludeMiscIdUnique 38
-enumFromThenToClassOpKey= mkPreludeMiscIdUnique 39
-eqClassOpKey           = mkPreludeMiscIdUnique 40
-geClassOpKey           = mkPreludeMiscIdUnique 41
+fromIntClassOpKey      = mkPreludeMiscIdUnique 37
+fromIntegerClassOpKey  = mkPreludeMiscIdUnique 38
+fromRationalClassOpKey = mkPreludeMiscIdUnique 39
+enumFromClassOpKey     = mkPreludeMiscIdUnique 40
+enumFromThenClassOpKey = mkPreludeMiscIdUnique 41
+enumFromToClassOpKey   = mkPreludeMiscIdUnique 42
+enumFromThenToClassOpKey= mkPreludeMiscIdUnique 43
+eqClassOpKey           = mkPreludeMiscIdUnique 44
+geClassOpKey           = mkPreludeMiscIdUnique 45
 \end{code}
-
-
-
-