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,
111 integerMinusOneIdKey,
119 irrefutPatErrorIdKey,
128 mutableArrayPrimTyConKey,
129 mutableByteArrayPrimTyConKey,
130 mutableByteArrayTyConKey,
133 noMethodBindingErrorIdKey,
134 nonExhaustiveGuardsErrorIdKey,
161 stablePtrPrimTyConKey,
163 stableNameDataConKey,
164 stableNamePrimTyConKey,
173 threadIdPrimTyConKey,
180 unpackCStringAppendIdKey,
181 unpackCStringFoldrIdKey,
201 #include "HsVersions.h"
203 import FastString ( FastString, uniqueOfFS )
206 import PrelBase ( Char(..), chr, ord )
211 %************************************************************************
213 \subsection[Unique-type]{@Unique@ type and operations}
215 %************************************************************************
217 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
218 Fast comparison is everything on @Uniques@:
221 data Unique = MkUnique Int#
225 u2i :: Unique -> FAST_INT
229 Now come the functions which construct uniques from their pieces, and vice versa.
230 The stuff about unique *supplies* is handled further down this module.
233 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
234 unpkUnique :: Unique -> (Char, Int) -- The reverse
236 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
238 getKey :: Unique -> Int# -- for Var
240 incrUnique :: Unique -> Unique
245 mkUniqueGrimily x = MkUnique x
247 {-# INLINE getKey #-}
248 getKey (MkUnique x) = x
250 incrUnique (MkUnique i) = MkUnique (i +# 1#)
252 -- pop the Char in the top 8 bits of the Unique(Supply)
254 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
260 mkUnique (C# c) (I# i)
261 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
263 unpkUnique (MkUnique u)
265 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
266 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
270 shiftr x y = shiftRL# x y
275 %************************************************************************
277 \subsection[Uniquable-class]{The @Uniquable@ class}
279 %************************************************************************
282 class Uniquable a where
283 getUnique :: a -> Unique
285 instance Uniquable FastString where
286 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
288 instance Uniquable Int where
289 getUnique (I# i#) = mkUniqueGrimily i#
293 %************************************************************************
295 \subsection[Unique-instances]{Instance declarations for @Unique@}
297 %************************************************************************
299 And the whole point (besides uniqueness) is fast equality. We don't
300 use `deriving' because we want {\em precise} control of ordering
301 (equality on @Uniques@ is v common).
304 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
305 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
306 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
308 cmpUnique (MkUnique u1) (MkUnique u2)
309 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
311 instance Eq Unique where
312 a == b = eqUnique a b
313 a /= b = not (eqUnique a b)
315 instance Ord Unique where
317 a <= b = leUnique a b
318 a > b = not (leUnique a b)
319 a >= b = not (ltUnique a b)
320 compare a b = cmpUnique a b
323 instance Uniquable Unique where
327 We do sometimes make strings with @Uniques@ in them:
329 pprUnique, pprUnique10 :: Unique -> SDoc
332 = case unpkUnique uniq of
333 (tag, u) -> finish_ppr tag u (iToBase62 u)
335 pprUnique10 uniq -- in base-10, dudes
336 = case unpkUnique uniq of
337 (tag, u) -> finish_ppr tag u (int u)
339 finish_ppr 't' u pp_u | u < 26
340 = -- Special case to make v common tyvars, t1, t2, ...
341 -- come out as a, b, ... (shorter, easier to read)
342 char (chr (ord 'a' + u))
343 finish_ppr tag u pp_u = char tag <> pp_u
345 instance Outputable Unique where
348 instance Show Unique where
349 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
352 %************************************************************************
354 \subsection[Utils-base62]{Base-62 numbers}
356 %************************************************************************
358 A character-stingy way to read/write numbers (notably Uniques).
359 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
360 Code stolen from Lennart.
362 # define BYTE_ARRAY GlaExts.ByteArray
363 # define RUN_ST ST.runST
364 # define AND_THEN >>=
365 # define AND_THEN_ >>
366 # define RETURN return
368 iToBase62 :: Int -> SDoc
373 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
376 case (indexCharArray# bytes n#) of { c ->
379 case (quotRem n 62) of { (q, I# r#) ->
380 case (indexCharArray# bytes r#) of { c ->
381 (<>) (iToBase62 q) (char (C# c)) }}
383 -- keep this at top level! (bug on 94/10/24 WDP)
384 chars62 :: BYTE_ARRAY Int
387 newCharArray (0, 61) AND_THEN \ ch_array ->
388 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
390 unsafeFreezeByteArray ch_array
393 fill_in ch_array i lim str
397 = writeCharArray ch_array i (str !! i) AND_THEN_
398 fill_in ch_array (i+1) lim str
401 %************************************************************************
403 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
405 %************************************************************************
407 Allocation of unique supply characters:
408 v,t,u : for renumbering value-, type- and usage- vars.
409 other a-z: lower case chars for unique supplies (see Main.lhs)
411 C-E: pseudo uniques (used in native-code generator)
412 _: unifiable tyvars (above)
413 0-9: prelude things below
416 mkAlphaTyVarUnique i = mkUnique '1' i
418 mkPreludeClassUnique i = mkUnique '2' i
419 mkPreludeTyConUnique i = mkUnique '3' i
420 mkTupleTyConUnique a = mkUnique '4' a
421 mkUbxTupleTyConUnique a = mkUnique '5' a
423 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
424 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
425 mkUbxTupleDataConUnique a = mkUnique '8' a
427 mkPrimOpIdUnique op = mkUnique '9' op
428 mkPreludeMiscIdUnique i = mkUnique '0' i
430 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
431 -- See pprUnique for details
433 initTyVarUnique :: Unique
434 initTyVarUnique = mkUnique 't' 0
436 initTidyUniques :: (Unique, Unique) -- Global and local
437 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
439 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
440 mkBuiltinUnique :: Int -> Unique
442 mkBuiltinUnique i = mkUnique 'B' i
443 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
444 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
445 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
447 getBuiltinUniques :: Int -> [Unique]
448 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
451 %************************************************************************
453 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
455 %************************************************************************
458 boundedClassKey = mkPreludeClassUnique 1
459 enumClassKey = mkPreludeClassUnique 2
460 eqClassKey = mkPreludeClassUnique 3
461 floatingClassKey = mkPreludeClassUnique 5
462 fractionalClassKey = mkPreludeClassUnique 6
463 integralClassKey = mkPreludeClassUnique 7
464 monadClassKey = mkPreludeClassUnique 8
465 monadPlusClassKey = mkPreludeClassUnique 9
466 functorClassKey = mkPreludeClassUnique 10
467 numClassKey = mkPreludeClassUnique 11
468 ordClassKey = mkPreludeClassUnique 12
469 readClassKey = mkPreludeClassUnique 13
470 realClassKey = mkPreludeClassUnique 14
471 realFloatClassKey = mkPreludeClassUnique 15
472 realFracClassKey = mkPreludeClassUnique 16
473 showClassKey = mkPreludeClassUnique 17
475 cCallableClassKey = mkPreludeClassUnique 18
476 cReturnableClassKey = mkPreludeClassUnique 19
478 ixClassKey = mkPreludeClassUnique 20
481 %************************************************************************
483 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
485 %************************************************************************
488 addrPrimTyConKey = mkPreludeTyConUnique 1
489 addrTyConKey = mkPreludeTyConUnique 2
490 arrayPrimTyConKey = mkPreludeTyConUnique 3
491 boolTyConKey = mkPreludeTyConUnique 4
492 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
493 charPrimTyConKey = mkPreludeTyConUnique 7
494 charTyConKey = mkPreludeTyConUnique 8
495 doublePrimTyConKey = mkPreludeTyConUnique 9
496 doubleTyConKey = mkPreludeTyConUnique 10
497 floatPrimTyConKey = mkPreludeTyConUnique 11
498 floatTyConKey = mkPreludeTyConUnique 12
499 funTyConKey = mkPreludeTyConUnique 13
500 intPrimTyConKey = mkPreludeTyConUnique 14
501 intTyConKey = mkPreludeTyConUnique 15
502 int8TyConKey = mkPreludeTyConUnique 16
503 int16TyConKey = mkPreludeTyConUnique 17
504 int32TyConKey = mkPreludeTyConUnique 18
505 int64PrimTyConKey = mkPreludeTyConUnique 19
506 int64TyConKey = mkPreludeTyConUnique 20
507 integerTyConKey = mkPreludeTyConUnique 21
508 listTyConKey = mkPreludeTyConUnique 22
509 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
510 foreignObjTyConKey = mkPreludeTyConUnique 24
511 weakPrimTyConKey = mkPreludeTyConUnique 25
512 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
513 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
514 orderingTyConKey = mkPreludeTyConUnique 28
515 mVarPrimTyConKey = mkPreludeTyConUnique 29
516 ratioTyConKey = mkPreludeTyConUnique 30
517 rationalTyConKey = mkPreludeTyConUnique 31
518 realWorldTyConKey = mkPreludeTyConUnique 32
519 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
520 stablePtrTyConKey = mkPreludeTyConUnique 34
521 statePrimTyConKey = mkPreludeTyConUnique 35
522 stableNamePrimTyConKey = mkPreludeTyConUnique 50
523 stableNameTyConKey = mkPreludeTyConUnique 51
524 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
525 mutVarPrimTyConKey = mkPreludeTyConUnique 53
526 ioTyConKey = mkPreludeTyConUnique 55
527 byteArrayTyConKey = mkPreludeTyConUnique 56
528 wordPrimTyConKey = mkPreludeTyConUnique 57
529 wordTyConKey = mkPreludeTyConUnique 58
530 word8TyConKey = mkPreludeTyConUnique 59
531 word16TyConKey = mkPreludeTyConUnique 60
532 word32TyConKey = mkPreludeTyConUnique 61
533 word64PrimTyConKey = mkPreludeTyConUnique 62
534 word64TyConKey = mkPreludeTyConUnique 63
535 boxedConKey = mkPreludeTyConUnique 64
536 unboxedConKey = mkPreludeTyConUnique 65
537 anyBoxConKey = mkPreludeTyConUnique 66
538 kindConKey = mkPreludeTyConUnique 67
539 boxityConKey = mkPreludeTyConUnique 68
540 typeConKey = mkPreludeTyConUnique 69
541 threadIdPrimTyConKey = mkPreludeTyConUnique 70
544 %************************************************************************
546 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
548 %************************************************************************
551 addrDataConKey = mkPreludeDataConUnique 1
552 charDataConKey = mkPreludeDataConUnique 2
553 consDataConKey = mkPreludeDataConUnique 3
554 doubleDataConKey = mkPreludeDataConUnique 4
555 falseDataConKey = mkPreludeDataConUnique 5
556 floatDataConKey = mkPreludeDataConUnique 6
557 intDataConKey = mkPreludeDataConUnique 7
558 int8DataConKey = mkPreludeDataConUnique 8
559 int16DataConKey = mkPreludeDataConUnique 9
560 int32DataConKey = mkPreludeDataConUnique 10
561 int64DataConKey = mkPreludeDataConUnique 11
562 integerDataConKey = mkPreludeDataConUnique 12
563 foreignObjDataConKey = mkPreludeDataConUnique 13
564 nilDataConKey = mkPreludeDataConUnique 14
565 ratioDataConKey = mkPreludeDataConUnique 15
566 stablePtrDataConKey = mkPreludeDataConUnique 16
567 stableNameDataConKey = mkPreludeDataConUnique 17
568 trueDataConKey = mkPreludeDataConUnique 34
569 wordDataConKey = mkPreludeDataConUnique 35
570 word8DataConKey = mkPreludeDataConUnique 36
571 word16DataConKey = mkPreludeDataConUnique 37
572 word32DataConKey = mkPreludeDataConUnique 38
573 word64DataConKey = mkPreludeDataConUnique 39
574 stDataConKey = mkPreludeDataConUnique 40
575 ioDataConKey = mkPreludeDataConUnique 42
578 %************************************************************************
580 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
582 %************************************************************************
585 absentErrorIdKey = mkPreludeMiscIdUnique 1
586 appendIdKey = mkPreludeMiscIdUnique 2
587 augmentIdKey = mkPreludeMiscIdUnique 3
588 buildIdKey = mkPreludeMiscIdUnique 4
589 errorIdKey = mkPreludeMiscIdUnique 5
590 foldlIdKey = mkPreludeMiscIdUnique 6
591 foldrIdKey = mkPreludeMiscIdUnique 7
592 recSelErrIdKey = mkPreludeMiscIdUnique 8
593 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
594 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
595 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
596 integerZeroIdKey = mkPreludeMiscIdUnique 12
597 int2IntegerIdKey = mkPreludeMiscIdUnique 13
598 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
599 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
600 lexIdKey = mkPreludeMiscIdUnique 16
601 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
602 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
603 packCStringIdKey = mkPreludeMiscIdUnique 19
604 parErrorIdKey = mkPreludeMiscIdUnique 20
605 parIdKey = mkPreludeMiscIdUnique 21
606 patErrorIdKey = mkPreludeMiscIdUnique 22
607 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
608 recConErrorIdKey = mkPreludeMiscIdUnique 24
609 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
610 traceIdKey = mkPreludeMiscIdUnique 26
611 unpackCString2IdKey = mkPreludeMiscIdUnique 27
612 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
613 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
614 unpackCStringIdKey = mkPreludeMiscIdUnique 30
615 ushowListIdKey = mkPreludeMiscIdUnique 31
616 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
617 concatIdKey = mkPreludeMiscIdUnique 33
618 filterIdKey = mkPreludeMiscIdUnique 34
619 zipIdKey = mkPreludeMiscIdUnique 35
620 bindIOIdKey = mkPreludeMiscIdUnique 36
621 deRefStablePtrIdKey = mkPreludeMiscIdUnique 37
622 makeStablePtrIdKey = mkPreludeMiscIdUnique 38
625 Certain class operations from Prelude classes. They get their own
626 uniques so we can look them up easily when we want to conjure them up
627 during type checking.
630 fromIntClassOpKey = mkPreludeMiscIdUnique 101
631 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
632 minusClassOpKey = mkPreludeMiscIdUnique 103
633 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
634 enumFromClassOpKey = mkPreludeMiscIdUnique 105
635 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
636 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
637 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
638 eqClassOpKey = mkPreludeMiscIdUnique 109
639 geClassOpKey = mkPreludeMiscIdUnique 110
640 failMClassOpKey = mkPreludeMiscIdUnique 112
641 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
642 -- Just a place holder for unbound variables produced by the renamer:
643 unboundKey = mkPreludeMiscIdUnique 114
644 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
646 mainKey = mkPreludeMiscIdUnique 116
647 returnMClassOpKey = mkPreludeMiscIdUnique 117
648 otherwiseIdKey = mkPreludeMiscIdUnique 118
649 toEnumClassOpKey = mkPreludeMiscIdUnique 119
650 mapIdKey = mkPreludeMiscIdUnique 120
654 assertIdKey = mkPreludeMiscIdUnique 121