2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
6 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
7 comparison key in the compiler.
9 If there is any single operation that needs to be fast, it is @Unique@
10 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
13 Some of the other hair in this code is to be able to use a
14 ``splittable @UniqueSupply@'' if requested/possible (not standard
19 Unique, Uniquable(..),
20 u2i, -- hack: used in UniqFM
22 pprUnique, pprUnique10,
24 mkUnique, -- Used in UniqSupply
25 mkUniqueGrimily, -- Used in UniqSupply only!
26 getKey, -- Used in Var only!
28 incrUnique, -- Used for renumbering
32 -- now all the built-in Uniques (and functions to make them)
33 -- [the Oh-So-Wonderful Haskell module system wins again...]
37 mkUbxTupleDataConUnique,
39 mkUbxTupleTyConUnique,
41 getBuiltinUniques, mkBuiltinUnique,
42 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
44 absentErrorIdKey, -- alphabetical...
57 byteArrayPrimTyConKey,
72 enumFromThenClassOpKey,
73 enumFromThenToClassOpKey,
88 foreignObjPrimTyConKey,
93 fromIntegerClassOpKey,
94 fromRationalClassOpKey,
110 smallIntegerDataConKey,
111 largeIntegerDataConKey,
112 integerMinusOneIdKey,
120 irrefutPatErrorIdKey,
129 mutableArrayPrimTyConKey,
130 mutableByteArrayPrimTyConKey,
131 mutableByteArrayTyConKey,
134 noMethodBindingErrorIdKey,
135 nonExhaustiveGuardsErrorIdKey,
162 stablePtrPrimTyConKey,
164 stableNameDataConKey,
165 stableNamePrimTyConKey,
174 threadIdPrimTyConKey,
181 unpackCStringAppendIdKey,
182 unpackCStringFoldrIdKey,
202 #include "HsVersions.h"
204 import FastString ( FastString, uniqueOfFS )
207 import PrelBase ( Char(..), chr, ord )
212 %************************************************************************
214 \subsection[Unique-type]{@Unique@ type and operations}
216 %************************************************************************
218 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
219 Fast comparison is everything on @Uniques@:
222 data Unique = MkUnique Int#
226 u2i :: Unique -> FAST_INT
230 Now come the functions which construct uniques from their pieces, and vice versa.
231 The stuff about unique *supplies* is handled further down this module.
234 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
235 unpkUnique :: Unique -> (Char, Int) -- The reverse
237 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
239 getKey :: Unique -> Int# -- for Var
241 incrUnique :: Unique -> Unique
246 mkUniqueGrimily x = MkUnique x
248 {-# INLINE getKey #-}
249 getKey (MkUnique x) = x
251 incrUnique (MkUnique i) = MkUnique (i +# 1#)
253 -- pop the Char in the top 8 bits of the Unique(Supply)
255 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
261 mkUnique (C# c) (I# i)
262 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
264 unpkUnique (MkUnique u)
266 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
267 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
271 shiftr x y = shiftRL# x y
276 %************************************************************************
278 \subsection[Uniquable-class]{The @Uniquable@ class}
280 %************************************************************************
283 class Uniquable a where
284 getUnique :: a -> Unique
286 instance Uniquable FastString where
287 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
289 instance Uniquable Int where
290 getUnique (I# i#) = mkUniqueGrimily i#
294 %************************************************************************
296 \subsection[Unique-instances]{Instance declarations for @Unique@}
298 %************************************************************************
300 And the whole point (besides uniqueness) is fast equality. We don't
301 use `deriving' because we want {\em precise} control of ordering
302 (equality on @Uniques@ is v common).
305 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
306 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
307 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
309 cmpUnique (MkUnique u1) (MkUnique u2)
310 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
312 instance Eq Unique where
313 a == b = eqUnique a b
314 a /= b = not (eqUnique a b)
316 instance Ord Unique where
318 a <= b = leUnique a b
319 a > b = not (leUnique a b)
320 a >= b = not (ltUnique a b)
321 compare a b = cmpUnique a b
324 instance Uniquable Unique where
328 We do sometimes make strings with @Uniques@ in them:
330 pprUnique, pprUnique10 :: Unique -> SDoc
333 = case unpkUnique uniq of
334 (tag, u) -> finish_ppr tag u (iToBase62 u)
336 pprUnique10 uniq -- in base-10, dudes
337 = case unpkUnique uniq of
338 (tag, u) -> finish_ppr tag u (int u)
340 finish_ppr 't' u pp_u | u < 26
341 = -- Special case to make v common tyvars, t1, t2, ...
342 -- come out as a, b, ... (shorter, easier to read)
343 char (chr (ord 'a' + u))
344 finish_ppr tag u pp_u = char tag <> pp_u
346 instance Outputable Unique where
349 instance Show Unique where
350 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
353 %************************************************************************
355 \subsection[Utils-base62]{Base-62 numbers}
357 %************************************************************************
359 A character-stingy way to read/write numbers (notably Uniques).
360 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
361 Code stolen from Lennart.
363 # define BYTE_ARRAY GlaExts.ByteArray
364 # define RUN_ST ST.runST
365 # define AND_THEN >>=
366 # define AND_THEN_ >>
367 # define RETURN return
369 iToBase62 :: Int -> SDoc
374 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
377 case (indexCharArray# bytes n#) of { c ->
380 case (quotRem n 62) of { (q, I# r#) ->
381 case (indexCharArray# bytes r#) of { c ->
382 (<>) (iToBase62 q) (char (C# c)) }}
384 -- keep this at top level! (bug on 94/10/24 WDP)
385 chars62 :: BYTE_ARRAY Int
388 newCharArray (0, 61) AND_THEN \ ch_array ->
389 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
391 unsafeFreezeByteArray ch_array
394 fill_in ch_array i lim str
398 = writeCharArray ch_array i (str !! i) AND_THEN_
399 fill_in ch_array (i+1) lim str
402 %************************************************************************
404 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
406 %************************************************************************
408 Allocation of unique supply characters:
409 v,t,u : for renumbering value-, type- and usage- vars.
410 other a-z: lower case chars for unique supplies (see Main.lhs)
412 C-E: pseudo uniques (used in native-code generator)
413 _: unifiable tyvars (above)
414 0-9: prelude things below
417 mkAlphaTyVarUnique i = mkUnique '1' i
419 mkPreludeClassUnique i = mkUnique '2' i
420 mkPreludeTyConUnique i = mkUnique '3' i
421 mkTupleTyConUnique a = mkUnique '4' a
422 mkUbxTupleTyConUnique a = mkUnique '5' a
424 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
425 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
426 mkUbxTupleDataConUnique a = mkUnique '8' a
428 mkPrimOpIdUnique op = mkUnique '9' op
429 mkPreludeMiscIdUnique i = mkUnique '0' i
431 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
432 -- See pprUnique for details
434 initTyVarUnique :: Unique
435 initTyVarUnique = mkUnique 't' 0
437 initTidyUniques :: (Unique, Unique) -- Global and local
438 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
440 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
441 mkBuiltinUnique :: Int -> Unique
443 mkBuiltinUnique i = mkUnique 'B' i
444 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
445 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
446 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
448 getBuiltinUniques :: Int -> [Unique]
449 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
452 %************************************************************************
454 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
456 %************************************************************************
459 boundedClassKey = mkPreludeClassUnique 1
460 enumClassKey = mkPreludeClassUnique 2
461 eqClassKey = mkPreludeClassUnique 3
462 floatingClassKey = mkPreludeClassUnique 5
463 fractionalClassKey = mkPreludeClassUnique 6
464 integralClassKey = mkPreludeClassUnique 7
465 monadClassKey = mkPreludeClassUnique 8
466 monadPlusClassKey = mkPreludeClassUnique 9
467 functorClassKey = mkPreludeClassUnique 10
468 numClassKey = mkPreludeClassUnique 11
469 ordClassKey = mkPreludeClassUnique 12
470 readClassKey = mkPreludeClassUnique 13
471 realClassKey = mkPreludeClassUnique 14
472 realFloatClassKey = mkPreludeClassUnique 15
473 realFracClassKey = mkPreludeClassUnique 16
474 showClassKey = mkPreludeClassUnique 17
476 cCallableClassKey = mkPreludeClassUnique 18
477 cReturnableClassKey = mkPreludeClassUnique 19
479 ixClassKey = mkPreludeClassUnique 20
482 %************************************************************************
484 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
486 %************************************************************************
489 addrPrimTyConKey = mkPreludeTyConUnique 1
490 addrTyConKey = mkPreludeTyConUnique 2
491 arrayPrimTyConKey = mkPreludeTyConUnique 3
492 boolTyConKey = mkPreludeTyConUnique 4
493 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
494 charPrimTyConKey = mkPreludeTyConUnique 7
495 charTyConKey = mkPreludeTyConUnique 8
496 doublePrimTyConKey = mkPreludeTyConUnique 9
497 doubleTyConKey = mkPreludeTyConUnique 10
498 floatPrimTyConKey = mkPreludeTyConUnique 11
499 floatTyConKey = mkPreludeTyConUnique 12
500 funTyConKey = mkPreludeTyConUnique 13
501 intPrimTyConKey = mkPreludeTyConUnique 14
502 intTyConKey = mkPreludeTyConUnique 15
503 int8TyConKey = mkPreludeTyConUnique 16
504 int16TyConKey = mkPreludeTyConUnique 17
505 int32TyConKey = mkPreludeTyConUnique 18
506 int64PrimTyConKey = mkPreludeTyConUnique 19
507 int64TyConKey = mkPreludeTyConUnique 20
508 integerTyConKey = mkPreludeTyConUnique 21
509 listTyConKey = mkPreludeTyConUnique 22
510 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
511 foreignObjTyConKey = mkPreludeTyConUnique 24
512 weakPrimTyConKey = mkPreludeTyConUnique 25
513 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
514 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
515 orderingTyConKey = mkPreludeTyConUnique 28
516 mVarPrimTyConKey = mkPreludeTyConUnique 29
517 ratioTyConKey = mkPreludeTyConUnique 30
518 rationalTyConKey = mkPreludeTyConUnique 31
519 realWorldTyConKey = mkPreludeTyConUnique 32
520 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
521 stablePtrTyConKey = mkPreludeTyConUnique 34
522 statePrimTyConKey = mkPreludeTyConUnique 35
523 stableNamePrimTyConKey = mkPreludeTyConUnique 50
524 stableNameTyConKey = mkPreludeTyConUnique 51
525 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
526 mutVarPrimTyConKey = mkPreludeTyConUnique 53
527 ioTyConKey = mkPreludeTyConUnique 55
528 byteArrayTyConKey = mkPreludeTyConUnique 56
529 wordPrimTyConKey = mkPreludeTyConUnique 57
530 wordTyConKey = mkPreludeTyConUnique 58
531 word8TyConKey = mkPreludeTyConUnique 59
532 word16TyConKey = mkPreludeTyConUnique 60
533 word32TyConKey = mkPreludeTyConUnique 61
534 word64PrimTyConKey = mkPreludeTyConUnique 62
535 word64TyConKey = mkPreludeTyConUnique 63
536 boxedConKey = mkPreludeTyConUnique 64
537 unboxedConKey = mkPreludeTyConUnique 65
538 anyBoxConKey = mkPreludeTyConUnique 66
539 kindConKey = mkPreludeTyConUnique 67
540 boxityConKey = mkPreludeTyConUnique 68
541 typeConKey = mkPreludeTyConUnique 69
542 threadIdPrimTyConKey = mkPreludeTyConUnique 70
545 %************************************************************************
547 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
549 %************************************************************************
552 addrDataConKey = mkPreludeDataConUnique 1
553 charDataConKey = mkPreludeDataConUnique 2
554 consDataConKey = mkPreludeDataConUnique 3
555 doubleDataConKey = mkPreludeDataConUnique 4
556 falseDataConKey = mkPreludeDataConUnique 5
557 floatDataConKey = mkPreludeDataConUnique 6
558 intDataConKey = mkPreludeDataConUnique 7
559 int8DataConKey = mkPreludeDataConUnique 8
560 int16DataConKey = mkPreludeDataConUnique 9
561 int32DataConKey = mkPreludeDataConUnique 10
562 int64DataConKey = mkPreludeDataConUnique 11
563 smallIntegerDataConKey = mkPreludeDataConUnique 12
564 largeIntegerDataConKey = mkPreludeDataConUnique 13
565 foreignObjDataConKey = mkPreludeDataConUnique 14
566 nilDataConKey = mkPreludeDataConUnique 15
567 ratioDataConKey = mkPreludeDataConUnique 16
568 stablePtrDataConKey = mkPreludeDataConUnique 17
569 stableNameDataConKey = mkPreludeDataConUnique 18
570 trueDataConKey = mkPreludeDataConUnique 34
571 wordDataConKey = mkPreludeDataConUnique 35
572 word8DataConKey = mkPreludeDataConUnique 36
573 word16DataConKey = mkPreludeDataConUnique 37
574 word32DataConKey = mkPreludeDataConUnique 38
575 word64DataConKey = mkPreludeDataConUnique 39
576 stDataConKey = mkPreludeDataConUnique 40
577 ioDataConKey = mkPreludeDataConUnique 42
580 %************************************************************************
582 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
584 %************************************************************************
587 absentErrorIdKey = mkPreludeMiscIdUnique 1
588 appendIdKey = mkPreludeMiscIdUnique 2
589 augmentIdKey = mkPreludeMiscIdUnique 3
590 buildIdKey = mkPreludeMiscIdUnique 4
591 errorIdKey = mkPreludeMiscIdUnique 5
592 foldlIdKey = mkPreludeMiscIdUnique 6
593 foldrIdKey = mkPreludeMiscIdUnique 7
594 recSelErrIdKey = mkPreludeMiscIdUnique 8
595 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
596 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
597 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
598 integerZeroIdKey = mkPreludeMiscIdUnique 12
599 int2IntegerIdKey = mkPreludeMiscIdUnique 13
600 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
601 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
602 lexIdKey = mkPreludeMiscIdUnique 16
603 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
604 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
605 packCStringIdKey = mkPreludeMiscIdUnique 19
606 parErrorIdKey = mkPreludeMiscIdUnique 20
607 parIdKey = mkPreludeMiscIdUnique 21
608 patErrorIdKey = mkPreludeMiscIdUnique 22
609 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
610 recConErrorIdKey = mkPreludeMiscIdUnique 24
611 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
612 traceIdKey = mkPreludeMiscIdUnique 26
613 unpackCString2IdKey = mkPreludeMiscIdUnique 27
614 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
615 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
616 unpackCStringIdKey = mkPreludeMiscIdUnique 30
617 ushowListIdKey = mkPreludeMiscIdUnique 31
618 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
619 concatIdKey = mkPreludeMiscIdUnique 33
620 filterIdKey = mkPreludeMiscIdUnique 34
621 zipIdKey = mkPreludeMiscIdUnique 35
622 bindIOIdKey = mkPreludeMiscIdUnique 36
623 deRefStablePtrIdKey = mkPreludeMiscIdUnique 37
624 makeStablePtrIdKey = mkPreludeMiscIdUnique 38
627 Certain class operations from Prelude classes. They get their own
628 uniques so we can look them up easily when we want to conjure them up
629 during type checking.
632 fromIntClassOpKey = mkPreludeMiscIdUnique 101
633 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
634 minusClassOpKey = mkPreludeMiscIdUnique 103
635 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
636 enumFromClassOpKey = mkPreludeMiscIdUnique 105
637 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
638 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
639 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
640 eqClassOpKey = mkPreludeMiscIdUnique 109
641 geClassOpKey = mkPreludeMiscIdUnique 110
642 failMClassOpKey = mkPreludeMiscIdUnique 112
643 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
644 -- Just a place holder for unbound variables produced by the renamer:
645 unboundKey = mkPreludeMiscIdUnique 114
646 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
648 mainKey = mkPreludeMiscIdUnique 116
649 returnMClassOpKey = mkPreludeMiscIdUnique 117
650 otherwiseIdKey = mkPreludeMiscIdUnique 118
651 toEnumClassOpKey = mkPreludeMiscIdUnique 119
652 mapIdKey = mkPreludeMiscIdUnique 120
656 assertIdKey = mkPreludeMiscIdUnique 121