3 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
4 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
5 comparison key in the compiler.
7 If there is any single operation that needs to be fast, it is @Unique@
8 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
11 Some of the other hair in this code is to be able to use a
12 ``splittable @UniqueSupply@'' if requested/possible (not standard
17 Unique, Uniquable(..),
18 u2i, -- hack: used in UniqFM
20 pprUnique, pprUnique10, showUnique,
22 mkUnique, -- Used in UniqSupply
23 mkUniqueGrimily, -- Used in UniqSupply only!
25 incrUnique, -- Used for renumbering
26 initTyVarUnique, mkTyVarUnique,
29 -- now all the built-in Uniques (and functions to make them)
30 -- [the Oh-So-Wonderful Haskell module system wins again...]
36 getBuiltinUniques, mkBuiltinUnique,
37 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
39 absentErrorIdKey, -- alphabetical...
52 byteArrayPrimTyConKey,
66 enumFromThenClassOpKey,
67 enumFromThenToClassOpKey,
82 foreignObjPrimTyConKey,
88 fromIntegerClassOpKey,
89 fromRationalClassOpKey,
105 irrefutPatErrorIdKey,
117 mutableArrayPrimTyConKey,
118 mutableByteArrayPrimTyConKey,
120 noMethodBindingErrorIdKey,
121 nonExhaustiveGuardsErrorIdKey,
144 return2GMPsDataConKey,
146 returnIntAndGMPDataConKey,
147 returnIntAndGMPTyConKey,
162 stablePtrPrimTyConKey,
164 stateAndAddrPrimDataConKey,
165 stateAndAddrPrimTyConKey,
166 stateAndArrayPrimDataConKey,
167 stateAndArrayPrimTyConKey,
168 stateAndByteArrayPrimDataConKey,
169 stateAndByteArrayPrimTyConKey,
170 stateAndCharPrimDataConKey,
171 stateAndCharPrimTyConKey,
172 stateAndDoublePrimDataConKey,
173 stateAndDoublePrimTyConKey,
174 stateAndFloatPrimDataConKey,
175 stateAndFloatPrimTyConKey,
176 stateAndForeignObjPrimDataConKey,
177 stateAndForeignObjPrimTyConKey,
178 stateAndIntPrimDataConKey,
179 stateAndIntPrimTyConKey,
180 stateAndMutableArrayPrimDataConKey,
181 stateAndMutableArrayPrimTyConKey,
182 stateAndMutableByteArrayPrimDataConKey,
183 stateAndMutableByteArrayPrimTyConKey,
184 stateAndPtrPrimDataConKey,
185 stateAndPtrPrimTyConKey,
186 stateAndStablePtrPrimDataConKey,
187 stateAndStablePtrPrimTyConKey,
188 stateAndSynchVarPrimDataConKey,
189 stateAndSynchVarPrimTyConKey,
190 stateAndWordPrimDataConKey,
191 stateAndWordPrimTyConKey,
197 synchVarPrimTyConKey,
203 unpackCStringAppendIdKey,
204 unpackCStringFoldrIdKey,
225 , mutableByteArrayTyConKey
229 #include "HsVersions.h"
231 import FastString ( uniqueOfFS )
234 import PrelBase ( Char(..), chr, ord )
240 %************************************************************************
242 \subsection[Unique-type]{@Unique@ type and operations}
244 %************************************************************************
246 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
247 Fast comparison is everything on @Uniques@:
250 data Unique = MkUnique Int#
254 u2i :: Unique -> FAST_INT
258 Now come the functions which construct uniques from their pieces, and vice versa.
259 The stuff about unique *supplies* is handled further down this module.
262 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
263 unpkUnique :: Unique -> (Char, Int) -- The reverse
265 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
267 incrUnique :: Unique -> Unique
272 mkUniqueGrimily x = MkUnique x
274 incrUnique (MkUnique i) = MkUnique (i +# 1#)
276 -- pop the Char in the top 8 bits of the Unique(Supply)
278 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
284 mkUnique (C# c) (I# i)
285 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
287 unpkUnique (MkUnique u)
289 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
290 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
294 shiftr x y = shiftRA# x y
299 %************************************************************************
301 \subsection[Uniquable-class]{The @Uniquable@ class}
303 %************************************************************************
306 class Uniquable a where
307 uniqueOf :: a -> Unique
309 instance Uniquable FastString where
310 uniqueOf fs = mkUniqueGrimily (uniqueOfFS fs)
312 instance Uniquable Int where
313 uniqueOf (I# i#) = mkUniqueGrimily i#
317 %************************************************************************
319 \subsection[Unique-instances]{Instance declarations for @Unique@}
321 %************************************************************************
323 And the whole point (besides uniqueness) is fast equality. We don't
324 use `deriving' because we want {\em precise} control of ordering
325 (equality on @Uniques@ is v common).
328 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
329 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
330 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
332 cmpUnique (MkUnique u1) (MkUnique u2)
333 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
335 instance Eq Unique where
336 a == b = eqUnique a b
337 a /= b = not (eqUnique a b)
339 instance Ord Unique where
341 a <= b = leUnique a b
342 a > b = not (leUnique a b)
343 a >= b = not (ltUnique a b)
344 compare a b = cmpUnique a b
347 instance Uniquable Unique where
351 We do sometimes make strings with @Uniques@ in them:
353 pprUnique, pprUnique10 :: Unique -> SDoc
356 = case unpkUnique uniq of
357 (tag, u) -> finish_ppr tag u (iToBase62 u)
359 pprUnique10 uniq -- in base-10, dudes
360 = case unpkUnique uniq of
361 (tag, u) -> finish_ppr tag u (int u)
363 finish_ppr 't' u pp_u | u < 26
364 = -- Special case to make v common tyvars, t1, t2, ...
365 -- come out as a, b, ... (shorter, easier to read)
366 char (chr (ord 'a' + u))
367 finish_ppr tag u pp_u = char tag <> pp_u
369 showUnique :: Unique -> String
370 showUnique uniq = showSDoc (pprUnique uniq)
372 instance Outputable Unique where
375 instance Text Unique where
376 showsPrec p uniq rest = showUnique uniq
379 %************************************************************************
381 \subsection[Utils-base62]{Base-62 numbers}
383 %************************************************************************
385 A character-stingy way to read/write numbers (notably Uniques).
386 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
387 Code stolen from Lennart.
389 # define BYTE_ARRAY GlaExts.ByteArray
390 # define RUN_ST ST.runST
391 # define AND_THEN >>=
392 # define AND_THEN_ >>
393 # define RETURN return
395 iToBase62 :: Int -> SDoc
400 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
403 case (indexCharArray# bytes n#) of { c ->
406 case (quotRem n 62) of { (q, I# r#) ->
407 case (indexCharArray# bytes r#) of { c ->
408 (<>) (iToBase62 q) (char (C# c)) }}
410 -- keep this at top level! (bug on 94/10/24 WDP)
411 chars62 :: BYTE_ARRAY Int
414 newCharArray (0, 61) AND_THEN \ ch_array ->
415 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
417 unsafeFreezeByteArray ch_array
420 fill_in ch_array i lim str
424 = writeCharArray ch_array i (str !! i) AND_THEN_
425 fill_in ch_array (i+1) lim str
428 %************************************************************************
430 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
432 %************************************************************************
434 Allocation of unique supply characters:
435 v,t,u : for renumbering value-, type- and usage- vars.
436 other a-z: lower case chars for unique supplies (see Main.lhs)
438 C-E: pseudo uniques (used in native-code generator)
439 _: unifiable tyvars (above)
440 1-8: prelude things below
443 mkAlphaTyVarUnique i = mkUnique '1' i
445 mkPreludeClassUnique i = mkUnique '2' i
446 mkPreludeTyConUnique i = mkUnique '3' i
447 mkTupleTyConUnique a = mkUnique '4' a
449 mkPreludeDataConUnique i = mkUnique '5' i -- must be alphabetic
450 mkTupleDataConUnique a = mkUnique '6' a -- ditto (*may* be used in C labels)
452 mkPrimOpIdUnique op = mkUnique '7' op
453 mkPreludeMiscIdUnique i = mkUnique '8' i
455 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
456 -- See pprUnique for details
458 initTyVarUnique :: Unique
459 initTyVarUnique = mkUnique 't' 0
461 mkTyVarUnique :: Int -> Unique
462 mkTyVarUnique n = mkUnique 't' n
464 initTidyUniques :: (Unique, Unique) -- Global and local
465 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
467 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
468 mkBuiltinUnique :: Int -> Unique
470 mkBuiltinUnique i = mkUnique 'B' i
471 mkPseudoUnique1 i = mkUnique 'C' i -- used for uniqueOf on Regs
472 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
473 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
475 getBuiltinUniques :: Int -> [Unique]
476 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
479 %************************************************************************
481 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
483 %************************************************************************
486 boundedClassKey = mkPreludeClassUnique 1
487 enumClassKey = mkPreludeClassUnique 2
488 eqClassKey = mkPreludeClassUnique 3
489 evalClassKey = mkPreludeClassUnique 4
490 floatingClassKey = mkPreludeClassUnique 5
491 fractionalClassKey = mkPreludeClassUnique 6
492 integralClassKey = mkPreludeClassUnique 7
493 monadClassKey = mkPreludeClassUnique 8
494 monadZeroClassKey = mkPreludeClassUnique 9
495 monadPlusClassKey = mkPreludeClassUnique 10
496 functorClassKey = mkPreludeClassUnique 11
497 numClassKey = mkPreludeClassUnique 12
498 ordClassKey = mkPreludeClassUnique 13
499 readClassKey = mkPreludeClassUnique 14
500 realClassKey = mkPreludeClassUnique 15
501 realFloatClassKey = mkPreludeClassUnique 16
502 realFracClassKey = mkPreludeClassUnique 17
503 showClassKey = mkPreludeClassUnique 18
505 cCallableClassKey = mkPreludeClassUnique 19
506 cReturnableClassKey = mkPreludeClassUnique 20
508 ixClassKey = mkPreludeClassUnique 21
509 allClassKey = mkPreludeClassUnique 22 -- Pseudo class used for universal quantification
512 %************************************************************************
514 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
516 %************************************************************************
519 addrPrimTyConKey = mkPreludeTyConUnique 1
520 addrTyConKey = mkPreludeTyConUnique 2
521 arrayPrimTyConKey = mkPreludeTyConUnique 3
522 boolTyConKey = mkPreludeTyConUnique 4
523 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
524 charPrimTyConKey = mkPreludeTyConUnique 7
525 charTyConKey = mkPreludeTyConUnique 8
526 doublePrimTyConKey = mkPreludeTyConUnique 9
527 doubleTyConKey = mkPreludeTyConUnique 10
528 floatPrimTyConKey = mkPreludeTyConUnique 11
529 floatTyConKey = mkPreludeTyConUnique 12
530 funTyConKey = mkPreludeTyConUnique 13
531 intPrimTyConKey = mkPreludeTyConUnique 14
532 intTyConKey = mkPreludeTyConUnique 15
533 integerTyConKey = mkPreludeTyConUnique 16
534 liftTyConKey = mkPreludeTyConUnique 17
535 listTyConKey = mkPreludeTyConUnique 18
536 foreignObjPrimTyConKey = mkPreludeTyConUnique 19
537 foreignObjTyConKey = mkPreludeTyConUnique 20
538 mutableArrayPrimTyConKey = mkPreludeTyConUnique 21
539 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 22
540 orderingTyConKey = mkPreludeTyConUnique 23
541 synchVarPrimTyConKey = mkPreludeTyConUnique 24
542 ratioTyConKey = mkPreludeTyConUnique 25
543 rationalTyConKey = mkPreludeTyConUnique 26
544 realWorldTyConKey = mkPreludeTyConUnique 27
545 return2GMPsTyConKey = mkPreludeTyConUnique 28
546 returnIntAndGMPTyConKey = mkPreludeTyConUnique 29
547 stablePtrPrimTyConKey = mkPreludeTyConUnique 30
548 stablePtrTyConKey = mkPreludeTyConUnique 31
549 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 32
550 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 33
551 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 34
552 stateAndCharPrimTyConKey = mkPreludeTyConUnique 35
553 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 36
554 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 37
555 stateAndIntPrimTyConKey = mkPreludeTyConUnique 38
556 stateAndForeignObjPrimTyConKey = mkPreludeTyConUnique 39
557 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 40
558 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 41
559 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 42
560 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 43
561 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 44
562 stateAndWordPrimTyConKey = mkPreludeTyConUnique 45
563 statePrimTyConKey = mkPreludeTyConUnique 46
564 stateTyConKey = mkPreludeTyConUnique 47
565 mutableByteArrayTyConKey = mkPreludeTyConUnique 48
566 stTyConKey = mkPreludeTyConUnique 49
567 stRetTyConKey = mkPreludeTyConUnique 50
568 ioTyConKey = mkPreludeTyConUnique 51
569 ioResultTyConKey = mkPreludeTyConUnique 52
570 byteArrayTyConKey = mkPreludeTyConUnique 53
571 wordPrimTyConKey = mkPreludeTyConUnique 54
572 wordTyConKey = mkPreludeTyConUnique 55
573 voidTyConKey = mkPreludeTyConUnique 56
576 %************************************************************************
578 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
580 %************************************************************************
583 addrDataConKey = mkPreludeDataConUnique 1
584 buildDataConKey = mkPreludeDataConUnique 2
585 charDataConKey = mkPreludeDataConUnique 4
586 consDataConKey = mkPreludeDataConUnique 5
587 doubleDataConKey = mkPreludeDataConUnique 6
588 eqDataConKey = mkPreludeDataConUnique 7
589 falseDataConKey = mkPreludeDataConUnique 8
590 floatDataConKey = mkPreludeDataConUnique 9
591 gtDataConKey = mkPreludeDataConUnique 10
592 intDataConKey = mkPreludeDataConUnique 11
593 integerDataConKey = mkPreludeDataConUnique 12
594 liftDataConKey = mkPreludeDataConUnique 13
595 ltDataConKey = mkPreludeDataConUnique 14
596 foreignObjDataConKey = mkPreludeDataConUnique 15
597 nilDataConKey = mkPreludeDataConUnique 18
598 ratioDataConKey = mkPreludeDataConUnique 21
599 return2GMPsDataConKey = mkPreludeDataConUnique 22
600 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
601 stablePtrDataConKey = mkPreludeDataConUnique 24
602 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
603 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
604 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
605 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
606 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
607 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
608 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
609 stateAndForeignObjPrimDataConKey = mkPreludeDataConUnique 32
610 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
611 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
612 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
613 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
614 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
615 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
616 stateDataConKey = mkPreludeDataConUnique 39
617 trueDataConKey = mkPreludeDataConUnique 40
618 wordDataConKey = mkPreludeDataConUnique 41
619 stDataConKey = mkPreludeDataConUnique 42
620 stRetDataConKey = mkPreludeDataConUnique 43
621 ioDataConKey = mkPreludeDataConUnique 44
622 ioOkDataConKey = mkPreludeDataConUnique 45
623 ioFailDataConKey = mkPreludeDataConUnique 46
626 %************************************************************************
628 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
630 %************************************************************************
633 absentErrorIdKey = mkPreludeMiscIdUnique 1
634 andandIdKey = mkPreludeMiscIdUnique 2
635 appendIdKey = mkPreludeMiscIdUnique 3
636 augmentIdKey = mkPreludeMiscIdUnique 4
637 buildIdKey = mkPreludeMiscIdUnique 5
638 composeIdKey = mkPreludeMiscIdUnique 6
639 errorIdKey = mkPreludeMiscIdUnique 7
640 foldlIdKey = mkPreludeMiscIdUnique 8
641 foldrIdKey = mkPreludeMiscIdUnique 9
642 forkIdKey = mkPreludeMiscIdUnique 10
643 recSelErrIdKey = mkPreludeMiscIdUnique 11
644 integerMinusOneIdKey = mkPreludeMiscIdUnique 12
645 integerPlusOneIdKey = mkPreludeMiscIdUnique 13
646 integerPlusTwoIdKey = mkPreludeMiscIdUnique 14
647 integerZeroIdKey = mkPreludeMiscIdUnique 15
648 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 16
649 lexIdKey = mkPreludeMiscIdUnique 17
650 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 20
651 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 21
652 notIdKey = mkPreludeMiscIdUnique 22
653 packCStringIdKey = mkPreludeMiscIdUnique 23
654 parErrorIdKey = mkPreludeMiscIdUnique 24
655 parIdKey = mkPreludeMiscIdUnique 25
656 patErrorIdKey = mkPreludeMiscIdUnique 26
657 readParenIdKey = mkPreludeMiscIdUnique 27
658 realWorldPrimIdKey = mkPreludeMiscIdUnique 28
659 recConErrorIdKey = mkPreludeMiscIdUnique 29
660 recUpdErrorIdKey = mkPreludeMiscIdUnique 30
661 seqIdKey = mkPreludeMiscIdUnique 31
662 showParenIdKey = mkPreludeMiscIdUnique 32
663 showSpaceIdKey = mkPreludeMiscIdUnique 33
664 showStringIdKey = mkPreludeMiscIdUnique 34
665 traceIdKey = mkPreludeMiscIdUnique 35
666 unpackCString2IdKey = mkPreludeMiscIdUnique 36
667 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 37
668 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 38
669 unpackCStringIdKey = mkPreludeMiscIdUnique 39
670 unsafeCoerceIdKey = mkPreludeMiscIdUnique 40
671 voidIdKey = mkPreludeMiscIdUnique 41
672 ushowListIdKey = mkPreludeMiscIdUnique 42
673 ureadListIdKey = mkPreludeMiscIdUnique 43
675 copyableIdKey = mkPreludeMiscIdUnique 44
676 noFollowIdKey = mkPreludeMiscIdUnique 45
677 parAtAbsIdKey = mkPreludeMiscIdUnique 46
678 parAtForNowIdKey = mkPreludeMiscIdUnique 47
679 parAtIdKey = mkPreludeMiscIdUnique 48
680 parAtRelIdKey = mkPreludeMiscIdUnique 49
681 parGlobalIdKey = mkPreludeMiscIdUnique 50
682 parLocalIdKey = mkPreludeMiscIdUnique 51
685 Certain class operations from Prelude classes. They get
686 their own uniques so we can look them up easily when we want
687 to conjure them up during type checking.
689 fromIntClassOpKey = mkPreludeMiscIdUnique 52
690 fromIntegerClassOpKey = mkPreludeMiscIdUnique 53
691 minusClassOpKey = mkPreludeMiscIdUnique 54
692 fromRationalClassOpKey = mkPreludeMiscIdUnique 55
693 enumFromClassOpKey = mkPreludeMiscIdUnique 56
694 enumFromThenClassOpKey = mkPreludeMiscIdUnique 57
695 enumFromToClassOpKey = mkPreludeMiscIdUnique 58
696 enumFromThenToClassOpKey= mkPreludeMiscIdUnique 59
697 eqClassOpKey = mkPreludeMiscIdUnique 50
698 geClassOpKey = mkPreludeMiscIdUnique 61
699 zeroClassOpKey = mkPreludeMiscIdUnique 62
700 thenMClassOpKey = mkPreludeMiscIdUnique 63 -- (>>=)
701 unboundKey = mkPreludeMiscIdUnique 64 -- Just a place holder for unbound
702 -- variables produced by the renamer
703 fromEnumClassOpKey = mkPreludeMiscIdUnique 65
705 mainKey = mkPreludeMiscIdUnique 66
706 returnMClassOpKey = mkPreludeMiscIdUnique 67
707 otherwiseIdKey = mkPreludeMiscIdUnique 68
708 toEnumClassOpKey = mkPreludeMiscIdUnique 69
712 inlineIdKey = mkPreludeMiscIdUnique 70
713 coerceIdKey = mkPreludeMiscIdUnique 71
714 assertIdKey = mkPreludeMiscIdUnique 72