2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[Unique]{The @Unique@ data type and a (monadic) supply thereof}
6 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
7 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
8 comparison key in the compiler.
10 If there is any single operation that needs to be fast, it is @Unique@
11 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
14 Some of the other hair in this code is to be able to use a
15 ``splittable @UniqueSupply@'' if requested/possible (not standard
19 #include "HsVersions.h"
23 UniqueSupply, -- abstract types
24 u2i, -- hack: used in UniqFM
25 getUnique, getUniques, -- basic ops
26 eqUnique, cmpUnique, -- comparison is everything!
28 --not exported: mkUnique, unpkUnique,
29 mkUniqueGrimily, -- use in SplitUniq only!
30 mkUniqueSupplyGrimily, -- ditto! (but FALSE: WDP 95/01)
31 mkUnifiableTyVarUnique,
32 unpkUnifiableTyVarUnique,
33 showUnique, pprUnique, pprUnique10,
35 UniqSM(..), -- type: unique supply monad
36 initUs, thenUs, returnUs,
39 -- the pre-defined unique supplies:
41 uniqSupply_r, uniqSupply_t, uniqSupply_d,
42 uniqSupply_s, uniqSupply_c, uniqSupply_T,
48 -- otherwise, not exported
49 uniqSupply_p, uniqSupply_S, uniqSupply_L,
52 -- and the access functions for the `builtin' UniqueSupply
53 getBuiltinUniques, mkBuiltinUnique, runBuiltinUs,
54 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
56 -- now all the built-in Uniques (and functions to make them)
57 -- [the Oh-So-Wonderful Haskell module system wins again...]
62 runSTIdKey, realWorldPrimIdKey,
64 byteArrayPrimTyConKey, --UNUSED: byteArrayDataConKey, byteArrayTyConKey,
66 boolTyConKey, buildDataConKey, buildIdKey, charDataConKey,
67 charPrimTyConKey, charTyConKey, cmpTagTyConKey,
73 enumClassKey, eqClassKey,
74 eqTagDataConKey, errorIdKey,
75 falseDataConKey, floatDataConKey,
76 floatPrimTyConKey, floatTyConKey, floatingClassKey,
77 foldlIdKey, foldrIdKey,
80 gtTagDataConKey, --UNUSED: iOErrorTyConKey,
81 --UNUSED: iOIntPrimTyConKey, -- UNUSED: int2IntegerIdKey,
84 wordPrimTyConKey, wordTyConKey, wordDataConKey,
85 addrPrimTyConKey, addrTyConKey, addrDataConKey,
86 intPrimTyConKey, intTyConKey,
87 integerDataConKey, integerTyConKey, integralClassKey,
90 liftDataConKey, liftTyConKey, listTyConKey,
92 mutableArrayPrimTyConKey, -- UNUSED: mutableArrayDataConKey, mutableArrayTyConKey,
93 mutableByteArrayPrimTyConKey, -- UNUSED: mutableByteArrayDataConKey,
94 --UNUSED: mutableByteArrayTyConKey,
96 nilDataConKey, numClassKey, ordClassKey,
97 parIdKey, parErrorIdKey,
99 parGlobalIdKey, parLocalIdKey, copyableIdKey, noFollowIdKey,
102 ratioDataConKey, ratioTyConKey,
104 --UNUSED: readParenIdKey,
105 realClassKey, realFloatClassKey,
107 --UNUSED: requestTyConKey, responseTyConKey,
108 return2GMPsDataConKey, return2GMPsTyConKey,
109 returnIntAndGMPDataConKey, returnIntAndGMPTyConKey,
110 seqIdKey, -- UNUSED: seqIntPrimTyConKey,
111 --UNUSED: seqTyConKey,
112 --UNUSED: showParenIdKey,
113 --UNUSED: showSpaceIdKey,
114 statePrimTyConKey, stateTyConKey, stateDataConKey,
117 stablePtrPrimTyConKey, stablePtrTyConKey, stablePtrDataConKey,
118 mallocPtrPrimTyConKey, mallocPtrTyConKey, mallocPtrDataConKey,
119 stateAndPtrPrimTyConKey,
120 stateAndPtrPrimDataConKey,
121 stateAndCharPrimTyConKey,
122 stateAndCharPrimDataConKey,
123 stateAndIntPrimTyConKey,
124 stateAndIntPrimDataConKey,
125 stateAndWordPrimTyConKey,
126 stateAndWordPrimDataConKey,
127 stateAndAddrPrimTyConKey,
128 stateAndAddrPrimDataConKey,
129 stateAndStablePtrPrimTyConKey,
130 stateAndStablePtrPrimDataConKey,
131 stateAndMallocPtrPrimTyConKey,
132 stateAndMallocPtrPrimDataConKey,
133 stateAndFloatPrimTyConKey,
134 stateAndFloatPrimDataConKey,
135 stateAndDoublePrimTyConKey,
136 stateAndDoublePrimDataConKey,
137 stateAndArrayPrimTyConKey,
138 stateAndArrayPrimDataConKey,
139 stateAndMutableArrayPrimTyConKey,
140 stateAndMutableArrayPrimDataConKey,
141 stateAndByteArrayPrimTyConKey,
142 stateAndByteArrayPrimDataConKey,
143 stateAndMutableByteArrayPrimTyConKey,
144 stateAndMutableByteArrayPrimDataConKey,
145 stateAndSynchVarPrimTyConKey,
146 stateAndSynchVarPrimDataConKey,
148 stTyConKey, primIoTyConKey,
149 --UNUSED: ioResultTyConKey,
153 unpackCStringIdKey, unpackCString2IdKey, unpackCStringAppendIdKey,
155 integerZeroIdKey, integerPlusOneIdKey,
156 integerPlusTwoIdKey, integerMinusOneIdKey,
160 --UNUSED: packedStringTyConKey, psDataConKey, cpsDataConKey,
162 -- to make interface self-sufficient
163 PrimOp, SplitUniqSupply, CSeq
165 #ifndef __GLASGOW_HASKELL__
170 import Outputable -- class for printing, forcing
172 import PrimOps -- ** DIRECTLY **
176 #ifndef __GLASGOW_HASKELL__
177 {-hide import from mkdependHS-}
181 #ifdef __GLASGOW_HASKELL__
188 %************************************************************************
190 \subsection[Unique-type]{@Unique@ type and operations}
192 %************************************************************************
194 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
195 Fast comparison is everything on @Uniques@:
198 u2i :: Unique -> FAST_INT
200 #ifdef __GLASGOW_HASKELL__
202 data Unique = MkUnique Int#
207 data Unique = MkUnique Word{-#STRICT#-}
208 u2i (MkUnique w) = wordToInt w
213 Now come the functions which construct uniques from their pieces, and vice versa.
214 The stuff about unique *supplies* is handled further down this module.
217 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
218 unpkUnique :: Unique -> (Char, Int) -- The reverse
220 mkUnifiableTyVarUnique :: Int -> Unique -- Injects a subst-array index into the Unique type
221 unpkUnifiableTyVarUnique :: Unique -> Int -- The reverse process
223 #ifdef __GLASGOW_HASKELL__
224 mkUniqueGrimily :: Int# -> Unique -- A trap-door for SplitUniq
226 mkUniqueGrimily :: Int -> Unique
232 #ifdef __GLASGOW_HASKELL__
233 mkUniqueGrimily x = MkUnique x
235 mkUniqueGrimily x = MkUnique (fromInteger (toInteger x))
238 mkUnifiableTyVarUnique i = mkUnique '_'{-MAGIC CHAR-} i
240 unpkUnifiableTyVarUnique uniq
241 = case (unpkUnique uniq) of { (tag, i) ->
242 ASSERT(tag == '_'{-MAGIC CHAR-})
245 -- pop the Char in the top 8 bits of the Unique(Supply)
247 #ifdef __GLASGOW_HASKELL__
249 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
255 mkUnique (MkChar c#) (MkInt i#)
256 = MkUnique (w2i (((i2w (ord# c#)) `shiftL#` (i2w_s 24#)) `or#` (i2w i#)))
258 unpkUnique (MkUnique u)
260 tag = MkChar (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
261 i = MkInt (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
264 # if __GLASGOW_HASKELL__ >= 23
266 shiftr x y = shiftRA# x y
268 shiftr x y = shiftR# x y
271 #else {-probably HBC-}
274 = MkUnique (((fromInt (ord c)) `bitLsh` 24) `bitOr` (fromInt i))
276 unpkUnique (MkUnique u)
278 tag = chr (wordToInt (u `bitRsh` 24))
279 i = wordToInt (u `bitAnd` 16777215 {-0x00ffffff-})
283 #endif {-probably HBC-}
286 %************************************************************************
288 \subsection[Unique-instances]{Instance declarations for @Unique@}
290 %************************************************************************
292 And the whole point (besides uniqueness) is fast equality. We don't
293 use `deriving' because we want {\em precise} control of ordering
294 (equality on @Uniques@ is v common).
297 #ifdef __GLASGOW_HASKELL__
299 {-# INLINE eqUnique #-} -- this is Hammered City here...
300 {-# INLINE cmpUnique #-}
302 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
303 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
304 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
306 cmpUnique (MkUnique u1) (MkUnique u2)
307 = if u1 ==# u2 then EQ_ else if u1 <# u2 then LT_ else GT_
310 eqUnique (MkUnique u1) (MkUnique u2) = u1 == u2
311 ltUnique (MkUnique u1) (MkUnique u2) = u1 < u2
312 leUnique (MkUnique u1) (MkUnique u2) = u1 <= u2
314 cmpUnique (MkUnique u1) (MkUnique u2)
315 = if u1 == u2 then EQ_ else if u1 < u2 then LT_ else GT_
318 instance Eq Unique where
319 a == b = eqUnique a b
320 a /= b = not (eqUnique a b)
322 instance Ord Unique where
324 a <= b = leUnique a b
325 a > b = not (leUnique a b)
326 a >= b = not (ltUnique a b)
327 #ifdef __GLASGOW_HASKELL__
328 _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
335 instance Outputable Unique where
337 = case unpkUnique uniq of
338 (tag, u) -> ppStr (tag : iToBase62 u)
342 We do sometimes make strings with @Uniques@ in them:
344 pprUnique, pprUnique10 :: Unique -> Pretty
347 = case unpkUnique uniq of
348 (tag, u) -> ppBeside (ppChar tag) (iToBase62 u)
350 pprUnique10 uniq -- in base-10, dudes
351 = case unpkUnique uniq of
352 (tag, u) -> ppBeside (ppChar tag) (ppInt u)
354 showUnique :: Unique -> FAST_STRING
355 showUnique uniq = _PK_ (ppShow 80 (pprUnique uniq))
357 instance Text Unique where
358 showsPrec p uniq rest = _UNPK_ (showUnique uniq)
359 readsPrec p = panic "no readsPrec for Unique"
362 %************************************************************************
364 \subsection[Utils-base62]{Base-62 numbers}
366 %************************************************************************
368 A character-stingy way to read/write numbers (notably Uniques).
369 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
370 Code stolen from Lennart.
372 iToBase62 :: Int -> Pretty
374 #ifdef __GLASGOW_HASKELL__
378 bytes = case chars62 of { _ByteArray bounds_who_needs_'em bytes -> bytes }
381 case (indexCharArray# bytes n#) of { c ->
384 case (quotRem n 62) of { (q, I# r#) ->
385 case (indexCharArray# bytes r#) of { c ->
386 ppBeside (iToBase62 q) (ppChar (C# c)) }}
388 -- keep this at top level! (bug on 94/10/24 WDP)
389 chars62 :: _ByteArray Int
392 newCharArray (0, 61) `thenStrictlyST` \ ch_array ->
393 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
395 unsafeFreezeByteArray ch_array
398 fill_in ch_array i lim str
400 = returnStrictlyST ()
402 = writeCharArray ch_array i (str !! i) `seqStrictlyST`
403 fill_in ch_array (i+1) lim str
411 case (quotRem n 62) of { (q, r) ->
412 ppBeside (iToBase62 q) (ppChar (chars62 ! r)) }
414 -- keep this at top level! (bug on 94/10/24 WDP)
415 chars62 :: Array Int Char
417 = array (0,61) (zipWith (:=) [0..] "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
421 %************************************************************************
423 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
425 %************************************************************************
428 mkPreludeClassUnique i = mkUnique '1' i
429 mkPreludeTyConUnique i = mkUnique '2' i
430 mkPreludeDataConUnique i = mkUnique 'Y' i -- must be alphabetic
431 mkTupleDataConUnique i = mkUnique 'Z' i -- ditto (*may* be used in C labels)
432 -- mkPrimOpIdUnique op: see below (uses '5')
433 mkPreludeMiscIdUnique i = mkUnique '7' i
436 %************************************************************************
438 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
440 %************************************************************************
443 eqClassKey = mkPreludeClassUnique 1
444 ordClassKey = mkPreludeClassUnique 2
445 numClassKey = mkPreludeClassUnique 3
446 integralClassKey = mkPreludeClassUnique 4
447 fractionalClassKey = mkPreludeClassUnique 5
448 floatingClassKey = mkPreludeClassUnique 6
449 realClassKey = mkPreludeClassUnique 7
450 realFracClassKey = mkPreludeClassUnique 8
451 realFloatClassKey = mkPreludeClassUnique 9
452 ixClassKey = mkPreludeClassUnique 10
453 enumClassKey = mkPreludeClassUnique 11
454 textClassKey = mkPreludeClassUnique 12
455 binaryClassKey = mkPreludeClassUnique 13
456 cCallableClassKey = mkPreludeClassUnique 14
457 cReturnableClassKey = mkPreludeClassUnique 15
459 pidClassKey = mkPreludeClassUnique 16
460 processorClassKey = mkPreludeClassUnique 17
461 #endif {- Data Parallel Haskell -}
464 %************************************************************************
466 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
468 %************************************************************************
471 addrPrimTyConKey = mkPreludeTyConUnique 1
472 addrTyConKey = mkPreludeTyConUnique 2
473 arrayPrimTyConKey = mkPreludeTyConUnique 3
474 boolTyConKey = mkPreludeTyConUnique 4
475 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
476 --UNUSED:byteArrayTyConKey = mkPreludeTyConUnique 6
477 charPrimTyConKey = mkPreludeTyConUnique 7
478 charTyConKey = mkPreludeTyConUnique 8
479 cmpTagTyConKey = mkPreludeTyConUnique 9
480 dialogueTyConKey = mkPreludeTyConUnique 10
481 doublePrimTyConKey = mkPreludeTyConUnique 11
482 doubleTyConKey = mkPreludeTyConUnique 12
483 floatPrimTyConKey = mkPreludeTyConUnique 13
484 floatTyConKey = mkPreludeTyConUnique 14
485 --UNUSED:iOErrorTyConKey = mkPreludeTyConUnique 14
486 --UNUSED:iOIntPrimTyConKey = mkPreludeTyConUnique 15
487 iOTyConKey = mkPreludeTyConUnique 16
488 intPrimTyConKey = mkPreludeTyConUnique 17
489 intTyConKey = mkPreludeTyConUnique 18
490 integerTyConKey = mkPreludeTyConUnique 19
491 liftTyConKey = mkPreludeTyConUnique 20
492 listTyConKey = mkPreludeTyConUnique 21
493 mallocPtrPrimTyConKey = mkPreludeTyConUnique 22
494 mallocPtrTyConKey = mkPreludeTyConUnique 23
495 mutableArrayPrimTyConKey = mkPreludeTyConUnique 24
496 --UNUSED:mutableArrayTyConKey = mkPreludeTyConUnique 25
497 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 26
498 --UNUSED:mutableByteArrayTyConKey = mkPreludeTyConUnique 27
499 --UNUSED:packedStringTyConKey = mkPreludeTyConUnique 28
500 synchVarPrimTyConKey = mkPreludeTyConUnique 29
501 ratioTyConKey = mkPreludeTyConUnique 30
502 rationalTyConKey = mkPreludeTyConUnique 31
503 realWorldTyConKey = mkPreludeTyConUnique 32
504 --UNUSED:requestTyConKey = mkPreludeTyConUnique 33
505 --UNUSED:responseTyConKey = mkPreludeTyConUnique 34
506 return2GMPsTyConKey = mkPreludeTyConUnique 35
507 returnIntAndGMPTyConKey = mkPreludeTyConUnique 36
508 --UNUSED:seqIntPrimTyConKey = mkPreludeTyConUnique 37
509 --UNUSED:seqTyConKey = mkPreludeTyConUnique 38
510 stablePtrPrimTyConKey = mkPreludeTyConUnique 39
511 stablePtrTyConKey = mkPreludeTyConUnique 40
512 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 41
513 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 42
514 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 43
515 stateAndCharPrimTyConKey = mkPreludeTyConUnique 44
516 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 45
517 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 46
518 stateAndIntPrimTyConKey = mkPreludeTyConUnique 47
519 stateAndMallocPtrPrimTyConKey = mkPreludeTyConUnique 48
520 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 49
521 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 50
522 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 51
523 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 52
524 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 53
525 stateAndWordPrimTyConKey = mkPreludeTyConUnique 54
526 statePrimTyConKey = mkPreludeTyConUnique 55
527 stateTyConKey = mkPreludeTyConUnique 56
528 stringTyConKey = mkPreludeTyConUnique 57
529 stTyConKey = mkPreludeTyConUnique 58
530 primIoTyConKey = mkPreludeTyConUnique 59
531 --UNUSED:ioResultTyConKey = mkPreludeTyConUnique 60
532 voidPrimTyConKey = mkPreludeTyConUnique 61
533 wordPrimTyConKey = mkPreludeTyConUnique 62
534 wordTyConKey = mkPreludeTyConUnique 63
537 podTyConKey = mkPreludeTyConUnique 64
538 interfacePodTyConKey = mkPreludeTyConUnique 65
540 podizedPodTyConKey _ = panic "ToDo:DPH:podizedPodTyConKey"
541 #endif {- Data Parallel Haskell -}
544 %************************************************************************
546 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
548 %************************************************************************
551 addrDataConKey = mkPreludeDataConUnique 1
552 buildDataConKey = mkPreludeDataConUnique 2
553 --UNUSED:byteArrayDataConKey = mkPreludeDataConUnique 3
554 charDataConKey = mkPreludeDataConUnique 4
555 consDataConKey = mkPreludeDataConUnique 5
556 doubleDataConKey = mkPreludeDataConUnique 6
557 eqTagDataConKey = mkPreludeDataConUnique 7
558 falseDataConKey = mkPreludeDataConUnique 8
559 floatDataConKey = mkPreludeDataConUnique 9
560 gtTagDataConKey = mkPreludeDataConUnique 10
561 intDataConKey = mkPreludeDataConUnique 11
562 integerDataConKey = mkPreludeDataConUnique 12
563 liftDataConKey = mkPreludeDataConUnique 13
564 ltTagDataConKey = mkPreludeDataConUnique 14
565 mallocPtrDataConKey = mkPreludeDataConUnique 15
566 --UNUSED:mutableArrayDataConKey = mkPreludeDataConUnique 16
567 --UNUSED:mutableByteArrayDataConKey = mkPreludeDataConUnique 17
568 nilDataConKey = mkPreludeDataConUnique 18
569 --UNUSED:psDataConKey = mkPreludeDataConUnique 19
570 --UNUSED:cpsDataConKey = mkPreludeDataConUnique 20
571 ratioDataConKey = mkPreludeDataConUnique 21
572 return2GMPsDataConKey = mkPreludeDataConUnique 22
573 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
574 stablePtrDataConKey = mkPreludeDataConUnique 24
575 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
576 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
577 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
578 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
579 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
580 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
581 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
582 stateAndMallocPtrPrimDataConKey = mkPreludeDataConUnique 32
583 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
584 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
585 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
586 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
587 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
588 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
589 stateDataConKey = mkPreludeDataConUnique 39
590 trueDataConKey = mkPreludeDataConUnique 40
591 wordDataConKey = mkPreludeDataConUnique 41
594 interfacePodDataConKey = mkPreludeDataConUnique 42
595 #endif {- Data Parallel Haskell -}
598 %************************************************************************
600 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
602 %************************************************************************
604 First, for raw @PrimOps@ and their boxed versions:
606 mkPrimOpIdUnique :: PrimOp -> Unique
608 mkPrimOpIdUnique op = mkUnique '5' IBOX((tagOf_PrimOp op))
611 Now for other non-@DataCon@ @Ids@:
613 absentErrorIdKey = mkPreludeMiscIdUnique 1
614 buildIdKey = mkPreludeMiscIdUnique 2
615 errorIdKey = mkPreludeMiscIdUnique 3
616 foldlIdKey = mkPreludeMiscIdUnique 4
617 foldrIdKey = mkPreludeMiscIdUnique 5
618 forkIdKey = mkPreludeMiscIdUnique 6
619 int2IntegerIdKey = mkPreludeMiscIdUnique 7
620 integerMinusOneIdKey = mkPreludeMiscIdUnique 8
621 integerPlusOneIdKey = mkPreludeMiscIdUnique 9
622 integerZeroIdKey = mkPreludeMiscIdUnique 10
623 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
624 packCStringIdKey = mkPreludeMiscIdUnique 12
625 parIdKey = mkPreludeMiscIdUnique 13
626 parErrorIdKey = mkPreludeMiscIdUnique 14
627 patErrorIdKey = mkPreludeMiscIdUnique 15
628 --UNUSED:readParenIdKey = mkPreludeMiscIdUnique 16
629 realWorldPrimIdKey = mkPreludeMiscIdUnique 17
630 runSTIdKey = mkPreludeMiscIdUnique 18
631 seqIdKey = mkPreludeMiscIdUnique 19
632 --UNUSED:showParenIdKey = mkPreludeMiscIdUnique 20
633 --UNUSED:showSpaceIdKey = mkPreludeMiscIdUnique 21
634 traceIdKey = mkPreludeMiscIdUnique 22
635 unpackCStringIdKey = mkPreludeMiscIdUnique 23
636 unpackCString2IdKey = mkPreludeMiscIdUnique 20 -- NB: NB: NB
637 unpackCStringAppendIdKey= mkPreludeMiscIdUnique 21 -- NB: NB: NB
638 voidPrimIdKey = mkPreludeMiscIdUnique 24
641 parLocalIdKey = mkPreludeMiscIdUnique 25
642 parGlobalIdKey = mkPreludeMiscIdUnique 26
643 noFollowIdKey = mkPreludeMiscIdUnique 27
644 copyableIdKey = mkPreludeMiscIdUnique 28
648 podSelectorIdKey = mkPreludeMiscIdUnique 29
649 #endif {- Data Parallel Haskell -}
652 %************************************************************************
654 \subsection[UniqueSupply-type]{@UniqueSupply@ type and operations}
656 %************************************************************************
659 #ifdef __GLASGOW_HASKELL__
661 = MkUniqueSupply Int#
662 | MkNewSupply SplitUniqSupply
666 = MkUniqueSupply Word{-#STRICT#-}
667 | MkNewSupply SplitUniqSupply
671 @mkUniqueSupply@ is used to get a @UniqueSupply@ started.
673 mkUniqueSupply :: Char -> UniqueSupply
675 #ifdef __GLASGOW_HASKELL__
677 mkUniqueSupply (MkChar c#)
678 = MkUniqueSupply (w2i ((i2w (ord# c#)) `shiftL#` (i2w_s 24#)))
683 = MkUniqueSupply ((fromInt (ord c)) `bitLsh` 24)
687 mkUniqueSupplyGrimily s = MkNewSupply s
690 The basic operation on a @UniqueSupply@ is to get a @Unique@ (or a
691 few). It's just plain different when splittable vs.~not...
693 getUnique :: UniqueSupply -> (UniqueSupply, Unique)
695 getUnique (MkUniqueSupply n)
696 #ifdef __GLASGOW_HASKELL__
697 = (MkUniqueSupply (n +# 1#), MkUnique n)
699 = (MkUniqueSupply (n + 1), MkUnique n)
701 getUnique (MkNewSupply s)
703 (u, s1) = getSUniqueAndDepleted s
707 getUniques :: Int -- how many you want
709 -> (UniqueSupply, [Unique])
711 #ifdef __GLASGOW_HASKELL__
712 getUniques i@(MkInt i#) (MkUniqueSupply n)
713 = (MkUniqueSupply (n +# i#),
714 [ case x of { MkInt x# ->
715 MkUnique (n +# x#) } | x <- [0 .. i-1] ])
717 getUniques i (MkUniqueSupply n)
718 = (MkUniqueSupply (n + fromInt i), [ MkUnique (n + fromInt x) | x <- [0 .. i-1] ])
720 getUniques i (MkNewSupply s)
722 (us, s1) = getSUniquesAndDepleted i s
727 [OLD-ish NOTE] Simon says: The last line is preferable over @(n+i,
728 <mumble> [n .. (n+i-1)])@, because it is a little lazier. If n=bot
729 you get ([bot, bot, bot], bot) back instead of (bot,bot). This is
730 sometimes important for knot-tying.
732 Alternatively, if you hate the inefficiency:
734 (range 0, n+i) where range m | m=i = []
735 range m = n+m : range (m+1)
738 %************************************************************************
740 \subsection[UniqueSupplies-compiler]{@UniqueSupplies@ specific to the compiler}
742 %************************************************************************
744 Different parts of the compiler have their own @UniqueSupplies@, each
745 identified by their ``tag letter:''
747 B builtin; for when the compiler conjures @Uniques@ out of
749 b a second builtin; we need two in mkWrapperUnfolding (False)
753 p ``podizer'' (DPH only)
754 s core-to-core simplifier
755 S ``pod'' simplifier (DPH only)
757 T stg-to-stg simplifier
758 f flattener (of abstract~C)
759 L Assembly labels (for native-code generators)
760 u Printing out unfoldings (so don't have constant renaming)
761 P profiling (finalCCstg)
763 v used in specialised TyVarUniques (see TyVar.lhs)
765 1-9 used for ``prelude Uniques'' (wired-in things; see below)
770 5 = unboxed-primop ids
776 uniqSupply_r = mkUniqueSupply 'r'
777 uniqSupply_t = mkUniqueSupply 't'
778 uniqSupply_d = mkUniqueSupply 'd'
779 uniqSupply_p = mkUniqueSupply 'p'
780 uniqSupply_s = mkUniqueSupply 's'
781 uniqSupply_S = mkUniqueSupply 'S'
782 uniqSupply_c = mkUniqueSupply 'c'
783 uniqSupply_T = mkUniqueSupply 'T'
784 uniqSupply_f = mkUniqueSupply 'f'
785 uniqSupply_L = mkUniqueSupply 'L'
786 uniqSupply_u = mkUniqueSupply 'u'
787 uniqSupply_P = mkUniqueSupply 'P'
790 The ``builtin UniqueSupplies'' are more magical. You don't use the
791 supply, you ask for @Uniques@ directly from it. (They probably aren't
792 unique, but you know that!)
795 uniqSupply_B = mkUniqueSupply 'B' -- not exported!
796 uniqSupply_b = mkUniqueSupply 'b' -- not exported!
800 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
801 mkBuiltinUnique :: Int -> Unique
803 mkBuiltinUnique i = mkUnique 'B' i
804 mkPseudoUnique1 i = mkUnique 'C' i -- used for getTheUnique on Regs
805 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
806 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
808 getBuiltinUniques :: Int -> [Unique]
809 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
812 The following runs a uniq monad expression, using builtin uniq values:
814 runBuiltinUs :: UniqSM a -> a
815 runBuiltinUs m = snd (initUs uniqSupply_B m)
818 %************************************************************************
820 \subsection[Unique-monad]{Unique supply monad}
822 %************************************************************************
824 A very plain unique-supply monad.
827 type UniqSM result = UniqueSupply -> (UniqueSupply, result)
829 -- the initUs function also returns the final UniqueSupply
831 initUs :: UniqueSupply -> UniqSM a -> (UniqueSupply, a)
833 initUs init_us m = m init_us
835 #ifdef __GLASGOW_HASKELL__
836 {-# INLINE thenUs #-}
837 {-# INLINE returnUs #-}
841 @thenUs@ is are where we split the @UniqueSupply@.
843 thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b
847 (us1, result) -> cont result us1
851 returnUs :: a -> UniqSM a
852 returnUs result us = (us, result)
854 mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b]
856 mapUs f [] = returnUs []
858 = f x `thenUs` \ r ->
859 mapUs f xs `thenUs` \ rs ->
862 mapAndUnzipUs :: (a -> UniqSM (b,c)) -> [a] -> UniqSM ([b],[c])
864 mapAndUnzipUs f [] = returnUs ([],[])
865 mapAndUnzipUs f (x:xs)
866 = f x `thenUs` \ (r1, r2) ->
867 mapAndUnzipUs f xs `thenUs` \ (rs1, rs2) ->
868 returnUs (r1:rs1, r2:rs2)