2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Unique]{The @Unique@ data type}
6 @Uniques@ are used to distinguish entities in the compiler (@Ids@,
7 @Classes@, etc.) from each other. Thus, @Uniques@ are the basic
8 comparison key in the compiler.
10 If there is any single operation that needs to be fast, it is @Unique@
11 comparison. Unsurprisingly, there is quite a bit of huff-and-puff
14 Some of the other hair in this code is to be able to use a
15 ``splittable @UniqueSupply@'' if requested/possible (not standard
19 #include "HsVersions.h"
21 --<mkdependHS:friends> UniqSupply
25 u2i, -- hack: used in UniqFM
27 pprUnique, pprUnique10, showUnique,
29 mkUnique, -- Used in UniqSupply
30 mkUniqueGrimily, -- Used in UniqSupply only!
32 incrUnique, -- Used for renumbering
33 initRenumberingUniques,
35 -- now all the built-in Uniques (and functions to make them)
36 -- [the Oh-So-Wonderful Haskell module system wins again...]
42 getBuiltinUniques, mkBuiltinUnique,
43 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
45 absentErrorIdKey, -- alphabetical...
56 byteArrayPrimTyConKey,
70 enumFromThenClassOpKey,
71 enumFromThenToClassOpKey,
87 fromIntegerClassOpKey,
88 fromRationalClassOpKey,
110 foreignObjDataConKey,
111 foreignObjPrimTyConKey,
117 mutableArrayPrimTyConKey,
118 mutableByteArrayPrimTyConKey,
129 irrefutPatErrorIdKey,
130 nonExhaustiveGuardsErrorIdKey,
131 noDefaultMethodErrorIdKey,
132 nonExplicitMethodErrorIdKey,
143 return2GMPsDataConKey,
145 returnIntAndGMPDataConKey,
146 returnIntAndGMPTyConKey,
152 stablePtrPrimTyConKey,
154 stateAndAddrPrimDataConKey,
155 stateAndAddrPrimTyConKey,
156 stateAndArrayPrimDataConKey,
157 stateAndArrayPrimTyConKey,
158 stateAndByteArrayPrimDataConKey,
159 stateAndByteArrayPrimTyConKey,
160 stateAndCharPrimDataConKey,
161 stateAndCharPrimTyConKey,
162 stateAndDoublePrimDataConKey,
163 stateAndDoublePrimTyConKey,
164 stateAndFloatPrimDataConKey,
165 stateAndFloatPrimTyConKey,
166 stateAndIntPrimDataConKey,
167 stateAndIntPrimTyConKey,
168 stateAndForeignObjPrimDataConKey,
169 stateAndForeignObjPrimTyConKey,
170 stateAndMutableArrayPrimDataConKey,
171 stateAndMutableArrayPrimTyConKey,
172 stateAndMutableByteArrayPrimDataConKey,
173 stateAndMutableByteArrayPrimTyConKey,
174 stateAndPtrPrimDataConKey,
175 stateAndPtrPrimTyConKey,
176 stateAndStablePtrPrimDataConKey,
177 stateAndStablePtrPrimTyConKey,
178 stateAndSynchVarPrimDataConKey,
179 stateAndSynchVarPrimTyConKey,
180 stateAndWordPrimDataConKey,
181 stateAndWordPrimTyConKey,
186 synchVarPrimTyConKey,
190 unpackCStringAppendIdKey,
191 unpackCStringFoldrIdKey,
210 import Ubiq{-uitous-}
216 %************************************************************************
218 \subsection[Unique-type]{@Unique@ type and operations}
220 %************************************************************************
222 The @Chars@ are ``tag letters'' that identify the @UniqueSupply@.
223 Fast comparison is everything on @Uniques@:
226 u2i :: Unique -> FAST_INT
228 data Unique = MkUnique Int#
232 Now come the functions which construct uniques from their pieces, and vice versa.
233 The stuff about unique *supplies* is handled further down this module.
236 mkUnique :: Char -> Int -> Unique -- Builds a unique from pieces
237 unpkUnique :: Unique -> (Char, Int) -- The reverse
239 mkUniqueGrimily :: Int# -> Unique -- A trap-door for UniqSupply
241 incrUnique :: Unique -> Unique
246 mkUniqueGrimily x = MkUnique x
248 incrUnique (MkUnique i) = MkUnique (i +# 1#)
250 -- pop the Char in the top 8 bits of the Unique(Supply)
252 -- No 64-bit bugs here, as long as we have at least 32 bits. --JSM
258 mkUnique (C# c) (I# i)
259 = MkUnique (w2i (((i2w (ord# c)) `shiftL#` (i2w_s 24#)) `or#` (i2w i)))
261 unpkUnique (MkUnique u)
263 tag = C# (chr# (w2i ((i2w u) `shiftr` (i2w_s 24#))))
264 i = I# (w2i ((i2w u) `and#` (i2w 16777215#){-``0x00ffffff''-}))
268 shiftr x y = shiftRA# x y
271 %************************************************************************
273 \subsection[Unique-instances]{Instance declarations for @Unique@}
275 %************************************************************************
277 And the whole point (besides uniqueness) is fast equality. We don't
278 use `deriving' because we want {\em precise} control of ordering
279 (equality on @Uniques@ is v common).
282 eqUnique (MkUnique u1) (MkUnique u2) = u1 ==# u2
283 ltUnique (MkUnique u1) (MkUnique u2) = u1 <# u2
284 leUnique (MkUnique u1) (MkUnique u2) = u1 <=# u2
286 cmpUnique (MkUnique u1) (MkUnique u2)
287 = if u1 ==# u2 then EQ_ else if u1 <# u2 then LT_ else GT_
289 instance Eq Unique where
290 a == b = eqUnique a b
291 a /= b = not (eqUnique a b)
293 instance Ord Unique where
295 a <= b = leUnique a b
296 a > b = not (leUnique a b)
297 a >= b = not (ltUnique a b)
298 _tagCmp a b = case cmpUnique a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
300 instance Ord3 Unique where
304 instance Uniquable Unique where
308 We do sometimes make strings with @Uniques@ in them:
310 pprUnique, pprUnique10 :: Unique -> Pretty
313 = case unpkUnique uniq of
314 (tag, u) -> ppBeside (ppChar tag) (iToBase62 u)
316 pprUnique10 uniq -- in base-10, dudes
317 = case unpkUnique uniq of
318 (tag, u) -> ppBeside (ppChar tag) (ppInt u)
320 showUnique :: Unique -> FAST_STRING
321 showUnique uniq = _PK_ (ppShow 80 (pprUnique uniq))
323 instance Outputable Unique where
324 ppr sty u = pprUnique u
326 instance Text Unique where
327 showsPrec p uniq rest = _UNPK_ (showUnique uniq)
328 readsPrec p = panic "no readsPrec for Unique"
331 %************************************************************************
333 \subsection[Utils-base62]{Base-62 numbers}
335 %************************************************************************
337 A character-stingy way to read/write numbers (notably Uniques).
338 The ``62-its'' are \tr{[0-9a-zA-Z]}. We don't handle negative Ints.
339 Code stolen from Lennart.
341 iToBase62 :: Int -> Pretty
346 bytes = case chars62 of { _ByteArray bounds_who_needs_'em bytes -> bytes }
349 case (indexCharArray# bytes n#) of { c ->
352 case (quotRem n 62) of { (q, I# r#) ->
353 case (indexCharArray# bytes r#) of { c ->
354 ppBeside (iToBase62 q) (ppChar (C# c)) }}
356 -- keep this at top level! (bug on 94/10/24 WDP)
357 chars62 :: _ByteArray Int
360 newCharArray (0, 61) `thenStrictlyST` \ ch_array ->
361 fill_in ch_array 0 62 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
363 unsafeFreezeByteArray ch_array
366 fill_in ch_array i lim str
368 = returnStrictlyST ()
370 = writeCharArray ch_array i (str !! i) `seqStrictlyST`
371 fill_in ch_array (i+1) lim str
374 %************************************************************************
376 \subsection[Uniques-prelude]{@Uniques@ for wired-in Prelude things}
378 %************************************************************************
380 Allocation of unique supply characters:
381 v,t,u : for renumbering value-, type- and usage- vars.
382 other a-z: lower case chars for unique supplies (see Main.lhs)
384 C-E: pseudo uniques (used in native-code generator)
385 _: unifiable tyvars (above)
386 1-8: prelude things below
389 mkAlphaTyVarUnique i = mkUnique '1' i
391 mkPreludeClassUnique i = mkUnique '2' i
392 mkPreludeTyConUnique i = mkUnique '3' i
393 mkTupleTyConUnique a = mkUnique '4' a
395 mkPreludeDataConUnique i = mkUnique '5' i -- must be alphabetic
396 mkTupleDataConUnique a = mkUnique '6' a -- ditto (*may* be used in C labels)
398 mkPrimOpIdUnique op = mkUnique '7' op
399 mkPreludeMiscIdUnique i = mkUnique '8' i
401 initRenumberingUniques = (mkUnique 'v' 1, mkUnique 't' 1, mkUnique 'u' 1)
403 mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
404 mkBuiltinUnique :: Int -> Unique
406 mkBuiltinUnique i = mkUnique 'B' i
407 mkPseudoUnique1 i = mkUnique 'C' i -- used for uniqueOf on Regs
408 mkPseudoUnique2 i = mkUnique 'D' i -- ditto
409 mkPseudoUnique3 i = mkUnique 'E' i -- ditto
411 getBuiltinUniques :: Int -> [Unique]
412 getBuiltinUniques n = map (mkUnique 'B') [1 .. n]
415 %************************************************************************
417 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
419 %************************************************************************
422 boundedClassKey = mkPreludeClassUnique 1
423 enumClassKey = mkPreludeClassUnique 2
424 eqClassKey = mkPreludeClassUnique 3
425 evalClassKey = mkPreludeClassUnique 4
426 floatingClassKey = mkPreludeClassUnique 5
427 fractionalClassKey = mkPreludeClassUnique 6
428 integralClassKey = mkPreludeClassUnique 7
429 monadClassKey = mkPreludeClassUnique 8
430 monadZeroClassKey = mkPreludeClassUnique 9
431 monadPlusClassKey = mkPreludeClassUnique 10
432 functorClassKey = mkPreludeClassUnique 11
433 numClassKey = mkPreludeClassUnique 12
434 ordClassKey = mkPreludeClassUnique 13
435 readClassKey = mkPreludeClassUnique 14
436 realClassKey = mkPreludeClassUnique 15
437 realFloatClassKey = mkPreludeClassUnique 16
438 realFracClassKey = mkPreludeClassUnique 17
439 showClassKey = mkPreludeClassUnique 18
441 cCallableClassKey = mkPreludeClassUnique 19
442 cReturnableClassKey = mkPreludeClassUnique 20
444 ixClassKey = mkPreludeClassUnique 21
447 %************************************************************************
449 \subsubsection[Uniques-prelude-TyCons]{@Uniques@ for wired-in @TyCons@}
451 %************************************************************************
454 addrPrimTyConKey = mkPreludeTyConUnique 1
455 addrTyConKey = mkPreludeTyConUnique 2
456 arrayPrimTyConKey = mkPreludeTyConUnique 3
457 boolTyConKey = mkPreludeTyConUnique 4
458 byteArrayPrimTyConKey = mkPreludeTyConUnique 5
459 charPrimTyConKey = mkPreludeTyConUnique 7
460 charTyConKey = mkPreludeTyConUnique 8
461 doublePrimTyConKey = mkPreludeTyConUnique 9
462 doubleTyConKey = mkPreludeTyConUnique 10
463 floatPrimTyConKey = mkPreludeTyConUnique 11
464 floatTyConKey = mkPreludeTyConUnique 12
465 funTyConKey = mkPreludeTyConUnique 13
466 iOTyConKey = mkPreludeTyConUnique 14
467 intPrimTyConKey = mkPreludeTyConUnique 15
468 intTyConKey = mkPreludeTyConUnique 16
469 integerTyConKey = mkPreludeTyConUnique 17
470 liftTyConKey = mkPreludeTyConUnique 18
471 listTyConKey = mkPreludeTyConUnique 19
472 foreignObjPrimTyConKey = mkPreludeTyConUnique 20
473 foreignObjTyConKey = mkPreludeTyConUnique 21
474 mutableArrayPrimTyConKey = mkPreludeTyConUnique 22
475 mutableByteArrayPrimTyConKey = mkPreludeTyConUnique 23
476 orderingTyConKey = mkPreludeTyConUnique 24
477 synchVarPrimTyConKey = mkPreludeTyConUnique 25
478 ratioTyConKey = mkPreludeTyConUnique 26
479 rationalTyConKey = mkPreludeTyConUnique 27
480 realWorldTyConKey = mkPreludeTyConUnique 28
481 return2GMPsTyConKey = mkPreludeTyConUnique 29
482 returnIntAndGMPTyConKey = mkPreludeTyConUnique 30
483 stablePtrPrimTyConKey = mkPreludeTyConUnique 31
484 stablePtrTyConKey = mkPreludeTyConUnique 32
485 stateAndAddrPrimTyConKey = mkPreludeTyConUnique 33
486 stateAndArrayPrimTyConKey = mkPreludeTyConUnique 34
487 stateAndByteArrayPrimTyConKey = mkPreludeTyConUnique 35
488 stateAndCharPrimTyConKey = mkPreludeTyConUnique 36
489 stateAndDoublePrimTyConKey = mkPreludeTyConUnique 37
490 stateAndFloatPrimTyConKey = mkPreludeTyConUnique 38
491 stateAndIntPrimTyConKey = mkPreludeTyConUnique 39
492 stateAndForeignObjPrimTyConKey = mkPreludeTyConUnique 40
493 stateAndMutableArrayPrimTyConKey = mkPreludeTyConUnique 41
494 stateAndMutableByteArrayPrimTyConKey = mkPreludeTyConUnique 42
495 stateAndSynchVarPrimTyConKey = mkPreludeTyConUnique 43
496 stateAndPtrPrimTyConKey = mkPreludeTyConUnique 44
497 stateAndStablePtrPrimTyConKey = mkPreludeTyConUnique 45
498 stateAndWordPrimTyConKey = mkPreludeTyConUnique 46
499 statePrimTyConKey = mkPreludeTyConUnique 47
500 stateTyConKey = mkPreludeTyConUnique 48
501 stringTyConKey = mkPreludeTyConUnique 49
502 stTyConKey = mkPreludeTyConUnique 50
503 primIoTyConKey = mkPreludeTyConUnique 51
504 voidPrimTyConKey = mkPreludeTyConUnique 52
505 wordPrimTyConKey = mkPreludeTyConUnique 53
506 wordTyConKey = mkPreludeTyConUnique 54
507 voidTyConKey = mkPreludeTyConUnique 55
510 %************************************************************************
512 \subsubsection[Uniques-prelude-DataCons]{@Uniques@ for wired-in @DataCons@}
514 %************************************************************************
517 addrDataConKey = mkPreludeDataConUnique 1
518 buildDataConKey = mkPreludeDataConUnique 2
519 charDataConKey = mkPreludeDataConUnique 4
520 consDataConKey = mkPreludeDataConUnique 5
521 doubleDataConKey = mkPreludeDataConUnique 6
522 eqDataConKey = mkPreludeDataConUnique 7
523 falseDataConKey = mkPreludeDataConUnique 8
524 floatDataConKey = mkPreludeDataConUnique 9
525 gtDataConKey = mkPreludeDataConUnique 10
526 intDataConKey = mkPreludeDataConUnique 11
527 integerDataConKey = mkPreludeDataConUnique 12
528 liftDataConKey = mkPreludeDataConUnique 13
529 ltDataConKey = mkPreludeDataConUnique 14
530 foreignObjDataConKey = mkPreludeDataConUnique 15
531 nilDataConKey = mkPreludeDataConUnique 18
532 ratioDataConKey = mkPreludeDataConUnique 21
533 return2GMPsDataConKey = mkPreludeDataConUnique 22
534 returnIntAndGMPDataConKey = mkPreludeDataConUnique 23
535 stablePtrDataConKey = mkPreludeDataConUnique 24
536 stateAndAddrPrimDataConKey = mkPreludeDataConUnique 25
537 stateAndArrayPrimDataConKey = mkPreludeDataConUnique 26
538 stateAndByteArrayPrimDataConKey = mkPreludeDataConUnique 27
539 stateAndCharPrimDataConKey = mkPreludeDataConUnique 28
540 stateAndDoublePrimDataConKey = mkPreludeDataConUnique 29
541 stateAndFloatPrimDataConKey = mkPreludeDataConUnique 30
542 stateAndIntPrimDataConKey = mkPreludeDataConUnique 31
543 stateAndForeignObjPrimDataConKey = mkPreludeDataConUnique 32
544 stateAndMutableArrayPrimDataConKey = mkPreludeDataConUnique 33
545 stateAndMutableByteArrayPrimDataConKey = mkPreludeDataConUnique 34
546 stateAndSynchVarPrimDataConKey = mkPreludeDataConUnique 35
547 stateAndPtrPrimDataConKey = mkPreludeDataConUnique 36
548 stateAndStablePtrPrimDataConKey = mkPreludeDataConUnique 37
549 stateAndWordPrimDataConKey = mkPreludeDataConUnique 38
550 stateDataConKey = mkPreludeDataConUnique 39
551 trueDataConKey = mkPreludeDataConUnique 40
552 wordDataConKey = mkPreludeDataConUnique 41
555 %************************************************************************
557 \subsubsection[Uniques-prelude-Ids]{@Uniques@ for wired-in @Ids@ (except @DataCons@)}
559 %************************************************************************
562 absentErrorIdKey = mkPreludeMiscIdUnique 1
563 appendIdKey = mkPreludeMiscIdUnique 2
564 augmentIdKey = mkPreludeMiscIdUnique 3
565 buildIdKey = mkPreludeMiscIdUnique 4
566 errorIdKey = mkPreludeMiscIdUnique 5
567 foldlIdKey = mkPreludeMiscIdUnique 6
568 foldrIdKey = mkPreludeMiscIdUnique 7
569 forkIdKey = mkPreludeMiscIdUnique 8
570 int2IntegerIdKey = mkPreludeMiscIdUnique 9
571 integerMinusOneIdKey = mkPreludeMiscIdUnique 10
572 integerPlusOneIdKey = mkPreludeMiscIdUnique 11
573 integerPlusTwoIdKey = mkPreludeMiscIdUnique 12
574 integerZeroIdKey = mkPreludeMiscIdUnique 13
575 packCStringIdKey = mkPreludeMiscIdUnique 14
576 parErrorIdKey = mkPreludeMiscIdUnique 15
577 parIdKey = mkPreludeMiscIdUnique 16
578 patErrorIdKey = mkPreludeMiscIdUnique 17
579 realWorldPrimIdKey = mkPreludeMiscIdUnique 18
580 runSTIdKey = mkPreludeMiscIdUnique 19
581 seqIdKey = mkPreludeMiscIdUnique 20
582 traceIdKey = mkPreludeMiscIdUnique 21
583 unpackCString2IdKey = mkPreludeMiscIdUnique 22
584 unpackCStringAppendIdKey = mkPreludeMiscIdUnique 23
585 unpackCStringFoldrIdKey = mkPreludeMiscIdUnique 24
586 unpackCStringIdKey = mkPreludeMiscIdUnique 25
587 voidPrimIdKey = mkPreludeMiscIdUnique 26
588 mainIdKey = mkPreludeMiscIdUnique 27
589 mainPrimIOIdKey = mkPreludeMiscIdUnique 28
590 recConErrorIdKey = mkPreludeMiscIdUnique 29
591 recUpdErrorIdKey = mkPreludeMiscIdUnique 30
592 irrefutPatErrorIdKey = mkPreludeMiscIdUnique 31
593 nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 32
594 noDefaultMethodErrorIdKey = mkPreludeMiscIdUnique 33
595 nonExplicitMethodErrorIdKey = mkPreludeMiscIdUnique 34
597 copyableIdKey = mkPreludeMiscIdUnique 35
598 noFollowIdKey = mkPreludeMiscIdUnique 36
599 parAtAbsIdKey = mkPreludeMiscIdUnique 37
600 parAtForNowIdKey = mkPreludeMiscIdUnique 38
601 parAtIdKey = mkPreludeMiscIdUnique 39
602 parAtRelIdKey = mkPreludeMiscIdUnique 40
603 parGlobalIdKey = mkPreludeMiscIdUnique 41
604 parLocalIdKey = mkPreludeMiscIdUnique 42
607 Certain class operations from Prelude classes. They get
608 their own uniques so we can look them up easily when we want
609 to conjure them up during type checking.
611 fromIntClassOpKey = mkPreludeMiscIdUnique 37
612 fromIntegerClassOpKey = mkPreludeMiscIdUnique 38
613 fromRationalClassOpKey = mkPreludeMiscIdUnique 39
614 enumFromClassOpKey = mkPreludeMiscIdUnique 40
615 enumFromThenClassOpKey = mkPreludeMiscIdUnique 41
616 enumFromToClassOpKey = mkPreludeMiscIdUnique 42
617 enumFromThenToClassOpKey= mkPreludeMiscIdUnique 43
618 eqClassOpKey = mkPreludeMiscIdUnique 44
619 geClassOpKey = mkPreludeMiscIdUnique 45