Do not put wired-in things in interface files
authorsimonpj@microsoft.com <unknown>
Mon, 8 May 2006 14:29:46 +0000 (14:29 +0000)
committersimonpj@microsoft.com <unknown>
Mon, 8 May 2006 14:29:46 +0000 (14:29 +0000)
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
compiler/prelude/PrelInfo.lhs

index cafb6b6..1e85ac4 100644 (file)
@@ -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
index 31457b2..ea5a996 100644 (file)
@@ -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]