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,
106 smallIntegerDataConKey,
107 largeIntegerDataConKey,
108 integerMinusOneIdKey,
116 irrefutPatErrorIdKey,
125 mutableArrayPrimTyConKey,
126 mutableByteArrayPrimTyConKey,
127 mutableByteArrayTyConKey,
130 noMethodBindingErrorIdKey,
131 nonExhaustiveGuardsErrorIdKey,
158 stablePtrPrimTyConKey,
160 stableNameDataConKey,
161 stableNamePrimTyConKey,
170 threadIdPrimTyConKey,
177 unpackCStringAppendIdKey,
178 unpackCStringFoldrIdKey,
194 #include "HsVersions.h"
196 import FastString ( FastString, uniqueOfFS )
199 import PrelBase ( Char(..), chr, ord )
204 %************************************************************************
206 \subsection[Unique-type]{@Unique@ type and operations}
208 %************************************************************************
210 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
211 Fast comparison is everything on @Uniques@:
214 data Unique = MkUnique Int#
218 u2i :: Unique -> FAST_INT
222 Now come the functions which construct uniques from their pieces, and vice versa.
223 The stuff about unique *supplies* is handled further down this module.
226 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
227 unpkUnique :: Unique -> (Char, Int) -- The reverse
229 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
231 getKey :: Unique -> Int# -- for Var
233 incrUnique :: Unique -> Unique
238 mkUniqueGrimily x = MkUnique x
240 {-# INLINE getKey #-}
241 getKey (MkUnique x) = x
243 incrUnique (MkUnique i) = MkUnique (i +# 1#)
245 -- pop the Char in the top 8 bits of the Unique(Supply)
247 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
253 mkUnique (C# c) (I# i)
254 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
256 unpkUnique (MkUnique u)
258 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
259 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
263 shiftr x y = shiftRL# x y
268 %************************************************************************
270 \subsection[Uniquable-class]{The @Uniquable@ class}
272 %************************************************************************
275 class Uniquable a where
276 getUnique :: a -> Unique
278 instance Uniquable FastString where
279 getUnique fs = mkUniqueGrimily (uniqueOfFS fs)
281 instance Uniquable Int where
282 getUnique (I# i#) = mkUniqueGrimily i#
286 %************************************************************************
288 \subsection[Unique-instances]{Instance declarations for @Unique@}
290 %************************************************************************
292 And the whole point (besides uniqueness) is fast equality. We don't
293 use `deriving' because we want {\em precise} control of ordering
294 (equality on @Uniques@ is v common).
297 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
298 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
299 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
301 cmpUnique (MkUnique u1) (MkUnique u2)
302 = if u1 ==# u2 then EQ else if u1 <# u2 then LT else GT
304 instance Eq Unique where
305 a == b = eqUnique a b
306 a /= b = not (eqUnique a b)
308 instance Ord Unique where
310 a <= b = leUnique a b
311 a > b = not (leUnique a b)
312 a >= b = not (ltUnique a b)
313 compare a b = cmpUnique a b
316 instance Uniquable Unique where
320 We do sometimes make strings with @Uniques@ in them:
322 pprUnique, pprUnique10 :: Unique -> SDoc
325 = case unpkUnique uniq of
326 (tag, u) -> finish_ppr tag u (iToBase62 u)
328 pprUnique10 uniq -- in base-10, dudes
329 = case unpkUnique uniq of
330 (tag, u) -> finish_ppr tag u (int u)
332 finish_ppr 't' u pp_u | u < 26
333 = -- Special case to make v common tyvars, t1, t2, ...
334 -- come out as a, b, ... (shorter, easier to read)
335 char (chr (ord 'a' + u))
336 finish_ppr tag u pp_u = char tag <> pp_u
338 instance Outputable Unique where
341 instance Show Unique where
342 showsPrec p uniq = showsPrecSDoc p (pprUnique uniq)
345 %************************************************************************
347 \subsection[Utils-base62]{Base-62 numbers}
349 %************************************************************************
351 A character-stingy way to read/write numbers (notably Uniques).
352 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
353 Code stolen from Lennart.
355 # define BYTE_ARRAY GlaExts.ByteArray
356 # define RUN_ST ST.runST
357 # define AND_THEN >>=
358 # define AND_THEN_ >>
359 # define RETURN return
361 iToBase62 :: Int -> SDoc
366 bytes = case chars62 of { BYTE_ARRAY bounds_who_needs_'em bytes -> bytes }
369 case (indexCharArray# bytes n#) of { c ->
372 case (quotRem n 62) of { (q, I# r#) ->
373 case (indexCharArray# bytes r#) of { c ->
374 (<>) (iToBase62 q) (char (C# c)) }}
376 -- keep this at top level! (bug on 94/10/24 WDP)
377 chars62 :: BYTE_ARRAY Int
380 newCharArray (0, 61) AND_THEN \ ch_array ->
381 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
383 unsafeFreezeByteArray ch_array
386 fill_in ch_array i lim str
390 = writeCharArray ch_array i (str !! i) AND_THEN_
391 fill_in ch_array (i+1) lim str
394 %************************************************************************
396 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
398 %************************************************************************
400 Allocation of unique supply characters:
401 v,t,u : for renumbering value-, type- and usage- vars.
402 other a-z: lower case chars for unique supplies (see Main.lhs)
404 C-E: pseudo uniques (used in native-code generator)
405 _: unifiable tyvars (above)
406 0-9: prelude things below
409 mkAlphaTyVarUnique i = mkUnique '1' i
411 mkPreludeClassUnique i = mkUnique '2' i
412 mkPreludeTyConUnique i = mkUnique '3' i
413 mkTupleTyConUnique a = mkUnique '4' a
414 mkUbxTupleTyConUnique a = mkUnique '5' a
416 mkPreludeDataConUnique i = mkUnique '6' i -- must be alphabetic
417 mkTupleDataConUnique a = mkUnique '7' a -- ditto (*may* be used in C labels)
418 mkUbxTupleDataConUnique a = mkUnique '8' a
420 mkPrimOpIdUnique op = mkUnique '9' op
421 mkPreludeMiscIdUnique i = mkUnique '0' i
423 -- The "tyvar uniques" print specially nicely: a, b, c, etc.
424 -- See pprUnique for details
426 initTyVarUnique :: Unique
427 initTyVarUnique = mkUnique 't' 0
429 initTidyUniques :: (Unique, Unique) -- Global and local
430 initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
432 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
433 mkBuiltinUnique :: Int -> Unique
435 mkBuiltinUnique i = mkUnique 'B' i
436 mkPseudoUnique1 i = mkUnique 'C' i -- used for getUnique on Regs
437 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
438 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
440 getBuiltinUniques :: Int -> [Unique]
441 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
444 %************************************************************************
446 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
448 %************************************************************************
451 boundedClassKey = mkPreludeClassUnique 1
452 enumClassKey = mkPreludeClassUnique 2
453 eqClassKey = mkPreludeClassUnique 3
454 floatingClassKey = mkPreludeClassUnique 5
455 fractionalClassKey = mkPreludeClassUnique 6
456 integralClassKey = mkPreludeClassUnique 7
457 monadClassKey = mkPreludeClassUnique 8
458 monadPlusClassKey = mkPreludeClassUnique 9
459 functorClassKey = mkPreludeClassUnique 10
460 numClassKey = mkPreludeClassUnique 11
461 ordClassKey = mkPreludeClassUnique 12
462 readClassKey = mkPreludeClassUnique 13
463 realClassKey = mkPreludeClassUnique 14
464 realFloatClassKey = mkPreludeClassUnique 15
465 realFracClassKey = mkPreludeClassUnique 16
466 showClassKey = mkPreludeClassUnique 17
468 cCallableClassKey = mkPreludeClassUnique 18
469 cReturnableClassKey = mkPreludeClassUnique 19
471 ixClassKey = mkPreludeClassUnique 20
474 %************************************************************************
476 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
478 %************************************************************************
481 addrPrimTyConKey = mkPreludeTyConUnique 1
482 addrTyConKey = mkPreludeTyConUnique 2
483 arrayPrimTyConKey = mkPreludeTyConUnique 3
484 boolTyConKey = mkPreludeTyConUnique 4
485 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
486 charPrimTyConKey = mkPreludeTyConUnique 7
487 charTyConKey = mkPreludeTyConUnique 8
488 doublePrimTyConKey = mkPreludeTyConUnique 9
489 doubleTyConKey = mkPreludeTyConUnique 10
490 floatPrimTyConKey = mkPreludeTyConUnique 11
491 floatTyConKey = mkPreludeTyConUnique 12
492 funTyConKey = mkPreludeTyConUnique 13
493 intPrimTyConKey = mkPreludeTyConUnique 14
494 intTyConKey = mkPreludeTyConUnique 15
495 int8TyConKey = mkPreludeTyConUnique 16
496 int16TyConKey = mkPreludeTyConUnique 17
497 int32TyConKey = mkPreludeTyConUnique 18
498 int64PrimTyConKey = mkPreludeTyConUnique 19
499 int64TyConKey = mkPreludeTyConUnique 20
500 integerTyConKey = mkPreludeTyConUnique 21
501 listTyConKey = mkPreludeTyConUnique 22
502 foreignObjPrimTyConKey = mkPreludeTyConUnique 23
503 foreignObjTyConKey = mkPreludeTyConUnique 24
504 weakPrimTyConKey = mkPreludeTyConUnique 25
505 mutableArrayPrimTyConKey = mkPreludeTyConUnique 26
506 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 27
507 orderingTyConKey = mkPreludeTyConUnique 28
508 mVarPrimTyConKey = mkPreludeTyConUnique 29
509 ratioTyConKey = mkPreludeTyConUnique 30
510 rationalTyConKey = mkPreludeTyConUnique 31
511 realWorldTyConKey = mkPreludeTyConUnique 32
512 stablePtrPrimTyConKey = mkPreludeTyConUnique 33
513 stablePtrTyConKey = mkPreludeTyConUnique 34
514 statePrimTyConKey = mkPreludeTyConUnique 35
515 stableNamePrimTyConKey = mkPreludeTyConUnique 50
516 stableNameTyConKey = mkPreludeTyConUnique 51
517 mutableByteArrayTyConKey = mkPreludeTyConUnique 52
518 mutVarPrimTyConKey = mkPreludeTyConUnique 53
519 ioTyConKey = mkPreludeTyConUnique 55
520 byteArrayTyConKey = mkPreludeTyConUnique 56
521 wordPrimTyConKey = mkPreludeTyConUnique 57
522 wordTyConKey = mkPreludeTyConUnique 58
523 word8TyConKey = mkPreludeTyConUnique 59
524 word16TyConKey = mkPreludeTyConUnique 60
525 word32TyConKey = mkPreludeTyConUnique 61
526 word64PrimTyConKey = mkPreludeTyConUnique 62
527 word64TyConKey = mkPreludeTyConUnique 63
528 boxedConKey = mkPreludeTyConUnique 64
529 unboxedConKey = mkPreludeTyConUnique 65
530 anyBoxConKey = mkPreludeTyConUnique 66
531 kindConKey = mkPreludeTyConUnique 67
532 boxityConKey = mkPreludeTyConUnique 68
533 typeConKey = mkPreludeTyConUnique 69
534 threadIdPrimTyConKey = mkPreludeTyConUnique 70
537 %************************************************************************
539 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
541 %************************************************************************
544 addrDataConKey = mkPreludeDataConUnique 1
545 charDataConKey = mkPreludeDataConUnique 2
546 consDataConKey = mkPreludeDataConUnique 3
547 doubleDataConKey = mkPreludeDataConUnique 4
548 falseDataConKey = mkPreludeDataConUnique 5
549 floatDataConKey = mkPreludeDataConUnique 6
550 intDataConKey = mkPreludeDataConUnique 7
551 smallIntegerDataConKey = mkPreludeDataConUnique 12
552 largeIntegerDataConKey = mkPreludeDataConUnique 13
553 foreignObjDataConKey = mkPreludeDataConUnique 14
554 nilDataConKey = mkPreludeDataConUnique 15
555 ratioDataConKey = mkPreludeDataConUnique 16
556 stablePtrDataConKey = mkPreludeDataConUnique 17
557 stableNameDataConKey = mkPreludeDataConUnique 18
558 trueDataConKey = mkPreludeDataConUnique 34
559 wordDataConKey = mkPreludeDataConUnique 35
560 stDataConKey = mkPreludeDataConUnique 40
561 ioDataConKey = mkPreludeDataConUnique 42
564 %************************************************************************
566 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
568 %************************************************************************
571 absentErrorIdKey = mkPreludeMiscIdUnique 1
572 appendIdKey = mkPreludeMiscIdUnique 2
573 augmentIdKey = mkPreludeMiscIdUnique 3
574 buildIdKey = mkPreludeMiscIdUnique 4
575 errorIdKey = mkPreludeMiscIdUnique 5
576 foldlIdKey = mkPreludeMiscIdUnique 6
577 foldrIdKey = mkPreludeMiscIdUnique 7
578 recSelErrIdKey = mkPreludeMiscIdUnique 8
579 integerMinusOneIdKey = mkPreludeMiscIdUnique 9
580 integerPlusOneIdKey = mkPreludeMiscIdUnique 10
581 integerPlusTwoIdKey = mkPreludeMiscIdUnique 11
582 integerZeroIdKey = mkPreludeMiscIdUnique 12
583 int2IntegerIdKey = mkPreludeMiscIdUnique 13
584 addr2IntegerIdKey = mkPreludeMiscIdUnique 14
585 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 15
586 lexIdKey = mkPreludeMiscIdUnique 16
587 noMethodBindingErrorIdKey = mkPreludeMiscIdUnique 17
588 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
589 packCStringIdKey = mkPreludeMiscIdUnique 19
590 parErrorIdKey = mkPreludeMiscIdUnique 20
591 parIdKey = mkPreludeMiscIdUnique 21
592 patErrorIdKey = mkPreludeMiscIdUnique 22
593 realWorldPrimIdKey = mkPreludeMiscIdUnique 23
594 recConErrorIdKey = mkPreludeMiscIdUnique 24
595 recUpdErrorIdKey = mkPreludeMiscIdUnique 25
596 traceIdKey = mkPreludeMiscIdUnique 26
597 unpackCString2IdKey = mkPreludeMiscIdUnique 27
598 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 28
599 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 29
600 unpackCStringIdKey = mkPreludeMiscIdUnique 30
601 ushowListIdKey = mkPreludeMiscIdUnique 31
602 unsafeCoerceIdKey = mkPreludeMiscIdUnique 32
603 concatIdKey = mkPreludeMiscIdUnique 33
604 filterIdKey = mkPreludeMiscIdUnique 34
605 zipIdKey = mkPreludeMiscIdUnique 35
606 bindIOIdKey = mkPreludeMiscIdUnique 36
607 deRefStablePtrIdKey = mkPreludeMiscIdUnique 37
608 makeStablePtrIdKey = mkPreludeMiscIdUnique 38
611 Certain class operations from Prelude classes. They get their own
612 uniques so we can look them up easily when we want to conjure them up
613 during type checking.
616 fromIntClassOpKey = mkPreludeMiscIdUnique 101
617 fromIntegerClassOpKey = mkPreludeMiscIdUnique 102
618 minusClassOpKey = mkPreludeMiscIdUnique 103
619 fromRationalClassOpKey = mkPreludeMiscIdUnique 104
620 enumFromClassOpKey = mkPreludeMiscIdUnique 105
621 enumFromThenClassOpKey = mkPreludeMiscIdUnique 106
622 enumFromToClassOpKey = mkPreludeMiscIdUnique 107
623 enumFromThenToClassOpKey = mkPreludeMiscIdUnique 108
624 eqClassOpKey = mkPreludeMiscIdUnique 109
625 geClassOpKey = mkPreludeMiscIdUnique 110
626 failMClassOpKey = mkPreludeMiscIdUnique 112
627 thenMClassOpKey = mkPreludeMiscIdUnique 113 -- (>>=)
628 -- Just a place holder for unbound variables produced by the renamer:
629 unboundKey = mkPreludeMiscIdUnique 114
630 fromEnumClassOpKey = mkPreludeMiscIdUnique 115
632 mainKey = mkPreludeMiscIdUnique 116
633 returnMClassOpKey = mkPreludeMiscIdUnique 117
634 otherwiseIdKey = mkPreludeMiscIdUnique 118
635 toEnumClassOpKey = mkPreludeMiscIdUnique 119
636 mapIdKey = mkPreludeMiscIdUnique 120
640 assertIdKey = mkPreludeMiscIdUnique 121