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,
107 smallIntegerDataConKey,
108 largeIntegerDataConKey,
109 integerMinusOneIdKey,
117 irrefutPatErrorIdKey,
126 mutableArrayPrimTyConKey,
127 mutableByteArrayPrimTyConKey,
128 mutableByteArrayTyConKey,
131 noMethodBindingErrorIdKey,
132 nonExhaustiveGuardsErrorIdKey,
159 stablePtrPrimTyConKey,
161 stableNameDataConKey,
162 stableNamePrimTyConKey,
171 threadIdPrimTyConKey,
178 unpackCStringAppendIdKey,
179 unpackCStringFoldrIdKey,
195 #include "HsVersions.h"
197 import FastString ( FastString, uniqueOfFS )
200 import PrelBase ( Char(..), chr, ord )
205 %************************************************************************
207 \subsection[Unique-type]{@Unique@ type and operations}
209 %************************************************************************
211 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
212 Fast comparison is everything on @Uniques@:
215 data Unique = MkUnique Int#
219 u2i :: Unique -> FAST_INT
223 Now come the functions which construct uniques from their pieces, and vice versa.
224 The stuff about unique *supplies* is handled further down this module.
227 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
228 unpkUnique :: Unique -> (Char, Int) -- The reverse
230 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
232 getKey :: Unique -> Int# -- for Var
234 incrUnique :: Unique -> Unique
239 mkUniqueGrimily x = MkUnique x
241 {-# INLINE getKey #-}
242 getKey (MkUnique x) = x
244 incrUnique (MkUnique i) = MkUnique (i +# 1#)
246 -- pop the Char in the top 8 bits of the Unique(Supply)
248 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
254 mkUnique (C# c) (I# i)
255 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
257 unpkUnique (MkUnique u)
259 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
260 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
264 shiftr x y = shiftRL# x y
269 %************************************************************************
271 \subsection[Uniquable-class]{The @Uniquable@ class}
273 %************************************************************************
276 class Uniquable a where
277 getUnique :: a -> Unique
279 instance Uniquable FastString where
280 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
282 instance Uniquable Int where
283 getUnique (I# i#) = mkUniqueGrimily i#
287 %************************************************************************
289 \subsection[Unique-instances]{Instance declarations for @Unique@}
291 %************************************************************************
293 And the whole point (besides uniqueness) is fast equality. We don't
294 use `deriving' because we want {\em precise} control of ordering
295 (equality on @Uniques@ is v common).
298 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
299 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
300 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
302 cmpUnique (MkUnique u1) (MkUnique u2)
303 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
305 instance Eq Unique where
306 a == b = eqUnique a b
307 a /= b = not (eqUnique a b)
309 instance Ord Unique where
311 a <= b = leUnique a b
312 a > b = not (leUnique a b)
313 a >= b = not (ltUnique a b)
314 compare a b = cmpUnique a b
317 instance Uniquable Unique where
321 We do sometimes make strings with @Uniques@ in them:
323 pprUnique, pprUnique10 :: Unique -> SDoc
326 = case unpkUnique uniq of
327 (tag, u) -> finish_ppr tag u (iToBase62 u)
329 pprUnique10 uniq -- in base-10, dudes
330 = case unpkUnique uniq of
331 (tag, u) -> finish_ppr tag u (int u)
333 finish_ppr 't' u pp_u | u < 26
334 = -- Special case to make v common tyvars, t1, t2, ...
335 -- come out as a, b, ... (shorter, easier to read)
336 char (chr (ord 'a' + u))
337 finish_ppr tag u pp_u = char tag <> pp_u
339 instance Outputable Unique where
342 instance Show Unique where
343 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
346 %************************************************************************
348 \subsection[Utils-base62]{Base-62 numbers}
350 %************************************************************************
352 A character-stingy way to read/write numbers (notably Uniques).
353 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
354 Code stolen from Lennart.
356 # define BYTE_ARRAY GlaExts.ByteArray
357 # define RUN_ST ST.runST
358 # define AND_THEN >>=
359 # define AND_THEN_ >>
360 # define RETURN return
362 iToBase62 :: Int -> SDoc
367 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
370 case (indexCharArray# bytes n#) of { c ->
373 case (quotRem n 62) of { (q, I# r#) ->
374 case (indexCharArray# bytes r#) of { c ->
375 (<>) (iToBase62 q) (char (C# c)) }}
377 -- keep this at top level! (bug on 94/10/24 WDP)
378 chars62 :: BYTE_ARRAY Int
381 newCharArray (0, 61) AND_THEN \ ch_array ->
382 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
384 unsafeFreezeByteArray ch_array
387 fill_in ch_array i lim str
391 = writeCharArray ch_array i (str !! i) AND_THEN_
392 fill_in ch_array (i+1) lim str
395 %************************************************************************
397 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
399 %************************************************************************
401 Allocation of unique supply characters:
402 v,t,u : for renumbering value-, type- and usage- vars.
403 other a-z: lower case chars for unique supplies (see Main.lhs)
405 C-E: pseudo uniques (used in native-code generator)
406 _: unifiable tyvars (above)
407 0-9: prelude things below
410 mkAlphaTyVarUnique i = mkUnique '1' i
412 mkPreludeClassUnique i = mkUnique '2' i
413 mkPreludeTyConUnique i = mkUnique '3' i
414 mkTupleTyConUnique a = mkUnique '4' a
415 mkUbxTupleTyConUnique a = mkUnique '5' a
417 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
418 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
419 mkUbxTupleDataConUnique a = mkUnique '8' a
421 mkPrimOpIdUnique op = mkUnique '9' op
422 mkPreludeMiscIdUnique i = mkUnique '0' i
424 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
425 -- See pprUnique for details
427 initTyVarUnique :: Unique
428 initTyVarUnique = mkUnique 't' 0
430 initTidyUniques :: (Unique, Unique) -- Global and local
431 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
433 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
434 mkBuiltinUnique :: Int -> Unique
436 mkBuiltinUnique i = mkUnique 'B' i
437 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
438 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
439 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
441 getBuiltinUniques :: Int -> [Unique]
442 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
445 %************************************************************************
447 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
449 %************************************************************************
452 boundedClassKey = mkPreludeClassUnique 1
453 enumClassKey = mkPreludeClassUnique 2
454 eqClassKey = mkPreludeClassUnique 3
455 floatingClassKey = mkPreludeClassUnique 5
456 fractionalClassKey = mkPreludeClassUnique 6
457 integralClassKey = mkPreludeClassUnique 7
458 monadClassKey = mkPreludeClassUnique 8
459 monadPlusClassKey = mkPreludeClassUnique 9
460 functorClassKey = mkPreludeClassUnique 10
461 numClassKey = mkPreludeClassUnique 11
462 ordClassKey = mkPreludeClassUnique 12
463 readClassKey = mkPreludeClassUnique 13
464 realClassKey = mkPreludeClassUnique 14
465 realFloatClassKey = mkPreludeClassUnique 15
466 realFracClassKey = mkPreludeClassUnique 16
467 showClassKey = mkPreludeClassUnique 17
469 cCallableClassKey = mkPreludeClassUnique 18
470 cReturnableClassKey = mkPreludeClassUnique 19
472 ixClassKey = mkPreludeClassUnique 20
475 %************************************************************************
477 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
479 %************************************************************************
482 addrPrimTyConKey = mkPreludeTyConUnique 1
483 addrTyConKey = mkPreludeTyConUnique 2
484 arrayPrimTyConKey = mkPreludeTyConUnique 3
485 boolTyConKey = mkPreludeTyConUnique 4
486 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
487 charPrimTyConKey = mkPreludeTyConUnique 7
488 charTyConKey = mkPreludeTyConUnique 8
489 doublePrimTyConKey = mkPreludeTyConUnique 9
490 doubleTyConKey = mkPreludeTyConUnique 10
491 floatPrimTyConKey = mkPreludeTyConUnique 11
492 floatTyConKey = mkPreludeTyConUnique 12
493 funTyConKey = mkPreludeTyConUnique 13
494 intPrimTyConKey = mkPreludeTyConUnique 14
495 intTyConKey = mkPreludeTyConUnique 15
496 int8TyConKey = mkPreludeTyConUnique 16
497 int16TyConKey = mkPreludeTyConUnique 17
498 int32TyConKey = mkPreludeTyConUnique 18
499 int64PrimTyConKey = mkPreludeTyConUnique 19
500 int64TyConKey = mkPreludeTyConUnique 20
501 integerTyConKey = mkPreludeTyConUnique 21
502 listTyConKey = mkPreludeTyConUnique 22
503 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
504 foreignObjTyConKey = mkPreludeTyConUnique 24
505 weakPrimTyConKey = mkPreludeTyConUnique 25
506 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
507 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
508 orderingTyConKey = mkPreludeTyConUnique 28
509 mVarPrimTyConKey = mkPreludeTyConUnique 29
510 ratioTyConKey = mkPreludeTyConUnique 30
511 rationalTyConKey = mkPreludeTyConUnique 31
512 realWorldTyConKey = mkPreludeTyConUnique 32
513 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
514 stablePtrTyConKey = mkPreludeTyConUnique 34
515 statePrimTyConKey = mkPreludeTyConUnique 35
516 stableNamePrimTyConKey = mkPreludeTyConUnique 50
517 stableNameTyConKey = mkPreludeTyConUnique 51
518 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
519 mutVarPrimTyConKey = mkPreludeTyConUnique 53
520 ioTyConKey = mkPreludeTyConUnique 55
521 byteArrayTyConKey = mkPreludeTyConUnique 56
522 wordPrimTyConKey = mkPreludeTyConUnique 57
523 wordTyConKey = mkPreludeTyConUnique 58
524 word8TyConKey = mkPreludeTyConUnique 59
525 word16TyConKey = mkPreludeTyConUnique 60
526 word32TyConKey = mkPreludeTyConUnique 61
527 word64PrimTyConKey = mkPreludeTyConUnique 62
528 word64TyConKey = mkPreludeTyConUnique 63
529 boxedConKey = mkPreludeTyConUnique 64
530 unboxedConKey = mkPreludeTyConUnique 65
531 anyBoxConKey = mkPreludeTyConUnique 66
532 kindConKey = mkPreludeTyConUnique 67
533 boxityConKey = mkPreludeTyConUnique 68
534 typeConKey = mkPreludeTyConUnique 69
535 threadIdPrimTyConKey = mkPreludeTyConUnique 70
538 %************************************************************************
540 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
542 %************************************************************************
545 addrDataConKey = mkPreludeDataConUnique 1
546 charDataConKey = mkPreludeDataConUnique 2
547 consDataConKey = mkPreludeDataConUnique 3
548 doubleDataConKey = mkPreludeDataConUnique 4
549 falseDataConKey = mkPreludeDataConUnique 5
550 floatDataConKey = mkPreludeDataConUnique 6
551 intDataConKey = mkPreludeDataConUnique 7
552 smallIntegerDataConKey = mkPreludeDataConUnique 12
553 largeIntegerDataConKey = mkPreludeDataConUnique 13
554 foreignObjDataConKey = mkPreludeDataConUnique 14
555 nilDataConKey = mkPreludeDataConUnique 15
556 ratioDataConKey = mkPreludeDataConUnique 16
557 stablePtrDataConKey = mkPreludeDataConUnique 17
558 stableNameDataConKey = mkPreludeDataConUnique 18
559 trueDataConKey = mkPreludeDataConUnique 34
560 wordDataConKey = mkPreludeDataConUnique 35
561 stDataConKey = mkPreludeDataConUnique 40
562 ioDataConKey = mkPreludeDataConUnique 42
565 %************************************************************************
567 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
569 %************************************************************************
572 absentErrorIdKey = mkPreludeMiscIdUnique 1
573 appendIdKey = mkPreludeMiscIdUnique 2
574 augmentIdKey = mkPreludeMiscIdUnique 3
575 buildIdKey = mkPreludeMiscIdUnique 4
576 errorIdKey = mkPreludeMiscIdUnique 5
577 foldlIdKey = mkPreludeMiscIdUnique 6
578 foldrIdKey = mkPreludeMiscIdUnique 7
579 recSelErrIdKey = mkPreludeMiscIdUnique 8
580 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
581 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
582 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
583 integerZeroIdKey = mkPreludeMiscIdUnique 12
584 int2IntegerIdKey = mkPreludeMiscIdUnique 13
585 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
586 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
587 lexIdKey = mkPreludeMiscIdUnique 16
588 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
589 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
590 packCStringIdKey = mkPreludeMiscIdUnique 19
591 parErrorIdKey = mkPreludeMiscIdUnique 20
592 parIdKey = mkPreludeMiscIdUnique 21
593 patErrorIdKey = mkPreludeMiscIdUnique 22
594 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
595 recConErrorIdKey = mkPreludeMiscIdUnique 24
596 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
597 traceIdKey = mkPreludeMiscIdUnique 26
598 unpackCString2IdKey = mkPreludeMiscIdUnique 27
599 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
600 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
601 unpackCStringIdKey = mkPreludeMiscIdUnique 30
602 ushowListIdKey = mkPreludeMiscIdUnique 31
603 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
604 concatIdKey = mkPreludeMiscIdUnique 33
605 filterIdKey = mkPreludeMiscIdUnique 34
606 zipIdKey = mkPreludeMiscIdUnique 35
607 bindIOIdKey = mkPreludeMiscIdUnique 36
608 deRefStablePtrIdKey = mkPreludeMiscIdUnique 37
609 makeStablePtrIdKey = mkPreludeMiscIdUnique 38
610 getTagIdKey = mkPreludeMiscIdUnique 39
613 Certain class operations from Prelude classes. They get their own
614 uniques so we can look them up easily when we want to conjure them up
615 during type checking.
618 fromIntClassOpKey = mkPreludeMiscIdUnique 101
619 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
620 minusClassOpKey = mkPreludeMiscIdUnique 103
621 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
622 enumFromClassOpKey = mkPreludeMiscIdUnique 105
623 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
624 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
625 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
626 eqClassOpKey = mkPreludeMiscIdUnique 109
627 geClassOpKey = mkPreludeMiscIdUnique 110
628 failMClassOpKey = mkPreludeMiscIdUnique 112
629 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
630 -- Just a place holder for unbound variables produced by the renamer:
631 unboundKey = mkPreludeMiscIdUnique 114
632 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
634 mainKey = mkPreludeMiscIdUnique 116
635 returnMClassOpKey = mkPreludeMiscIdUnique 117
636 otherwiseIdKey = mkPreludeMiscIdUnique 118
637 toEnumClassOpKey = mkPreludeMiscIdUnique 119
638 mapIdKey = mkPreludeMiscIdUnique 120
642 assertIdKey = mkPreludeMiscIdUnique 121