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
29 deriveUnique, -- Ditto
33 -- now all the built-in Uniques (and functions to make them)
34 -- [the Oh-So-Wonderful Haskell module system wins again...]
38 mkUbxTupleDataConUnique,
40 mkUbxTupleTyConUnique,
42 getBuiltinUniques, mkBuiltinUnique,
43 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
45 absentErrorIdKey, -- alphabetical...
58 byteArrayPrimTyConKey,
73 enumFromThenClassOpKey,
74 enumFromThenToClassOpKey,
89 foreignObjPrimTyConKey,
94 fromIntegerClassOpKey,
95 fromRationalClassOpKey,
108 smallIntegerDataConKey,
109 largeIntegerDataConKey,
110 integerMinusOneIdKey,
118 irrefutPatErrorIdKey,
127 mutableArrayPrimTyConKey,
128 mutableByteArrayPrimTyConKey,
129 mutableByteArrayTyConKey,
132 noMethodBindingErrorIdKey,
133 nonExhaustiveGuardsErrorIdKey,
161 stablePtrPrimTyConKey,
163 stableNameDataConKey,
164 stableNamePrimTyConKey,
173 threadIdPrimTyConKey,
180 unpackCStringAppendIdKey,
181 unpackCStringFoldrIdKey,
197 #include "HsVersions.h"
199 import FastString ( FastString, uniqueOfFS )
202 import PrelBase ( Char(..), chr, ord )
207 %************************************************************************
209 \subsection[Unique-type]{@Unique@ type and operations}
211 %************************************************************************
213 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
214 Fast comparison is everything on @Uniques@:
217 data Unique = MkUnique Int#
221 u2i :: Unique -> FAST_INT
225 Now come the functions which construct uniques from their pieces, and vice versa.
226 The stuff about unique *supplies* is handled further down this module.
229 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
230 unpkUnique :: Unique -> (Char, Int) -- The reverse
232 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
234 getKey :: Unique -> Int# -- for Var
236 incrUnique :: Unique -> Unique
237 deriveUnique :: Unique -> Int -> Unique
242 mkUniqueGrimily x = MkUnique x
244 {-# INLINE getKey #-}
245 getKey (MkUnique x) = x
247 incrUnique (MkUnique i) = MkUnique (i +# 1#)
249 -- deriveUnique uses an 'X' tag so that it won't clash with
250 -- any of the uniques produced any other way
251 deriveUnique (MkUnique i) delta = mkUnique 'X' (I# i + delta)
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 (tag `or#` bits))
264 tag = i2w (ord# c) `shiftL#` i2w_s 24#
265 bits = i2w i `and#` (i2w 16777215#){-``0x00ffffff''-}
267 unpkUnique (MkUnique u)
269 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
270 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
274 shiftr x y = shiftRL# x y
279 %************************************************************************
281 \subsection[Uniquable-class]{The @Uniquable@ class}
283 %************************************************************************
286 class Uniquable a where
287 getUnique :: a -> Unique
289 instance Uniquable FastString where
290 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
292 instance Uniquable Int where
293 getUnique (I# i#) = mkUniqueGrimily i#
297 %************************************************************************
299 \subsection[Unique-instances]{Instance declarations for @Unique@}
301 %************************************************************************
303 And the whole point (besides uniqueness) is fast equality. We don't
304 use `deriving' because we want {\em precise} control of ordering
305 (equality on @Uniques@ is v common).
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
315 instance Eq Unique where
316 a == b = eqUnique a b
317 a /= b = not (eqUnique a b)
319 instance Ord Unique where
321 a <= b = leUnique a b
322 a > b = not (leUnique a b)
323 a >= b = not (ltUnique a b)
324 compare a b = cmpUnique a b
327 instance Uniquable Unique where
331 We do sometimes make strings with @Uniques@ in them:
333 pprUnique, pprUnique10 :: Unique -> SDoc
336 = case unpkUnique uniq of
337 (tag, u) -> finish_ppr tag u (iToBase62 u)
339 pprUnique10 uniq -- in base-10, dudes
340 = case unpkUnique uniq of
341 (tag, u) -> finish_ppr tag u (int u)
343 finish_ppr 't' u pp_u | u < 26
344 = -- Special case to make v common tyvars, t1, t2, ...
345 -- come out as a, b, ... (shorter, easier to read)
346 char (chr (ord 'a' + u))
347 finish_ppr tag u pp_u = char tag <> pp_u
349 instance Outputable Unique where
352 instance Show Unique where
353 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
356 %************************************************************************
358 \subsection[Utils-base62]{Base-62 numbers}
360 %************************************************************************
362 A character-stingy way to read/write numbers (notably Uniques).
363 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
364 Code stolen from Lennart.
366 # define BYTE_ARRAY GlaExts.ByteArray
367 # define RUN_ST ST.runST
368 # define AND_THEN >>=
369 # define AND_THEN_ >>
370 # define RETURN return
372 iToBase62 :: Int -> SDoc
377 #if __GLASGOW_HASKELL__ < 405
378 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
380 bytes = case chars62 of { BYTE_ARRAY _ _ bytes -> bytes }
384 case (indexCharArray# bytes n#) of { c ->
387 case (quotRem n 62) of { (q, I# r#) ->
388 case (indexCharArray# bytes r#) of { c ->
389 (<>) (iToBase62 q) (char (C# c)) }}
391 -- keep this at top level! (bug on 94/10/24 WDP)
392 chars62 :: BYTE_ARRAY Int
395 newCharArray (0, 61) AND_THEN \ ch_array ->
396 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
398 unsafeFreezeByteArray ch_array
401 fill_in ch_array i lim str
405 = writeCharArray ch_array i (str !! i) AND_THEN_
406 fill_in ch_array (i+1) lim str
409 %************************************************************************
411 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
413 %************************************************************************
415 Allocation of unique supply characters:
416 v,t,u : for renumbering value-, type- and usage- vars.
417 other a-z: lower case chars for unique supplies (see Main.lhs)
419 C-E: pseudo uniques (used in native-code generator)
420 X: uniques derived by deriveUnique
421 _: unifiable tyvars (above)
422 0-9: prelude things below
425 mkAlphaTyVarUnique i = mkUnique '1' i
427 mkPreludeClassUnique i = mkUnique '2' i
428 mkPreludeTyConUnique i = mkUnique '3' i
429 mkTupleTyConUnique a = mkUnique '4' a
430 mkUbxTupleTyConUnique a = mkUnique '5' a
432 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
433 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
434 mkUbxTupleDataConUnique a = mkUnique '8' a
436 mkPrimOpIdUnique op = mkUnique '9' op
437 mkPreludeMiscIdUnique i = mkUnique '0' i
439 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
440 -- See pprUnique for details
442 initTyVarUnique :: Unique
443 initTyVarUnique = mkUnique 't' 0
445 initTidyUniques :: (Unique, Unique) -- Global and local
446 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
448 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
449 mkBuiltinUnique :: Int -> Unique
451 mkBuiltinUnique i = mkUnique 'B' i
452 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
453 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
454 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
456 getBuiltinUniques :: Int -> [Unique]
457 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
460 %************************************************************************
462 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
464 %************************************************************************
467 boundedClassKey = mkPreludeClassUnique 1
468 enumClassKey = mkPreludeClassUnique 2
469 eqClassKey = mkPreludeClassUnique 3
470 floatingClassKey = mkPreludeClassUnique 5
471 fractionalClassKey = mkPreludeClassUnique 6
472 integralClassKey = mkPreludeClassUnique 7
473 monadClassKey = mkPreludeClassUnique 8
474 monadPlusClassKey = mkPreludeClassUnique 9
475 functorClassKey = mkPreludeClassUnique 10
476 numClassKey = mkPreludeClassUnique 11
477 ordClassKey = mkPreludeClassUnique 12
478 readClassKey = mkPreludeClassUnique 13
479 realClassKey = mkPreludeClassUnique 14
480 realFloatClassKey = mkPreludeClassUnique 15
481 realFracClassKey = mkPreludeClassUnique 16
482 showClassKey = mkPreludeClassUnique 17
484 cCallableClassKey = mkPreludeClassUnique 18
485 cReturnableClassKey = mkPreludeClassUnique 19
487 ixClassKey = mkPreludeClassUnique 20
490 %************************************************************************
492 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
494 %************************************************************************
497 addrPrimTyConKey = mkPreludeTyConUnique 1
498 addrTyConKey = mkPreludeTyConUnique 2
499 arrayPrimTyConKey = mkPreludeTyConUnique 3
500 boolTyConKey = mkPreludeTyConUnique 4
501 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
502 charPrimTyConKey = mkPreludeTyConUnique 7
503 charTyConKey = mkPreludeTyConUnique 8
504 doublePrimTyConKey = mkPreludeTyConUnique 9
505 doubleTyConKey = mkPreludeTyConUnique 10
506 floatPrimTyConKey = mkPreludeTyConUnique 11
507 floatTyConKey = mkPreludeTyConUnique 12
508 funTyConKey = mkPreludeTyConUnique 13
509 intPrimTyConKey = mkPreludeTyConUnique 14
510 intTyConKey = mkPreludeTyConUnique 15
511 int8TyConKey = mkPreludeTyConUnique 16
512 int16TyConKey = mkPreludeTyConUnique 17
513 int32TyConKey = mkPreludeTyConUnique 18
514 int64PrimTyConKey = mkPreludeTyConUnique 19
515 int64TyConKey = mkPreludeTyConUnique 20
516 integerTyConKey = mkPreludeTyConUnique 21
517 listTyConKey = mkPreludeTyConUnique 22
518 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
519 foreignObjTyConKey = mkPreludeTyConUnique 24
520 weakPrimTyConKey = mkPreludeTyConUnique 25
521 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
522 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
523 orderingTyConKey = mkPreludeTyConUnique 28
524 mVarPrimTyConKey = mkPreludeTyConUnique 29
525 ratioTyConKey = mkPreludeTyConUnique 30
526 rationalTyConKey = mkPreludeTyConUnique 31
527 realWorldTyConKey = mkPreludeTyConUnique 32
528 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
529 stablePtrTyConKey = mkPreludeTyConUnique 34
530 statePrimTyConKey = mkPreludeTyConUnique 35
531 stableNamePrimTyConKey = mkPreludeTyConUnique 50
532 stableNameTyConKey = mkPreludeTyConUnique 51
533 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
534 mutVarPrimTyConKey = mkPreludeTyConUnique 53
535 ioTyConKey = mkPreludeTyConUnique 55
536 byteArrayTyConKey = mkPreludeTyConUnique 56
537 wordPrimTyConKey = mkPreludeTyConUnique 57
538 wordTyConKey = mkPreludeTyConUnique 58
539 word8TyConKey = mkPreludeTyConUnique 59
540 word16TyConKey = mkPreludeTyConUnique 60
541 word32TyConKey = mkPreludeTyConUnique 61
542 word64PrimTyConKey = mkPreludeTyConUnique 62
543 word64TyConKey = mkPreludeTyConUnique 63
544 boxedConKey = mkPreludeTyConUnique 64
545 unboxedConKey = mkPreludeTyConUnique 65
546 anyBoxConKey = mkPreludeTyConUnique 66
547 kindConKey = mkPreludeTyConUnique 67
548 boxityConKey = mkPreludeTyConUnique 68
549 typeConKey = mkPreludeTyConUnique 69
550 threadIdPrimTyConKey = mkPreludeTyConUnique 70
553 %************************************************************************
555 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
557 %************************************************************************
560 addrDataConKey = mkPreludeDataConUnique 1
561 charDataConKey = mkPreludeDataConUnique 2
562 consDataConKey = mkPreludeDataConUnique 3
563 doubleDataConKey = mkPreludeDataConUnique 4
564 falseDataConKey = mkPreludeDataConUnique 5
565 floatDataConKey = mkPreludeDataConUnique 6
566 intDataConKey = mkPreludeDataConUnique 7
567 smallIntegerDataConKey = mkPreludeDataConUnique 12
568 largeIntegerDataConKey = mkPreludeDataConUnique 13
569 foreignObjDataConKey = mkPreludeDataConUnique 14
570 nilDataConKey = mkPreludeDataConUnique 15
571 ratioDataConKey = mkPreludeDataConUnique 16
572 stablePtrDataConKey = mkPreludeDataConUnique 17
573 stableNameDataConKey = mkPreludeDataConUnique 18
574 trueDataConKey = mkPreludeDataConUnique 34
575 wordDataConKey = mkPreludeDataConUnique 35
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
625 getTagIdKey = mkPreludeMiscIdUnique 39
628 Certain class operations from Prelude classes. They get their own
629 uniques so we can look them up easily when we want to conjure them up
630 during type checking.
633 fromIntClassOpKey = mkPreludeMiscIdUnique 101
634 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
635 minusClassOpKey = mkPreludeMiscIdUnique 103
636 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
637 enumFromClassOpKey = mkPreludeMiscIdUnique 105
638 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
639 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
640 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
641 eqClassOpKey = mkPreludeMiscIdUnique 109
642 geClassOpKey = mkPreludeMiscIdUnique 110
643 failMClassOpKey = mkPreludeMiscIdUnique 112
644 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
645 -- Just a place holder for unbound variables produced by the renamer:
646 unboundKey = mkPreludeMiscIdUnique 114
647 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
649 mainKey = mkPreludeMiscIdUnique 116
650 returnMClassOpKey = mkPreludeMiscIdUnique 117
651 otherwiseIdKey = mkPreludeMiscIdUnique 118
652 toEnumClassOpKey = mkPreludeMiscIdUnique 119
653 mapIdKey = mkPreludeMiscIdUnique 120
657 assertIdKey = mkPreludeMiscIdUnique 121
658 runSTRepIdKey = mkPreludeMiscIdUnique 122