2 % (c) The GRASP Project, Glasgow University, 1994-1998
4 \section[TysWiredIn]{Wired-in knowledge about {\em non-primitive} types}
6 This module is about types that can be defined in Haskell, but which
7 must be wired into the compiler nonetheless.
9 This module tracks the ``state interface'' document, ``GHC prelude:
10 types and operations.''
27 falseDataCon, falseDataConId,
51 tupleTyCon, tupleCon, unitTyCon, unitDataConId, pairTyCon,
55 unboxedTupleTyCon, unboxedTupleCon,
56 unboxedPairTyCon, unboxedPairDataCon,
60 trueDataCon, trueDataConId,
67 isFFIArgumentTy, -- :: Bool -> Type -> Bool
68 isFFIResultTy, -- :: Type -> Bool
69 isFFIExternalTy, -- :: Type -> Bool
70 isAddrTy, -- :: Type -> Bool
71 isForeignObjTy -- :: Type -> Bool
75 #include "HsVersions.h"
77 import {-# SOURCE #-} MkId( mkDataConId, mkDataConWrapId )
84 import Constants ( mAX_TUPLE_SIZE )
85 import Module ( Module, mkPrelModule )
86 import Name ( mkWiredInTyConName, mkWiredInIdName, mkSrcOccFS, mkWorkerOcc, dataName )
87 import DataCon ( DataCon, StrictnessMark(..), mkDataCon, dataConId )
88 import Var ( TyVar, tyVarKind )
89 import TyCon ( TyCon, AlgTyConFlavour(..), ArgVrcs, mkAlgTyCon, mkSynTyCon, mkTupleTyCon )
90 import BasicTypes ( Arity, NewOrData(..), RecFlag(..) )
91 import Type ( Type, mkTyConTy, mkTyConApp, mkSigmaTy, mkTyVarTys,
92 mkArrowKinds, boxedTypeKind, unboxedTypeKind,
93 mkFunTy, mkFunTys, isUnLiftedType,
94 splitTyConApp_maybe, splitAlgTyConApp_maybe,
95 TauType, ClassContext )
96 import PrimRep ( PrimRep(..) )
98 import CmdLineOpts ( opt_GlasgowExts )
100 import Panic ( panic )
103 alpha_tyvar = [alphaTyVar]
105 alpha_beta_tyvars = [alphaTyVar, betaTyVar]
107 pcRecDataTyCon, pcNonRecDataTyCon
108 :: Unique{-TyConKey-} -> Module -> FAST_STRING
109 -> [TyVar] -> ArgVrcs -> [DataCon] -> TyCon
111 pcRecDataTyCon = pcTyCon DataTyCon Recursive
112 pcNonRecDataTyCon = pcTyCon DataTyCon NonRecursive
114 pcTyCon new_or_data is_rec key mod str tyvars argvrcs cons
117 tycon = mkAlgTyCon name kind
126 name = mkWiredInTyConName key mod str tycon
127 kind = mkArrowKinds (map tyVarKind tyvars) boxedTypeKind
129 pcSynTyCon key mod str kind arity tyvars expansion argvrcs -- this fun never used!
132 tycon = mkSynTyCon name kind arity tyvars expansion argvrcs
133 name = mkWiredInTyConName key mod str tycon
135 pcDataCon :: Unique{-DataConKey-} -> Module -> FAST_STRING
136 -> [TyVar] -> ClassContext -> [TauType] -> TyCon -> DataCon
137 -- The unique is the first of two free uniques;
138 -- the first is used for the datacon itself and the worker;
139 -- the second is used for the wrapper.
140 pcDataCon wrap_key mod str tyvars context arg_tys tycon
143 data_con = mkDataCon wrap_name
144 [ NotMarkedStrict | a <- arg_tys ]
145 [ {- no labelled fields -} ]
146 tyvars context [] [] arg_tys tycon work_id wrap_id
148 work_occ = mkWorkerOcc wrap_occ
149 work_key = incrUnique wrap_key
150 work_name = mkWiredInIdName work_key mod work_occ work_id
151 work_id = mkDataConId work_name data_con
153 wrap_occ = mkSrcOccFS dataName str
154 wrap_name = mkWiredInIdName wrap_key mod wrap_occ wrap_id
155 wrap_id = mkDataConWrapId data_con
159 %************************************************************************
161 \subsection[TysWiredIn-tuples]{The tuple types}
163 %************************************************************************
166 tupleTyCon :: Arity -> TyCon
167 tupleTyCon i | i > mAX_TUPLE_SIZE = fst (mk_tuple i) -- Build one specially
168 | otherwise = tupleTyConArr!i
170 tupleCon :: Arity -> DataCon
171 tupleCon i | i > mAX_TUPLE_SIZE = snd (mk_tuple i) -- Build one specially
172 | otherwise = tupleConArr!i
174 tupleTyCons :: [TyCon]
175 tupleTyCons = elems tupleTyConArr
177 tupleTyConArr :: Array Int TyCon
178 tupleTyConArr = array (0,mAX_TUPLE_SIZE) ([0..] `zip` map fst tuples)
180 tupleConArr :: Array Int DataCon
181 tupleConArr = array (0,mAX_TUPLE_SIZE) ([0..] `zip` map snd tuples)
183 tuples :: [(TyCon,DataCon)]
184 tuples = [mk_tuple i | i <- [0..mAX_TUPLE_SIZE]]
186 mk_tuple :: Int -> (TyCon,DataCon)
187 mk_tuple arity = (tycon, tuple_con)
189 tycon = mkTupleTyCon tc_name tc_kind arity tyvars tuple_con True
190 tc_name = mkWiredInTyConName tc_uniq mod name_str tycon
191 tc_kind = mkArrowKinds (map tyVarKind tyvars) boxedTypeKind
193 tuple_con = pcDataCon dc_uniq mod name_str tyvars [] tyvar_tys tycon
194 tyvars = take arity alphaTyVars
195 tyvar_tys = mkTyVarTys tyvars
196 (mod_name, name_str) = mkTupNameStr arity
197 tc_uniq = mkTupleTyConUnique arity
198 dc_uniq = mkTupleDataConUnique arity
199 mod = mkPrelModule mod_name
201 unitTyCon = tupleTyCon 0
202 pairTyCon = tupleTyCon 2
204 unitDataConId = dataConId (tupleCon 0)
207 %************************************************************************
209 \subsection[TysWiredIn-ubx-tuples]{Unboxed Tuple Types}
211 %************************************************************************
214 unboxedTupleTyCon :: Arity -> TyCon
215 unboxedTupleTyCon i | i > mAX_TUPLE_SIZE = fst (mk_unboxed_tuple i)
216 | otherwise = unboxedTupleTyConArr!i
218 unboxedTupleCon :: Arity -> DataCon
219 unboxedTupleCon i | i > mAX_TUPLE_SIZE = snd (mk_unboxed_tuple i)
220 | otherwise = unboxedTupleConArr!i
222 unboxedTupleTyConArr :: Array Int TyCon
223 unboxedTupleTyConArr = array (0,mAX_TUPLE_SIZE) ([0..] `zip` map fst ubx_tuples)
225 unboxedTupleConArr :: Array Int DataCon
226 unboxedTupleConArr = array (0,mAX_TUPLE_SIZE) ([0..] `zip` map snd ubx_tuples)
228 ubx_tuples :: [(TyCon,DataCon)]
229 ubx_tuples = [mk_unboxed_tuple i | i <- [0..mAX_TUPLE_SIZE]]
231 mk_unboxed_tuple :: Int -> (TyCon,DataCon)
232 mk_unboxed_tuple arity = (tycon, tuple_con)
234 tycon = mkTupleTyCon tc_name tc_kind arity tyvars tuple_con False
235 tc_name = mkWiredInTyConName tc_uniq mod name_str tycon
236 tc_kind = mkArrowKinds (map tyVarKind tyvars) unboxedTypeKind
238 tuple_con = pcDataCon dc_uniq mod name_str tyvars [] tyvar_tys tycon
239 tyvars = take arity openAlphaTyVars
240 tyvar_tys = mkTyVarTys tyvars
241 (mod_name, name_str) = mkUbxTupNameStr arity
242 tc_uniq = mkUbxTupleTyConUnique arity
243 dc_uniq = mkUbxTupleDataConUnique arity
244 mod = mkPrelModule mod_name
246 unboxedPairTyCon = unboxedTupleTyCon 2
247 unboxedPairDataCon = unboxedTupleCon 2
250 %************************************************************************
252 \subsection[TysWiredIn-boxed-prim]{The ``boxed primitive'' types (@Char@, @Int@, etc)}
254 %************************************************************************
257 -- The Void type is represented as a data type with no constructors
258 -- It's a built in type (i.e. there's no way to define it in Haskell;
259 -- the nearest would be
261 -- data Void = -- No constructors!
263 -- ) It's boxed; there is only one value of this
264 -- type, namely "void", whose semantics is just bottom.
266 -- Haskell 98 drops the definition of a Void type, so we just 'simulate'
273 charTy = mkTyConTy charTyCon
275 charTyCon = pcNonRecDataTyCon charTyConKey pREL_BASE SLIT("Char") [] [] [charDataCon]
276 charDataCon = pcDataCon charDataConKey pREL_BASE SLIT("C#") [] [] [charPrimTy] charTyCon
278 stringTy = mkListTy charTy -- convenience only
282 intTy = mkTyConTy intTyCon
284 intTyCon = pcNonRecDataTyCon intTyConKey pREL_BASE SLIT("Int") [] [] [intDataCon]
285 intDataCon = pcDataCon intDataConKey pREL_BASE SLIT("I#") [] [] [intPrimTy] intTyCon
287 isIntTy :: Type -> Bool
289 = case (splitAlgTyConApp_maybe ty) of
290 Just (tycon, [], _) -> getUnique tycon == intTyConKey
296 wordTy = mkTyConTy wordTyCon
298 wordTyCon = pcNonRecDataTyCon wordTyConKey pREL_ADDR SLIT("Word") [] [] [wordDataCon]
299 wordDataCon = pcDataCon wordDataConKey pREL_ADDR SLIT("W#") [] [] [wordPrimTy] wordTyCon
303 addrTy = mkTyConTy addrTyCon
305 addrTyCon = pcNonRecDataTyCon addrTyConKey pREL_ADDR SLIT("Addr") [] [] [addrDataCon]
306 addrDataCon = pcDataCon addrDataConKey pREL_ADDR SLIT("A#") [] [] [addrPrimTy] addrTyCon
308 isAddrTy :: Type -> Bool
310 = case (splitAlgTyConApp_maybe ty) of
311 Just (tycon, [], _) -> getUnique tycon == addrTyConKey
317 floatTy = mkTyConTy floatTyCon
319 floatTyCon = pcNonRecDataTyCon floatTyConKey pREL_FLOAT SLIT("Float") [] [] [floatDataCon]
320 floatDataCon = pcDataCon floatDataConKey pREL_FLOAT SLIT("F#") [] [] [floatPrimTy] floatTyCon
322 isFloatTy :: Type -> Bool
324 = case (splitAlgTyConApp_maybe ty) of
325 Just (tycon, [], _) -> getUnique tycon == floatTyConKey
331 doubleTy = mkTyConTy doubleTyCon
333 isDoubleTy :: Type -> Bool
335 = case (splitAlgTyConApp_maybe ty) of
336 Just (tycon, [], _) -> getUnique tycon == doubleTyConKey
339 doubleTyCon = pcNonRecDataTyCon doubleTyConKey pREL_FLOAT SLIT("Double") [] [] [doubleDataCon]
340 doubleDataCon = pcDataCon doubleDataConKey pREL_FLOAT SLIT("D#") [] [] [doublePrimTy] doubleTyCon
345 = pcNonRecDataTyCon stablePtrTyConKey pREL_STABLE SLIT("StablePtr")
346 alpha_tyvar [(True,False)] [stablePtrDataCon]
349 = pcDataCon stablePtrDataConKey pREL_STABLE SLIT("StablePtr")
350 alpha_tyvar [] [mkStablePtrPrimTy alphaTy] stablePtrTyCon
355 = pcNonRecDataTyCon foreignObjTyConKey pREL_IO_BASE SLIT("ForeignObj")
356 [] [] [foreignObjDataCon]
359 = pcDataCon foreignObjDataConKey pREL_IO_BASE SLIT("ForeignObj")
360 [] [] [foreignObjPrimTy] foreignObjTyCon
363 %************************************************************************
365 \subsection[TysWiredIn-Integer]{@Integer@ and its related ``pairing'' types}
367 %************************************************************************
369 @Integer@ and its pals are not really primitive. @Integer@ itself, first:
372 integerTy = mkTyConTy integerTyCon
374 integerTyCon = pcNonRecDataTyCon integerTyConKey pREL_NUM SLIT("Integer")
375 [] [] [smallIntegerDataCon, largeIntegerDataCon]
377 smallIntegerDataCon = pcDataCon smallIntegerDataConKey pREL_NUM SLIT("S#")
378 [] [] [intPrimTy] integerTyCon
379 largeIntegerDataCon = pcDataCon largeIntegerDataConKey pREL_NUM SLIT("J#")
380 [] [] [intPrimTy, byteArrayPrimTy] integerTyCon
383 isIntegerTy :: Type -> Bool
385 = case (splitAlgTyConApp_maybe ty) of
386 Just (tycon, [], _) -> getUnique tycon == integerTyConKey
391 %************************************************************************
393 \subsection[TysWiredIn-ext-type]{External types}
395 %************************************************************************
397 The compiler's foreign function interface supports the passing of a
398 restricted set of types as arguments and results (the restricting factor
402 isFFIArgumentTy :: Bool -> Type -> Bool
403 isFFIArgumentTy forASafeCall ty =
404 (opt_GlasgowExts && isUnLiftedType ty) ||
405 case (splitAlgTyConApp_maybe ty) of
406 Just (tycon, _, _) ->
410 u `elem` primArgTyConKeys && -- it has a suitable prim type, and
411 (not forASafeCall || not ( u `elem` notSafeExternalTyCons)) -- it is safe to pass out.
414 -- types that can be passed as arguments to "foreign" functions
416 = [ intTyConKey, int8TyConKey, int16TyConKey, int32TyConKey, int64TyConKey
417 , wordTyConKey, word8TyConKey, word16TyConKey, word32TyConKey, word64TyConKey
418 , floatTyConKey, doubleTyConKey
419 , addrTyConKey, charTyConKey, foreignObjTyConKey
421 , byteArrayTyConKey, mutableByteArrayTyConKey
424 -- types that can be passed from the outside world into Haskell.
425 -- excludes (mutable) byteArrays.
426 isFFIExternalTy :: Type -> Bool
428 (opt_GlasgowExts && isUnLiftedType ty) || --leave out for now: maybeToBool (maybeBoxedPrimType ty))) ||
429 case (splitAlgTyConApp_maybe ty) of
430 Just (tycon, _, _) ->
432 u_tycon = getUnique tycon
434 (u_tycon `elem` primArgTyConKeys) &&
435 not (u_tycon `elem` notLegalExternalTyCons)
439 isFFIResultTy :: Type -> Bool
441 not (isUnLiftedType ty) &&
442 case (splitAlgTyConApp_maybe ty) of
443 Just (tycon, _, _) ->
445 u_tycon = getUnique tycon
447 (u_tycon == getUnique unitTyCon) ||
448 ((u_tycon `elem` primArgTyConKeys) &&
449 not (u_tycon `elem` notLegalExternalTyCons))
452 -- it's illegal to return foreign objects and (mutable)
453 -- bytearrays from a _ccall_ / foreign declaration
454 -- (or be passed them as arguments in foreign exported functions).
455 notLegalExternalTyCons =
456 [ foreignObjTyConKey, byteArrayTyConKey, mutableByteArrayTyConKey ]
458 -- it's really unsafe to pass out references to objects in the heap,
459 -- so for safe call-outs we simply disallow it.
460 notSafeExternalTyCons =
461 [ byteArrayTyConKey, mutableByteArrayTyConKey ]
464 isForeignObjTy :: Type -> Bool
466 case (splitAlgTyConApp_maybe ty) of
467 Just (tycon, _, _) -> (getUnique tycon) == foreignObjTyConKey
472 %************************************************************************
474 \subsection[TysWiredIn-Bool]{The @Bool@ type}
476 %************************************************************************
478 An ordinary enumeration type, but deeply wired in. There are no
479 magical operations on @Bool@ (just the regular Prelude code).
481 {\em BEGIN IDLE SPECULATION BY SIMON}
483 This is not the only way to encode @Bool@. A more obvious coding makes
484 @Bool@ just a boxed up version of @Bool#@, like this:
487 data Bool = MkBool Bool#
490 Unfortunately, this doesn't correspond to what the Report says @Bool@
491 looks like! Furthermore, we get slightly less efficient code (I
492 think) with this coding. @gtInt@ would look like this:
495 gtInt :: Int -> Int -> Bool
496 gtInt x y = case x of I# x# ->
498 case (gtIntPrim x# y#) of
502 Notice that the result of the @gtIntPrim@ comparison has to be turned
503 into an integer (here called @b#@), and returned in a @MkBool@ box.
505 The @if@ expression would compile to this:
508 MkBool b# -> case b# of { 1# -> e1; 0# -> e2 }
511 I think this code is a little less efficient than the previous code,
512 but I'm not certain. At all events, corresponding with the Report is
513 important. The interesting thing is that the language is expressive
514 enough to describe more than one alternative; and that a type doesn't
515 necessarily need to be a straightforwardly boxed version of its
516 primitive counterpart.
518 {\em END IDLE SPECULATION BY SIMON}
521 boolTy = mkTyConTy boolTyCon
523 boolTyCon = pcTyCon EnumTyCon NonRecursive boolTyConKey
524 pREL_BASE SLIT("Bool") [] [] [falseDataCon, trueDataCon]
526 falseDataCon = pcDataCon falseDataConKey pREL_BASE SLIT("False") [] [] [] boolTyCon
527 trueDataCon = pcDataCon trueDataConKey pREL_BASE SLIT("True") [] [] [] boolTyCon
529 falseDataConId = dataConId falseDataCon
530 trueDataConId = dataConId trueDataCon
533 %************************************************************************
535 \subsection[TysWiredIn-List]{The @List@ type (incl ``build'' magic)}
537 %************************************************************************
539 Special syntax, deeply wired in, but otherwise an ordinary algebraic
542 data [] a = [] | a : (List a)
544 data (,) a b = (,,) a b
549 mkListTy :: Type -> Type
550 mkListTy ty = mkTyConApp listTyCon [ty]
552 alphaListTy = mkSigmaTy alpha_tyvar [] (mkTyConApp listTyCon alpha_ty)
554 listTyCon = pcRecDataTyCon listTyConKey pREL_BASE SLIT("[]")
555 alpha_tyvar [(True,False)] [nilDataCon, consDataCon]
557 nilDataCon = pcDataCon nilDataConKey pREL_BASE SLIT("[]") alpha_tyvar [] [] listTyCon
558 consDataCon = pcDataCon consDataConKey pREL_BASE SLIT(":")
559 alpha_tyvar [] [alphaTy, mkTyConApp listTyCon alpha_ty] listTyCon
560 -- Interesting: polymorphic recursion would help here.
561 -- We can't use (mkListTy alphaTy) in the defn of consDataCon, else mkListTy
562 -- gets the over-specific type (Type -> Type)
565 %************************************************************************
567 \subsection[TysWiredIn-Tuples]{The @Tuple@ types}
569 %************************************************************************
571 The tuple types are definitely magic, because they form an infinite
576 They have a special family of type constructors, of type @TyCon@
577 These contain the tycon arity, but don't require a Unique.
580 They have a special family of constructors, of type
581 @Id@. Again these contain their arity but don't need a Unique.
584 There should be a magic way of generating the info tables and
585 entry code for all tuples.
587 But at the moment we just compile a Haskell source
588 file\srcloc{lib/prelude/...} containing declarations like:
591 data Tuple2 a b = Tup2 a b
592 data Tuple3 a b c = Tup3 a b c
593 data Tuple4 a b c d = Tup4 a b c d
596 The print-names associated with the magic @Id@s for tuple constructors
597 ``just happen'' to be the same as those generated by these
601 The instance environment should have a magic way to know
602 that each tuple type is an instances of classes @Eq@, @Ix@, @Ord@ and
603 so on. \ToDo{Not implemented yet.}
606 There should also be a way to generate the appropriate code for each
607 of these instances, but (like the info tables and entry code) it is
608 done by enumeration\srcloc{lib/prelude/InTup?.hs}.
612 mkTupleTy :: Int -> [Type] -> Type
613 mkTupleTy arity tys = mkTyConApp (tupleTyCon arity) tys
615 mkUnboxedTupleTy :: Int -> [Type] -> Type
616 mkUnboxedTupleTy arity tys = mkTyConApp (unboxedTupleTyCon arity) tys
618 unitTy = mkTupleTy 0 []