From ef61cbbcbf819e7e5930b60de59fb5d550f66e83 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Mon, 8 May 2006 14:29:46 +0000 Subject: [PATCH] Do not put wired-in things in interface files There is no need for wired-in things to go into interface files; the compiler knows about them anyway. Worse, it turns ou that if they are in an interface file, they may get read in with not-quite-right type info (e.g. GHC.Err.error), and the not-quite-right thing gets into the type envt. Than it gets used instead of the wired in thing. Best all round never to put them into interface files. This is the way it used to be, but it looks as if it rotted away some time ago. (I noticed this when fixing unsafePerformIO stuff, becuase 'lazy' was getting an unfolding when it shouldn't.) --- compiler/iface/MkIface.lhs | 4 +++- compiler/prelude/PrelInfo.lhs | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/compiler/iface/MkIface.lhs b/compiler/iface/MkIface.lhs index cafb6b6..1e85ac4 100644 --- a/compiler/iface/MkIface.lhs +++ b/compiler/iface/MkIface.lhs @@ -279,8 +279,10 @@ mkIface hsc_env maybe_old_iface ; decls = [ tyThingToIfaceDecl ext_nm_rhs thing | thing <- typeEnvElts type_env, - not (isImplicitName (getName thing)) ] + let name = getName thing, + not (isImplicitName name || isWiredInName name) ] -- Don't put implicit Ids and class tycons in the interface file + -- Nor wired-in things; the compiler knows about them anyhow ; fixities = [(occ,fix) | FixItem occ fix _ <- nameEnvElts fix_env] ; deprecs = mkIfaceDeprec src_deprecs diff --git a/compiler/prelude/PrelInfo.lhs b/compiler/prelude/PrelInfo.lhs index 31457b2..ea5a996 100644 --- a/compiler/prelude/PrelInfo.lhs +++ b/compiler/prelude/PrelInfo.lhs @@ -48,8 +48,24 @@ import Array ( Array, array, (!) ) %* * %************************************************************************ -We have two ``builtin name funs,'' one to look up @TyCons@ and -@Classes@, the other to look up values. +Notes about wired in things +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Wired-in things are Ids/TyCons that are completely known to the compiler. + They are global values in GHC, (e.g. listTyCon :: TyCon). + +* A wired in Name contains the thing itself inside the Name: + see Name.wiredInNameTyThing_maybe + (E.g. listTyConName contains listTyCon. + +* The name cache is initialised with (the names of) all wired-in things + +* The type checker sees if the Name is wired in before looking up + the name in the type environment. So the type envt itself contains + no wired in things. + +* MkIface prunes out wired-in things before putting them in an interface file. + So interface files never contain wired-in things. + \begin{code} wiredInThings :: [TyThing] -- 1.7.10.4