2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
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,
154 unpackCStringAppendIdKey,
155 unpackCStringFoldrIdKey,
159 --NO: rangeComplaintIdKey,
161 integerZeroIdKey, integerPlusOneIdKey,
162 integerPlusTwoIdKey, integerMinusOneIdKey,
166 --UNUSED: packedStringTyConKey, psDataConKey, cpsDataConKey,
168 -- to make interface self-sufficient
169 PrimOp, SplitUniqSupply, CSeq
171 #ifndef __GLASGOW_HASKELL__
176 import Outputable -- class for printing, forcing
178 import PrimOps -- ** DIRECTLY **
182 #ifndef __GLASGOW_HASKELL__
183 {-hide import from mkdependHS-}
187 #ifdef __GLASGOW_HASKELL__
194 %************************************************************************
196 \subsection[Unique-type]{@Unique@ type and operations}
198 %************************************************************************
200 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
201 Fast comparison is everything on @Uniques@:
204 u2i :: Unique -> FAST_INT
206 #ifdef __GLASGOW_HASKELL__
208 data Unique = MkUnique Int#
213 data Unique = MkUnique Word{-#STRICT#-}
214 u2i (MkUnique w) = wordToInt w
219 Now come the functions which construct uniques from their pieces, and vice versa.
220 The stuff about unique *supplies* is handled further down this module.
223 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
224 unpkUnique :: Unique -> (Char, Int) -- The reverse
226 mkUnifiableTyVarUnique :: Int -> Unique -- Injects a subst-array index into the Unique type
227 unpkUnifiableTyVarUnique :: Unique -> Int -- The reverse process
229 #ifdef __GLASGOW_HASKELL__
230 mkUniqueGrimily :: Int# -> Unique -- A trap-door for SplitUniq
232 mkUniqueGrimily :: Int -> Unique
238 #ifdef __GLASGOW_HASKELL__
239 mkUniqueGrimily x = MkUnique x
241 mkUniqueGrimily x = MkUnique (fromInteger (toInteger x))
244 mkUnifiableTyVarUnique i = mkUnique '_'{-MAGIC CHAR-} i
246 unpkUnifiableTyVarUnique uniq
247 = case (unpkUnique uniq) of { (tag, i) ->
248 ASSERT(tag == '_'{-MAGIC CHAR-})
251 -- pop the Char in the top 8 bits of the Unique(Supply)
253 #ifdef __GLASGOW_HASKELL__
255 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
261 mkUnique (MkChar c#) (MkInt i#)
262 = MkUnique (w2i (((i2w (ord# c#)) `shiftL#` (i2w_s 24#)) `or#` (i2w i#)))
264 unpkUnique (MkUnique u)
266 tag = MkChar (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
267 i = MkInt (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
270 # if __GLASGOW_HASKELL__ >= 23
272 shiftr x y = shiftRA# x y
274 shiftr x y = shiftR# x y
277 #else {-probably HBC-}
280 = MkUnique (((fromInt (ord c)) `bitLsh` 24) `bitOr` (fromInt i))
282 unpkUnique (MkUnique u)
284 tag = chr (wordToInt (u `bitRsh` 24))
285 i = wordToInt (u `bitAnd` 16777215 {-0x00ffffff-})
289 #endif {-probably HBC-}
292 %************************************************************************
294 \subsection[Unique-instances]{Instance declarations for @Unique@}
296 %************************************************************************
298 And the whole point (besides uniqueness) is fast equality. We don't
299 use `deriving' because we want {\em precise} control of ordering
300 (equality on @Uniques@ is v common).
303 #ifdef __GLASGOW_HASKELL__
305 {-# INLINE eqUnique #-} -- this is Hammered City here...
306 {-# INLINE cmpUnique #-}
308 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
309 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
310 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
312 cmpUnique (MkUnique u1) (MkUnique u2)
313 = if u1 ==# u2 then EQ_ else if u1 <# u2 then LT_ else GT_
316 eqUnique (MkUnique u1) (MkUnique u2) = u1 == u2
317 ltUnique (MkUnique u1) (MkUnique u2) = u1 < u2
318 leUnique (MkUnique u1) (MkUnique u2) = u1 <= u2
320 cmpUnique (MkUnique u1) (MkUnique u2)
321 = if u1 == u2 then EQ_ else if u1 < u2 then LT_ else GT_
324 instance Eq Unique where
325 a == b = eqUnique a b
326 a /= b = not (eqUnique a b)
328 instance Ord Unique where
330 a <= b = leUnique a b
331 a > b = not (leUnique a b)
332 a >= b = not (ltUnique a b)
333 #ifdef __GLASGOW_HASKELL__
334 _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
341 instance Outputable Unique where
343 = case unpkUnique uniq of
344 (tag, u) -> ppStr (tag : iToBase62 u)
348 We do sometimes make strings with @Uniques@ in them:
350 pprUnique, pprUnique10 :: Unique -> Pretty
353 = case unpkUnique uniq of
354 (tag, u) -> ppBeside (ppChar tag) (iToBase62 u)
356 pprUnique10 uniq -- in base-10, dudes
357 = case unpkUnique uniq of
358 (tag, u) -> ppBeside (ppChar tag) (ppInt u)
360 showUnique :: Unique -> FAST_STRING
361 showUnique uniq = _PK_ (ppShow 80 (pprUnique uniq))
363 instance Text Unique where
364 showsPrec p uniq rest = _UNPK_ (showUnique uniq)
365 readsPrec p = panic "no readsPrec for Unique"
368 %************************************************************************
370 \subsection[Utils-base62]{Base-62 numbers}
372 %************************************************************************
374 A character-stingy way to read/write numbers (notably Uniques).
375 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
376 Code stolen from Lennart.
378 iToBase62 :: Int -> Pretty
380 #ifdef __GLASGOW_HASKELL__
384 bytes = case chars62 of { _ByteArray bounds_who_needs_'em bytes -> bytes }
387 case (indexCharArray# bytes n#) of { c ->
390 case (quotRem n 62) of { (q, I# r#) ->
391 case (indexCharArray# bytes r#) of { c ->
392 ppBeside (iToBase62 q) (ppChar (C# c)) }}
394 -- keep this at top level! (bug on 94/10/24 WDP)
395 chars62 :: _ByteArray Int
398 newCharArray (0, 61) `thenStrictlyST` \ ch_array ->
399 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
401 unsafeFreezeByteArray ch_array
404 fill_in ch_array i lim str
406 = returnStrictlyST ()
408 = writeCharArray ch_array i (str !! i) `seqStrictlyST`
409 fill_in ch_array (i+1) lim str
417 case (quotRem n 62) of { (q, r) ->
418 ppBeside (iToBase62 q) (ppChar (chars62 ! r)) }
420 -- keep this at top level! (bug on 94/10/24 WDP)
421 chars62 :: Array Int Char
423 = array (0,61) (zipWith (:=) [0..] "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
427 %************************************************************************
429 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
431 %************************************************************************
434 mkPreludeClassUnique i = mkUnique '1' i
435 mkPreludeTyConUnique i = mkUnique '2' i
436 mkPreludeDataConUnique i = mkUnique 'Y' i -- must be alphabetic
437 mkTupleDataConUnique i = mkUnique 'Z' i -- ditto (*may* be used in C labels)
438 -- mkPrimOpIdUnique op: see below (uses '5')
439 mkPreludeMiscIdUnique i = mkUnique '7' i
442 %************************************************************************
444 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
446 %************************************************************************
449 eqClassKey = mkPreludeClassUnique 1
450 ordClassKey = mkPreludeClassUnique 2
451 numClassKey = mkPreludeClassUnique 3
452 integralClassKey = mkPreludeClassUnique 4
453 fractionalClassKey = mkPreludeClassUnique 5
454 floatingClassKey = mkPreludeClassUnique 6
455 realClassKey = mkPreludeClassUnique 7
456 realFracClassKey = mkPreludeClassUnique 8
457 realFloatClassKey = mkPreludeClassUnique 9
458 ixClassKey = mkPreludeClassUnique 10
459 enumClassKey = mkPreludeClassUnique 11
460 textClassKey = mkPreludeClassUnique 12
461 binaryClassKey = mkPreludeClassUnique 13
462 cCallableClassKey = mkPreludeClassUnique 14
463 cReturnableClassKey = mkPreludeClassUnique 15
465 pidClassKey = mkPreludeClassUnique 16
466 processorClassKey = mkPreludeClassUnique 17
467 #endif {- Data Parallel Haskell -}
470 %************************************************************************
472 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
474 %************************************************************************
477 addrPrimTyConKey = mkPreludeTyConUnique 1
478 addrTyConKey = mkPreludeTyConUnique 2
479 arrayPrimTyConKey = mkPreludeTyConUnique 3
480 boolTyConKey = mkPreludeTyConUnique 4
481 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
482 --UNUSED:byteArrayTyConKey = mkPreludeTyConUnique 6
483 charPrimTyConKey = mkPreludeTyConUnique 7
484 charTyConKey = mkPreludeTyConUnique 8
485 cmpTagTyConKey = mkPreludeTyConUnique 9
486 dialogueTyConKey = mkPreludeTyConUnique 10
487 doublePrimTyConKey = mkPreludeTyConUnique 11
488 doubleTyConKey = mkPreludeTyConUnique 12
489 floatPrimTyConKey = mkPreludeTyConUnique 13
490 floatTyConKey = mkPreludeTyConUnique 14
491 --UNUSED:iOErrorTyConKey = mkPreludeTyConUnique 14
492 --UNUSED:iOIntPrimTyConKey = mkPreludeTyConUnique 15
493 iOTyConKey = mkPreludeTyConUnique 16
494 intPrimTyConKey = mkPreludeTyConUnique 17
495 intTyConKey = mkPreludeTyConUnique 18
496 integerTyConKey = mkPreludeTyConUnique 19
497 liftTyConKey = mkPreludeTyConUnique 20
498 listTyConKey = mkPreludeTyConUnique 21
499 mallocPtrPrimTyConKey = mkPreludeTyConUnique 22
500 mallocPtrTyConKey = mkPreludeTyConUnique 23
501 mutableArrayPrimTyConKey = mkPreludeTyConUnique 24
502 --UNUSED:mutableArrayTyConKey = mkPreludeTyConUnique 25
503 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 26
504 --UNUSED:mutableByteArrayTyConKey = mkPreludeTyConUnique 27
505 --UNUSED:packedStringTyConKey = mkPreludeTyConUnique 28
506 synchVarPrimTyConKey = mkPreludeTyConUnique 29
507 ratioTyConKey = mkPreludeTyConUnique 30
508 rationalTyConKey = mkPreludeTyConUnique 31
509 realWorldTyConKey = mkPreludeTyConUnique 32
510 --UNUSED:requestTyConKey = mkPreludeTyConUnique 33
511 --UNUSED:responseTyConKey = mkPreludeTyConUnique 34
512 return2GMPsTyConKey = mkPreludeTyConUnique 35
513 returnIntAndGMPTyConKey = mkPreludeTyConUnique 36
514 --UNUSED:seqIntPrimTyConKey = mkPreludeTyConUnique 37
515 --UNUSED:seqTyConKey = mkPreludeTyConUnique 38
516 stablePtrPrimTyConKey = mkPreludeTyConUnique 39
517 stablePtrTyConKey = mkPreludeTyConUnique 40
518 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 41
519 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 42
520 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 43
521 stateAndCharPrimTyConKey = mkPreludeTyConUnique 44
522 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 45
523 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 46
524 stateAndIntPrimTyConKey = mkPreludeTyConUnique 47
525 stateAndMallocPtrPrimTyConKey = mkPreludeTyConUnique 48
526 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 49
527 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 50
528 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 51
529 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 52
530 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 53
531 stateAndWordPrimTyConKey = mkPreludeTyConUnique 54
532 statePrimTyConKey = mkPreludeTyConUnique 55
533 stateTyConKey = mkPreludeTyConUnique 56
534 stringTyConKey = mkPreludeTyConUnique 57
535 stTyConKey = mkPreludeTyConUnique 58
536 primIoTyConKey = mkPreludeTyConUnique 59
537 --UNUSED:ioResultTyConKey = mkPreludeTyConUnique 60
538 voidPrimTyConKey = mkPreludeTyConUnique 61
539 wordPrimTyConKey = mkPreludeTyConUnique 62
540 wordTyConKey = mkPreludeTyConUnique 63
543 podTyConKey = mkPreludeTyConUnique 64
544 interfacePodTyConKey = mkPreludeTyConUnique 65
546 podizedPodTyConKey _ = panic "ToDo:DPH:podizedPodTyConKey"
547 #endif {- Data Parallel Haskell -}
550 %************************************************************************
552 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
554 %************************************************************************
557 addrDataConKey = mkPreludeDataConUnique 1
558 buildDataConKey = mkPreludeDataConUnique 2
559 --UNUSED:byteArrayDataConKey = mkPreludeDataConUnique 3
560 charDataConKey = mkPreludeDataConUnique 4
561 consDataConKey = mkPreludeDataConUnique 5
562 doubleDataConKey = mkPreludeDataConUnique 6
563 eqTagDataConKey = mkPreludeDataConUnique 7
564 falseDataConKey = mkPreludeDataConUnique 8
565 floatDataConKey = mkPreludeDataConUnique 9
566 gtTagDataConKey = mkPreludeDataConUnique 10
567 intDataConKey = mkPreludeDataConUnique 11
568 integerDataConKey = mkPreludeDataConUnique 12
569 liftDataConKey = mkPreludeDataConUnique 13
570 ltTagDataConKey = mkPreludeDataConUnique 14
571 mallocPtrDataConKey = mkPreludeDataConUnique 15
572 --UNUSED:mutableArrayDataConKey = mkPreludeDataConUnique 16
573 --UNUSED:mutableByteArrayDataConKey = mkPreludeDataConUnique 17
574 nilDataConKey = mkPreludeDataConUnique 18
575 --UNUSED:psDataConKey = mkPreludeDataConUnique 19
576 --UNUSED:cpsDataConKey = mkPreludeDataConUnique 20
577 ratioDataConKey = mkPreludeDataConUnique 21
578 return2GMPsDataConKey = mkPreludeDataConUnique 22
579 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
580 stablePtrDataConKey = mkPreludeDataConUnique 24
581 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
582 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
583 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
584 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
585 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
586 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
587 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
588 stateAndMallocPtrPrimDataConKey = mkPreludeDataConUnique 32
589 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
590 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
591 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
592 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
593 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
594 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
595 stateDataConKey = mkPreludeDataConUnique 39
596 trueDataConKey = mkPreludeDataConUnique 40
597 wordDataConKey = mkPreludeDataConUnique 41
600 interfacePodDataConKey = mkPreludeDataConUnique 42
601 #endif {- Data Parallel Haskell -}
604 %************************************************************************
606 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
608 %************************************************************************
610 First, for raw @PrimOps@ and their boxed versions:
612 mkPrimOpIdUnique :: PrimOp -> Unique
614 mkPrimOpIdUnique op = mkUnique '5' IBOX((tagOf_PrimOp op))
617 Now for other non-@DataCon@ @Ids@:
619 absentErrorIdKey = mkPreludeMiscIdUnique 1
620 appendIdKey = mkPreludeMiscIdUnique 2
621 augmentIdKey = mkPreludeMiscIdUnique 3
622 buildIdKey = mkPreludeMiscIdUnique 4
623 errorIdKey = mkPreludeMiscIdUnique 5
624 foldlIdKey = mkPreludeMiscIdUnique 6
625 foldrIdKey = mkPreludeMiscIdUnique 7
626 forkIdKey = mkPreludeMiscIdUnique 8
627 int2IntegerIdKey = mkPreludeMiscIdUnique 9
628 integerMinusOneIdKey = mkPreludeMiscIdUnique 10
629 integerPlusOneIdKey = mkPreludeMiscIdUnique 11
630 integerPlusTwoIdKey = mkPreludeMiscIdUnique 12
631 integerZeroIdKey = mkPreludeMiscIdUnique 13
632 packCStringIdKey = mkPreludeMiscIdUnique 14
633 parErrorIdKey = mkPreludeMiscIdUnique 15
634 parIdKey = mkPreludeMiscIdUnique 16
635 patErrorIdKey = mkPreludeMiscIdUnique 25
636 --NO:rangeComplaintIdKey = mkPreludeMiscIdUnique 17
637 realWorldPrimIdKey = mkPreludeMiscIdUnique 18
638 runSTIdKey = mkPreludeMiscIdUnique 19
639 seqIdKey = mkPreludeMiscIdUnique 20
640 traceIdKey = mkPreludeMiscIdUnique 21
641 unpackCString2IdKey = mkPreludeMiscIdUnique 22
642 unpackCStringAppendIdKey= mkPreludeMiscIdUnique 23
643 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 24
644 unpackCStringIdKey = mkPreludeMiscIdUnique 25
645 voidPrimIdKey = mkPreludeMiscIdUnique 26
648 parLocalIdKey = mkPreludeMiscIdUnique 27
649 parGlobalIdKey = mkPreludeMiscIdUnique 28
650 noFollowIdKey = mkPreludeMiscIdUnique 29
651 copyableIdKey = mkPreludeMiscIdUnique 30
655 podSelectorIdKey = mkPreludeMiscIdUnique 31
656 #endif {- Data Parallel Haskell -}
659 %************************************************************************
661 \subsection[UniqueSupply-type]{@UniqueSupply@ type and operations}
663 %************************************************************************
666 #ifdef __GLASGOW_HASKELL__
668 = MkUniqueSupply Int#
669 | MkNewSupply SplitUniqSupply
673 = MkUniqueSupply Word{-#STRICT#-}
674 | MkNewSupply SplitUniqSupply
678 @mkUniqueSupply@ is used to get a @UniqueSupply@ started.
680 mkUniqueSupply :: Char -> UniqueSupply
682 #ifdef __GLASGOW_HASKELL__
684 mkUniqueSupply (MkChar c#)
685 = MkUniqueSupply (w2i ((i2w (ord# c#)) `shiftL#` (i2w_s 24#)))
690 = MkUniqueSupply ((fromInt (ord c)) `bitLsh` 24)
694 mkUniqueSupplyGrimily s = MkNewSupply s
697 The basic operation on a @UniqueSupply@ is to get a @Unique@ (or a
698 few). It's just plain different when splittable vs.~not...
700 getUnique :: UniqueSupply -> (UniqueSupply, Unique)
702 getUnique (MkUniqueSupply n)
703 #ifdef __GLASGOW_HASKELL__
704 = (MkUniqueSupply (n +# 1#), MkUnique n)
706 = (MkUniqueSupply (n + 1), MkUnique n)
708 getUnique (MkNewSupply s)
710 (u, s1) = getSUniqueAndDepleted s
714 getUniques :: Int -- how many you want
716 -> (UniqueSupply, [Unique])
718 #ifdef __GLASGOW_HASKELL__
719 getUniques i@(MkInt i#) (MkUniqueSupply n)
720 = (MkUniqueSupply (n +# i#),
721 [ case x of { MkInt x# ->
722 MkUnique (n +# x#) } | x <- [0 .. i-1] ])
724 getUniques i (MkUniqueSupply n)
725 = (MkUniqueSupply (n + fromInt i), [ MkUnique (n + fromInt x) | x <- [0 .. i-1] ])
727 getUniques i (MkNewSupply s)
729 (us, s1) = getSUniquesAndDepleted i s
734 [OLD-ish NOTE] Simon says: The last line is preferable over @(n+i,
735 <mumble> [n .. (n+i-1)])@, because it is a little lazier. If n=bot
736 you get ([bot, bot, bot], bot) back instead of (bot,bot). This is
737 sometimes important for knot-tying.
739 Alternatively, if you hate the inefficiency:
741 (range 0, n+i) where range m | m=i = []
742 range m = n+m : range (m+1)
745 %************************************************************************
747 \subsection[UniqueSupplies-compiler]{@UniqueSupplies@ specific to the compiler}
749 %************************************************************************
751 Different parts of the compiler have their own @UniqueSupplies@, each
752 identified by their ``tag letter:''
754 B builtin; for when the compiler conjures @Uniques@ out of
756 b a second builtin; we need two in mkWrapperUnfolding (False)
760 p ``podizer'' (DPH only)
761 s core-to-core simplifier
762 S ``pod'' simplifier (DPH only)
764 T stg-to-stg simplifier
765 f flattener (of abstract~C)
766 L Assembly labels (for native-code generators)
767 u Printing out unfoldings (so don't have constant renaming)
768 P profiling (finalCCstg)
770 v used in specialised TyVarUniques (see TyVar.lhs)
772 1-9 used for ``prelude Uniques'' (wired-in things; see below)
777 5 = unboxed-primop ids
783 uniqSupply_r = mkUniqueSupply 'r'
784 uniqSupply_t = mkUniqueSupply 't'
785 uniqSupply_d = mkUniqueSupply 'd'
786 uniqSupply_p = mkUniqueSupply 'p'
787 uniqSupply_s = mkUniqueSupply 's'
788 uniqSupply_S = mkUniqueSupply 'S'
789 uniqSupply_c = mkUniqueSupply 'c'
790 uniqSupply_T = mkUniqueSupply 'T'
791 uniqSupply_f = mkUniqueSupply 'f'
792 uniqSupply_L = mkUniqueSupply 'L'
793 uniqSupply_u = mkUniqueSupply 'u'
794 uniqSupply_P = mkUniqueSupply 'P'
797 The ``builtin UniqueSupplies'' are more magical. You don't use the
798 supply, you ask for @Uniques@ directly from it. (They probably aren't
799 unique, but you know that!)
802 uniqSupply_B = mkUniqueSupply 'B' -- not exported!
803 uniqSupply_b = mkUniqueSupply 'b' -- not exported!
807 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
808 mkBuiltinUnique :: Int -> Unique
810 mkBuiltinUnique i = mkUnique 'B' i
811 mkPseudoUnique1 i = mkUnique 'C' i -- used for getTheUnique on Regs
812 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
813 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
815 getBuiltinUniques :: Int -> [Unique]
816 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
819 The following runs a uniq monad expression, using builtin uniq values:
821 runBuiltinUs :: UniqSM a -> a
822 runBuiltinUs m = snd (initUs uniqSupply_B m)
825 %************************************************************************
827 \subsection[Unique-monad]{Unique supply monad}
829 %************************************************************************
831 A very plain unique-supply monad.
834 type UniqSM result = UniqueSupply -> (UniqueSupply, result)
836 -- the initUs function also returns the final UniqueSupply
838 initUs :: UniqueSupply -> UniqSM a -> (UniqueSupply, a)
840 initUs init_us m = m init_us
842 #ifdef __GLASGOW_HASKELL__
843 {-# INLINE thenUs #-}
844 {-# INLINE returnUs #-}
848 @thenUs@ is are where we split the @UniqueSupply@.
850 thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b
854 (us1, result) -> cont result us1
858 returnUs :: a -> UniqSM a
859 returnUs result us = (us, result)
861 mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b]
863 mapUs f [] = returnUs []
865 = f x `thenUs` \ r ->
866 mapUs f xs `thenUs` \ rs ->
869 mapAndUnzipUs :: (a -> UniqSM (b,c)) -> [a] -> UniqSM ([b],[c])
871 mapAndUnzipUs f [] = returnUs ([],[])
872 mapAndUnzipUs f (x:xs)
873 = f x `thenUs` \ (r1, r2) ->
874 mapAndUnzipUs f xs `thenUs` \ (rs1, rs2) ->
875 returnUs (r1:rs1, r2:rs2)