[project @ 1996-05-01 18:36:59 by partain]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Unique.lhs
index b77ed34..54c7898 100644 (file)
@@ -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,
@@ -45,6 +51,7 @@ module Unique (
        augmentIdKey,
        binaryClassKey,
        boolTyConKey,
+       boundedClassKey,
        buildDataConKey,
        buildIdKey,
        byteArrayPrimTyConKey,
@@ -54,7 +61,7 @@ module Unique (
        charPrimTyConKey,
        charTyConKey,
        consDataConKey,
-       dataClassKey,
+       evalClassKey,
        doubleDataConKey,
        doublePrimTyConKey,
        doubleTyConKey,
@@ -119,6 +126,8 @@ module Unique (
        recUpdErrorIdKey,
        irrefutPatErrorIdKey,
        nonExhaustiveGuardsErrorIdKey,
+       noDefaultMethodErrorIdKey,
+       nonExplicitMethodErrorIdKey,
        primIoTyConKey,
        ratioDataConKey,
        ratioTyConKey,
@@ -221,25 +230,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)
 
@@ -249,13 +252,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
@@ -372,9 +375,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
 
@@ -390,6 +394,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}
 
 %************************************************************************
@@ -417,7 +434,8 @@ monadZeroClassKey   = mkPreludeClassUnique 15
 binaryClassKey         = mkPreludeClassUnique 16
 cCallableClassKey      = mkPreludeClassUnique 17       
 cReturnableClassKey    = mkPreludeClassUnique 18
-dataClassKey           = mkPreludeClassUnique 19
+evalClassKey           = mkPreludeClassUnique 19
+boundedClassKey                = mkPreludeClassUnique 20
 \end{code}
 
 %************************************************************************
@@ -566,12 +584,14 @@ recConErrorIdKey        = mkPreludeMiscIdUnique 29
 recUpdErrorIdKey             = mkPreludeMiscIdUnique 30
 irrefutPatErrorIdKey         = mkPreludeMiscIdUnique 31
 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 32
+noDefaultMethodErrorIdKey     = mkPreludeMiscIdUnique 33
+nonExplicitMethodErrorIdKey   = mkPreludeMiscIdUnique 34
 
 #ifdef GRAN
-parLocalIdKey          = mkPreludeMiscIdUnique 33
-parGlobalIdKey         = mkPreludeMiscIdUnique 34
-noFollowIdKey          = mkPreludeMiscIdUnique 35
-copyableIdKey          = mkPreludeMiscIdUnique 36
+parLocalIdKey          = mkPreludeMiscIdUnique 35
+parGlobalIdKey         = mkPreludeMiscIdUnique 36
+noFollowIdKey          = mkPreludeMiscIdUnique 37
+copyableIdKey          = mkPreludeMiscIdUnique 38
 #endif
 \end{code}
 
@@ -589,7 +609,3 @@ enumFromThenToClassOpKey= mkPreludeMiscIdUnique 43
 eqClassOpKey           = mkPreludeMiscIdUnique 44
 geClassOpKey           = mkPreludeMiscIdUnique 45
 \end{code}
-
-
-
-