2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Unique]{The @Unique@ data type}
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"
21 --<mkdependHS:friends> UniqSupply
25 u2i, -- hack: used in UniqFM
27 pprUnique, pprUnique10, showUnique,
29 mkUnique, -- Used in UniqSupply
30 mkUniqueGrimily, -- Used in UniqSupply only!
32 incrUnique, -- Used for renumbering
33 initRenumberingUniques,
35 -- now all the built-in Uniques (and functions to make them)
36 -- [the Oh-So-Wonderful Haskell module system wins again...]
42 getBuiltinUniques, mkBuiltinUnique,
43 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
45 absentErrorIdKey, -- alphabetical...
57 byteArrayPrimTyConKey,
70 enumFromThenClassOpKey,
71 enumFromThenToClassOpKey,
86 foreignObjPrimTyConKey,
92 fromIntegerClassOpKey,
93 fromRationalClassOpKey,
103 integerMinusOneIdKey,
109 irrefutPatErrorIdKey,
116 mainKey, mainPrimIoKey,
121 mutableArrayPrimTyConKey,
122 mutableByteArrayPrimTyConKey,
124 noDefaultMethodErrorIdKey,
125 nonExhaustiveGuardsErrorIdKey,
126 nonExplicitMethodErrorIdKey,
149 return2GMPsDataConKey,
151 returnIntAndGMPDataConKey,
152 returnIntAndGMPTyConKey,
163 stablePtrPrimTyConKey,
165 stateAndAddrPrimDataConKey,
166 stateAndAddrPrimTyConKey,
167 stateAndArrayPrimDataConKey,
168 stateAndArrayPrimTyConKey,
169 stateAndByteArrayPrimDataConKey,
170 stateAndByteArrayPrimTyConKey,
171 stateAndCharPrimDataConKey,
172 stateAndCharPrimTyConKey,
173 stateAndDoublePrimDataConKey,
174 stateAndDoublePrimTyConKey,
175 stateAndFloatPrimDataConKey,
176 stateAndFloatPrimTyConKey,
177 stateAndForeignObjPrimDataConKey,
178 stateAndForeignObjPrimTyConKey,
179 stateAndIntPrimDataConKey,
180 stateAndIntPrimTyConKey,
181 stateAndMutableArrayPrimDataConKey,
182 stateAndMutableArrayPrimTyConKey,
183 stateAndMutableByteArrayPrimDataConKey,
184 stateAndMutableByteArrayPrimTyConKey,
185 stateAndPtrPrimDataConKey,
186 stateAndPtrPrimTyConKey,
187 stateAndStablePtrPrimDataConKey,
188 stateAndStablePtrPrimTyConKey,
189 stateAndSynchVarPrimDataConKey,
190 stateAndSynchVarPrimTyConKey,
191 stateAndWordPrimDataConKey,
192 stateAndWordPrimTyConKey,
196 synchVarPrimTyConKey,
202 unpackCStringAppendIdKey,
203 unpackCStringFoldrIdKey,
223 , mutableByteArrayTyConKey
227 #if __GLASGOW_HASKELL__ <= 201
236 #if __GLASGOW_HASKELL__ >= 202
237 import {-# SOURCE #-} UniqFM ( Uniquable(..) )
245 %************************************************************************
247 \subsection[Unique-type]{@Unique@ type and operations}
249 %************************************************************************
251 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
252 Fast comparison is everything on @Uniques@:
255 u2i :: Unique -> FAST_INT
257 data Unique = MkUnique Int#
261 Now come the functions which construct uniques from their pieces, and vice versa.
262 The stuff about unique *supplies* is handled further down this module.
265 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
266 unpkUnique :: Unique -> (Char, Int) -- The reverse
268 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
270 incrUnique :: Unique -> Unique
275 mkUniqueGrimily x = MkUnique x
277 incrUnique (MkUnique i) = MkUnique (i +# 1#)
279 -- pop the Char in the top 8 bits of the Unique(Supply)
281 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
287 mkUnique (C# c) (I# i)
288 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
290 unpkUnique (MkUnique u)
292 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
293 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
297 shiftr x y = shiftRA# x y
300 %************************************************************************
302 \subsection[Unique-instances]{Instance declarations for @Unique@}
304 %************************************************************************
306 And the whole point (besides uniqueness) is fast equality. We don't
307 use `deriving' because we want {\em precise} control of ordering
308 (equality on @Uniques@ is v common).
311 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
312 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
313 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
315 cmpUnique (MkUnique u1) (MkUnique u2)
316 = 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 _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
329 instance Ord3 Unique where
333 instance Uniquable Unique where
337 We do sometimes make strings with @Uniques@ in them:
339 pprUnique, pprUnique10 :: Unique -> Doc
342 = case unpkUnique uniq of
343 (tag, u) -> finish_ppr tag u (iToBase62 u)
345 pprUnique10 uniq -- in base-10, dudes
346 = case unpkUnique uniq of
347 (tag, u) -> finish_ppr tag u (int u)
349 finish_ppr tag u pp_u
350 = if tag /= 't' -- this is just to make v common tyvars, t1, t2, ...
351 -- come out as a, b, ... (shorter, easier to read)
361 pp_all = (<>) (char tag) pp_u
363 showUnique :: Unique -> FAST_STRING
364 showUnique uniq = _PK_ (show (pprUnique uniq))
366 instance Outputable Unique where
367 ppr sty u = pprUnique u
369 instance Text Unique where
370 showsPrec p uniq rest = _UNPK_ (showUnique uniq)
373 %************************************************************************
375 \subsection[Utils-base62]{Base-62 numbers}
377 %************************************************************************
379 A character-stingy way to read/write numbers (notably Uniques).
380 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
381 Code stolen from Lennart.
383 #if __GLASGOW_HASKELL__ == 201
384 # define BYTE_ARRAY GHCbase.ByteArray
385 # define RUN_ST GHCbase.runST
386 # define AND_THEN >>=
387 # define AND_THEN_ >>
388 # define RETURN return
389 #elif __GLASGOW_HASKELL__ >= 202
390 # define BYTE_ARRAY GlaExts.ByteArray
391 # define RUN_ST ST.runST
392 # define AND_THEN >>=
393 # define AND_THEN_ >>
394 # define RETURN return
396 # define BYTE_ARRAY _ByteArray
397 # define RUN_ST _runST
398 # define AND_THEN `thenStrictlyST`
399 # define AND_THEN_ `seqStrictlyST`
400 # define RETURN returnStrictlyST
403 iToBase62 :: Int -> Doc
408 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
411 case (indexCharArray# bytes n#) of { c ->
414 case (quotRem n 62) of { (q, I# r#) ->
415 case (indexCharArray# bytes r#) of { c ->
416 (<>) (iToBase62 q) (char (C# c)) }}
418 -- keep this at top level! (bug on 94/10/24 WDP)
419 chars62 :: BYTE_ARRAY Int
422 newCharArray (0, 61) AND_THEN \ ch_array ->
423 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
425 unsafeFreezeByteArray ch_array
428 fill_in ch_array i lim str
432 = writeCharArray ch_array i (str !! i) AND_THEN_
433 fill_in ch_array (i+1) lim str
436 %************************************************************************
438 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
440 %************************************************************************
442 Allocation of unique supply characters:
443 v,t,u : for renumbering value-, type- and usage- vars.
444 other a-z: lower case chars for unique supplies (see Main.lhs)
446 C-E: pseudo uniques (used in native-code generator)
447 _: unifiable tyvars (above)
448 1-8: prelude things below
451 mkAlphaTyVarUnique i = mkUnique '1' i
453 mkPreludeClassUnique i = mkUnique '2' i
454 mkPreludeTyConUnique i = mkUnique '3' i
455 mkTupleTyConUnique a = mkUnique '4' a
457 mkPreludeDataConUnique i = mkUnique '5' i -- must be alphabetic
458 mkTupleDataConUnique a = mkUnique '6' a -- ditto (*may* be used in C labels)
460 mkPrimOpIdUnique op = mkUnique '7' op
461 mkPreludeMiscIdUnique i = mkUnique '8' i
463 initRenumberingUniques = (mkUnique 'v' 1, mkUnique 't' 1, mkUnique 'u' 1)
465 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
466 mkBuiltinUnique :: Int -> Unique
468 mkBuiltinUnique i = mkUnique 'B' i
469 mkPseudoUnique1 i = mkUnique 'C' i -- used for uniqueOf on Regs
470 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
471 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
473 getBuiltinUniques :: Int -> [Unique]
474 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
477 %************************************************************************
479 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
481 %************************************************************************
484 boundedClassKey = mkPreludeClassUnique 1
485 enumClassKey = mkPreludeClassUnique 2
486 eqClassKey = mkPreludeClassUnique 3
487 evalClassKey = mkPreludeClassUnique 4
488 floatingClassKey = mkPreludeClassUnique 5
489 fractionalClassKey = mkPreludeClassUnique 6
490 integralClassKey = mkPreludeClassUnique 7
491 monadClassKey = mkPreludeClassUnique 8
492 monadZeroClassKey = mkPreludeClassUnique 9
493 monadPlusClassKey = mkPreludeClassUnique 10
494 functorClassKey = mkPreludeClassUnique 11
495 numClassKey = mkPreludeClassUnique 12
496 ordClassKey = mkPreludeClassUnique 13
497 readClassKey = mkPreludeClassUnique 14
498 realClassKey = mkPreludeClassUnique 15
499 realFloatClassKey = mkPreludeClassUnique 16
500 realFracClassKey = mkPreludeClassUnique 17
501 showClassKey = mkPreludeClassUnique 18
503 cCallableClassKey = mkPreludeClassUnique 19
504 cReturnableClassKey = mkPreludeClassUnique 20
506 ixClassKey = mkPreludeClassUnique 21
507 allClassKey = mkPreludeClassUnique 22 -- Pseudo class used for universal quantification
510 %************************************************************************
512 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
514 %************************************************************************
517 addrPrimTyConKey = mkPreludeTyConUnique 1
518 addrTyConKey = mkPreludeTyConUnique 2
519 arrayPrimTyConKey = mkPreludeTyConUnique 3
520 boolTyConKey = mkPreludeTyConUnique 4
521 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
522 charPrimTyConKey = mkPreludeTyConUnique 7
523 charTyConKey = mkPreludeTyConUnique 8
524 doublePrimTyConKey = mkPreludeTyConUnique 9
525 doubleTyConKey = mkPreludeTyConUnique 10
526 floatPrimTyConKey = mkPreludeTyConUnique 11
527 floatTyConKey = mkPreludeTyConUnique 12
528 funTyConKey = mkPreludeTyConUnique 13
529 iOTyConKey = mkPreludeTyConUnique 14
530 intPrimTyConKey = mkPreludeTyConUnique 15
531 intTyConKey = mkPreludeTyConUnique 16
532 integerTyConKey = mkPreludeTyConUnique 17
533 liftTyConKey = mkPreludeTyConUnique 18
534 listTyConKey = mkPreludeTyConUnique 19
535 foreignObjPrimTyConKey = mkPreludeTyConUnique 20
536 foreignObjTyConKey = mkPreludeTyConUnique 21
537 mutableArrayPrimTyConKey = mkPreludeTyConUnique 22
538 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 23
539 orderingTyConKey = mkPreludeTyConUnique 24
540 synchVarPrimTyConKey = mkPreludeTyConUnique 25
541 ratioTyConKey = mkPreludeTyConUnique 26
542 rationalTyConKey = mkPreludeTyConUnique 27
543 realWorldTyConKey = mkPreludeTyConUnique 28
544 return2GMPsTyConKey = mkPreludeTyConUnique 29
545 returnIntAndGMPTyConKey = mkPreludeTyConUnique 30
546 stablePtrPrimTyConKey = mkPreludeTyConUnique 31
547 stablePtrTyConKey = mkPreludeTyConUnique 32
548 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 33
549 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 34
550 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 35
551 stateAndCharPrimTyConKey = mkPreludeTyConUnique 36
552 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 37
553 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 38
554 stateAndIntPrimTyConKey = mkPreludeTyConUnique 39
555 stateAndForeignObjPrimTyConKey = mkPreludeTyConUnique 40
556 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 41
557 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 42
558 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 43
559 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 44
560 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 45
561 stateAndWordPrimTyConKey = mkPreludeTyConUnique 46
562 statePrimTyConKey = mkPreludeTyConUnique 47
563 stateTyConKey = mkPreludeTyConUnique 48
564 mutableByteArrayTyConKey = mkPreludeTyConUnique 49
565 stTyConKey = mkPreludeTyConUnique 50
566 primIoTyConKey = mkPreludeTyConUnique 51
567 byteArrayTyConKey = mkPreludeTyConUnique 52
568 wordPrimTyConKey = mkPreludeTyConUnique 53
569 wordTyConKey = mkPreludeTyConUnique 54
570 voidTyConKey = mkPreludeTyConUnique 55
573 %************************************************************************
575 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
577 %************************************************************************
580 addrDataConKey = mkPreludeDataConUnique 1
581 buildDataConKey = mkPreludeDataConUnique 2
582 charDataConKey = mkPreludeDataConUnique 4
583 consDataConKey = mkPreludeDataConUnique 5
584 doubleDataConKey = mkPreludeDataConUnique 6
585 eqDataConKey = mkPreludeDataConUnique 7
586 falseDataConKey = mkPreludeDataConUnique 8
587 floatDataConKey = mkPreludeDataConUnique 9
588 gtDataConKey = mkPreludeDataConUnique 10
589 intDataConKey = mkPreludeDataConUnique 11
590 integerDataConKey = mkPreludeDataConUnique 12
591 liftDataConKey = mkPreludeDataConUnique 13
592 ltDataConKey = mkPreludeDataConUnique 14
593 foreignObjDataConKey = mkPreludeDataConUnique 15
594 nilDataConKey = mkPreludeDataConUnique 18
595 ratioDataConKey = mkPreludeDataConUnique 21
596 return2GMPsDataConKey = mkPreludeDataConUnique 22
597 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
598 stablePtrDataConKey = mkPreludeDataConUnique 24
599 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
600 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
601 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
602 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
603 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
604 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
605 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
606 stateAndForeignObjPrimDataConKey = mkPreludeDataConUnique 32
607 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
608 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
609 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
610 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
611 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
612 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
613 stateDataConKey = mkPreludeDataConUnique 39
614 trueDataConKey = mkPreludeDataConUnique 40
615 wordDataConKey = mkPreludeDataConUnique 41
616 stDataConKey = mkPreludeDataConUnique 42
619 %************************************************************************
621 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
623 %************************************************************************
626 absentErrorIdKey = mkPreludeMiscIdUnique 1
627 andandIdKey = mkPreludeMiscIdUnique 2
628 appendIdKey = mkPreludeMiscIdUnique 3
629 augmentIdKey = mkPreludeMiscIdUnique 4
630 buildIdKey = mkPreludeMiscIdUnique 5
631 composeIdKey = mkPreludeMiscIdUnique 6
632 errorIdKey = mkPreludeMiscIdUnique 7
633 foldlIdKey = mkPreludeMiscIdUnique 8
634 foldrIdKey = mkPreludeMiscIdUnique 9
635 forkIdKey = mkPreludeMiscIdUnique 10
636 int2IntegerIdKey = mkPreludeMiscIdUnique 11
637 integerMinusOneIdKey = mkPreludeMiscIdUnique 12
638 integerPlusOneIdKey = mkPreludeMiscIdUnique 13
639 integerPlusTwoIdKey = mkPreludeMiscIdUnique 14
640 integerZeroIdKey = mkPreludeMiscIdUnique 15
641 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 16
642 lexIdKey = mkPreludeMiscIdUnique 17
643 noDefaultMethodErrorIdKey = mkPreludeMiscIdUnique 20
644 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 21
645 nonExplicitMethodErrorIdKey = mkPreludeMiscIdUnique 22
646 notIdKey = mkPreludeMiscIdUnique 23
647 packCStringIdKey = mkPreludeMiscIdUnique 24
648 parErrorIdKey = mkPreludeMiscIdUnique 25
649 parIdKey = mkPreludeMiscIdUnique 26
650 patErrorIdKey = mkPreludeMiscIdUnique 27
651 readParenIdKey = mkPreludeMiscIdUnique 28
652 realWorldPrimIdKey = mkPreludeMiscIdUnique 29
653 recConErrorIdKey = mkPreludeMiscIdUnique 30
654 recUpdErrorIdKey = mkPreludeMiscIdUnique 31
655 runSTIdKey = mkPreludeMiscIdUnique 32
656 seqIdKey = mkPreludeMiscIdUnique 33
657 showParenIdKey = mkPreludeMiscIdUnique 34
658 showSpaceIdKey = mkPreludeMiscIdUnique 35
659 showStringIdKey = mkPreludeMiscIdUnique 36
660 traceIdKey = mkPreludeMiscIdUnique 37
661 unpackCString2IdKey = mkPreludeMiscIdUnique 38
662 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 39
663 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 40
664 unpackCStringIdKey = mkPreludeMiscIdUnique 41
665 voidIdKey = mkPreludeMiscIdUnique 42
666 ushowListIdKey = mkPreludeMiscIdUnique 43
667 ureadListIdKey = mkPreludeMiscIdUnique 44
669 copyableIdKey = mkPreludeMiscIdUnique 45
670 noFollowIdKey = mkPreludeMiscIdUnique 46
671 parAtAbsIdKey = mkPreludeMiscIdUnique 47
672 parAtForNowIdKey = mkPreludeMiscIdUnique 48
673 parAtIdKey = mkPreludeMiscIdUnique 49
674 parAtRelIdKey = mkPreludeMiscIdUnique 50
675 parGlobalIdKey = mkPreludeMiscIdUnique 51
676 parLocalIdKey = mkPreludeMiscIdUnique 52
679 Certain class operations from Prelude classes. They get
680 their own uniques so we can look them up easily when we want
681 to conjure them up during type checking.
683 fromIntClassOpKey = mkPreludeMiscIdUnique 53
684 fromIntegerClassOpKey = mkPreludeMiscIdUnique 54
685 minusClassOpKey = mkPreludeMiscIdUnique 69
686 fromRationalClassOpKey = mkPreludeMiscIdUnique 55
687 enumFromClassOpKey = mkPreludeMiscIdUnique 56
688 enumFromThenClassOpKey = mkPreludeMiscIdUnique 57
689 enumFromToClassOpKey = mkPreludeMiscIdUnique 58
690 enumFromThenToClassOpKey= mkPreludeMiscIdUnique 59
691 eqClassOpKey = mkPreludeMiscIdUnique 60
692 geClassOpKey = mkPreludeMiscIdUnique 61
693 zeroClassOpKey = mkPreludeMiscIdUnique 62
694 thenMClassOpKey = mkPreludeMiscIdUnique 63 -- (>>=)
695 unboundKey = mkPreludeMiscIdUnique 64 -- Just a place holder for unbound
696 -- variables produced by the renamer
697 fromEnumClassOpKey = mkPreludeMiscIdUnique 65
699 mainKey = mkPreludeMiscIdUnique 66
700 mainPrimIoKey = mkPreludeMiscIdUnique 67
701 returnMClassOpKey = mkPreludeMiscIdUnique 68
702 -- Used for minusClassOp 69
703 otherwiseIdKey = mkPreludeMiscIdUnique 70
704 toEnumClassOpKey = mkPreludeMiscIdUnique 71