summaryrefslogtreecommitdiff
path: root/compiler/prelude
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-10-11 12:05:18 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-10-11 12:05:18 +0000
commitb00b5bc04ff36a551552470060064f0b7d84ca30 (patch)
tree9b3ae9433218dd1388a640f2aad7f3e37d63711e /compiler/prelude
parent7e623a3a6c4fa75bae5be29a9fca015f98f1c30b (diff)
downloadhaskell-b00b5bc04ff36a551552470060064f0b7d84ca30.tar.gz
Interface file optimisation and removal of nameParent
This large commit combines several interrelated changes: - IfaceSyn now contains actual Names rather than the special IfaceExtName type. The binary interface file contains a symbol table of Names, where each entry is a (package, ModuleName, OccName) triple. Names in the IfaceSyn point to entries in the symbol table. This reduces the size of interface files, which should hopefully improve performance (not measured yet). The toIfaceXXX functions now do not need to pass around a function from Name -> IfaceExtName, which makes that code simpler. - Names now do not point directly to their parents, and the nameParent operation has gone away. It turned out to be hard to keep this information consistent in practice, and the parent info was only valid in some Names. Instead we made the following changes: * ImportAvails contains a new field imp_parent :: NameEnv AvailInfo which gives the family info for any Name in scope, and is used by the renamer when renaming export lists, amongst other things. This info is thrown away after renaming. * The mi_ver_fn field of ModIface now maps to (OccName,Version) instead of just Version, where the OccName is the parent name. This mapping is used when constructing the usage info for dependent modules. There may be entries in mi_ver_fn for things that are not in scope, whereas imp_parent only deals with in-scope things. * The md_exports field of ModDetails now contains [AvailInfo] rather than NameSet. This gives us family info for the exported names of a module. Also: - ifaceDeclSubBinders moved to IfaceSyn (seems like the right place for it). - heavily refactored renaming of import/export lists. - Unfortunately external core is now broken, as it relied on IfaceSyn. It requires some attention.
Diffstat (limited to 'compiler/prelude')
-rw-r--r--compiler/prelude/PrelNames.lhs97
-rw-r--r--compiler/prelude/TysPrim.lhs1
-rw-r--r--compiler/prelude/TysWiredIn.lhs31
3 files changed, 60 insertions, 69 deletions
diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs
index 36413dd18a..bccf84fa1d 100644
--- a/compiler/prelude/PrelNames.lhs
+++ b/compiler/prelude/PrelNames.lhs
@@ -446,9 +446,9 @@ runMainIOName = varQual gHC_TOP_HANDLER FSLIT("runMainIO") runMainKey
orderingTyConName = tcQual gHC_BASE FSLIT("Ordering") orderingTyConKey
-eitherTyConName = tcQual dATA_EITHER FSLIT("Either") eitherTyConKey
-leftDataConName = conName eitherTyConName FSLIT("Left") leftDataConKey
-rightDataConName = conName eitherTyConName FSLIT("Right") rightDataConKey
+eitherTyConName = tcQual dATA_EITHER FSLIT("Either") eitherTyConKey
+leftDataConName = conName dATA_EITHER FSLIT("Left") leftDataConKey
+rightDataConName = conName dATA_EITHER FSLIT("Right") rightDataConKey
-- Generics
crossTyConName = tcQual gHC_BASE FSLIT(":*:") crossTyConKey
@@ -466,18 +466,18 @@ eqStringName = varQual gHC_BASE FSLIT("eqString") eqStringIdKey
inlineIdName = varQual gHC_BASE FSLIT("inline") inlineIdKey
-- Base classes (Eq, Ord, Functor)
-eqClassName = clsQual gHC_BASE FSLIT("Eq") eqClassKey
-eqName = methName eqClassName FSLIT("==") eqClassOpKey
-ordClassName = clsQual gHC_BASE FSLIT("Ord") ordClassKey
-geName = methName ordClassName FSLIT(">=") geClassOpKey
-functorClassName = clsQual gHC_BASE FSLIT("Functor") functorClassKey
+eqClassName = clsQual gHC_BASE FSLIT("Eq") eqClassKey
+eqName = methName gHC_BASE FSLIT("==") eqClassOpKey
+ordClassName = clsQual gHC_BASE FSLIT("Ord") ordClassKey
+geName = methName gHC_BASE FSLIT(">=") geClassOpKey
+functorClassName = clsQual gHC_BASE FSLIT("Functor") functorClassKey
-- Class Monad
-monadClassName = clsQual gHC_BASE FSLIT("Monad") monadClassKey
-thenMName = methName monadClassName FSLIT(">>") thenMClassOpKey
-bindMName = methName monadClassName FSLIT(">>=") bindMClassOpKey
-returnMName = methName monadClassName FSLIT("return") returnMClassOpKey
-failMName = methName monadClassName FSLIT("fail") failMClassOpKey
+monadClassName = clsQual gHC_BASE FSLIT("Monad") monadClassKey
+thenMName = methName gHC_BASE FSLIT(">>") thenMClassOpKey
+bindMName = methName gHC_BASE FSLIT(">>=") bindMClassOpKey
+returnMName = methName gHC_BASE FSLIT("return") returnMClassOpKey
+failMName = methName gHC_BASE FSLIT("fail") failMClassOpKey
-- Random PrelBase functions
otherwiseIdName = varQual gHC_BASE FSLIT("otherwise") otherwiseIdKey
@@ -506,25 +506,25 @@ fstName = varQual dATA_TUP FSLIT("fst") fstIdKey
sndName = varQual dATA_TUP FSLIT("snd") sndIdKey
-- Module PrelNum
-numClassName = clsQual gHC_NUM FSLIT("Num") numClassKey
-fromIntegerName = methName numClassName FSLIT("fromInteger") fromIntegerClassOpKey
-minusName = methName numClassName FSLIT("-") minusClassOpKey
-negateName = methName numClassName FSLIT("negate") negateClassOpKey
-plusIntegerName = varQual gHC_NUM FSLIT("plusInteger") plusIntegerIdKey
-timesIntegerName = varQual gHC_NUM FSLIT("timesInteger") timesIntegerIdKey
-integerTyConName = tcQual gHC_NUM FSLIT("Integer") integerTyConKey
-smallIntegerDataConName = conName integerTyConName FSLIT("S#") smallIntegerDataConKey
-largeIntegerDataConName = conName integerTyConName FSLIT("J#") largeIntegerDataConKey
+numClassName = clsQual gHC_NUM FSLIT("Num") numClassKey
+fromIntegerName = methName gHC_NUM FSLIT("fromInteger") fromIntegerClassOpKey
+minusName = methName gHC_NUM FSLIT("-") minusClassOpKey
+negateName = methName gHC_NUM FSLIT("negate") negateClassOpKey
+plusIntegerName = varQual gHC_NUM FSLIT("plusInteger") plusIntegerIdKey
+timesIntegerName = varQual gHC_NUM FSLIT("timesInteger") timesIntegerIdKey
+integerTyConName = tcQual gHC_NUM FSLIT("Integer") integerTyConKey
+smallIntegerDataConName = conName gHC_NUM FSLIT("S#") smallIntegerDataConKey
+largeIntegerDataConName = conName gHC_NUM FSLIT("J#") largeIntegerDataConKey
-- PrelReal types and classes
-rationalTyConName = tcQual gHC_REAL FSLIT("Rational") rationalTyConKey
-ratioTyConName = tcQual gHC_REAL FSLIT("Ratio") ratioTyConKey
-ratioDataConName = conName ratioTyConName FSLIT(":%") ratioDataConKey
-realClassName = clsQual gHC_REAL FSLIT("Real") realClassKey
-integralClassName = clsQual gHC_REAL FSLIT("Integral") integralClassKey
-realFracClassName = clsQual gHC_REAL FSLIT("RealFrac") realFracClassKey
-fractionalClassName = clsQual gHC_REAL FSLIT("Fractional") fractionalClassKey
-fromRationalName = methName fractionalClassName FSLIT("fromRational") fromRationalClassOpKey
+rationalTyConName = tcQual gHC_REAL FSLIT("Rational") rationalTyConKey
+ratioTyConName = tcQual gHC_REAL FSLIT("Ratio") ratioTyConKey
+ratioDataConName = conName gHC_REAL FSLIT(":%") ratioDataConKey
+realClassName = clsQual gHC_REAL FSLIT("Real") realClassKey
+integralClassName = clsQual gHC_REAL FSLIT("Integral") integralClassKey
+realFracClassName = clsQual gHC_REAL FSLIT("RealFrac") realFracClassKey
+fractionalClassName = clsQual gHC_REAL FSLIT("Fractional") fractionalClassKey
+fromRationalName = methName gHC_REAL FSLIT("fromRational") fromRationalClassOpKey
-- PrelFloat classes
floatingClassName = clsQual gHC_FLOAT FSLIT("Floating") floatingClassKey
@@ -555,10 +555,10 @@ assertErrorName = varQual gHC_ERR FSLIT("assertError") assertErrorIdKey
-- Enum module (Enum, Bounded)
enumClassName = clsQual gHC_ENUM FSLIT("Enum") enumClassKey
-enumFromName = methName enumClassName FSLIT("enumFrom") enumFromClassOpKey
-enumFromToName = methName enumClassName FSLIT("enumFromTo") enumFromToClassOpKey
-enumFromThenName = methName enumClassName FSLIT("enumFromThen") enumFromThenClassOpKey
-enumFromThenToName = methName enumClassName FSLIT("enumFromThenTo") enumFromThenToClassOpKey
+enumFromName = methName gHC_ENUM FSLIT("enumFrom") enumFromClassOpKey
+enumFromToName = methName gHC_ENUM FSLIT("enumFromTo") enumFromToClassOpKey
+enumFromThenName = methName gHC_ENUM FSLIT("enumFromThen") enumFromThenClassOpKey
+enumFromThenToName = methName gHC_ENUM FSLIT("enumFromThenTo") enumFromThenToClassOpKey
boundedClassName = clsQual gHC_ENUM FSLIT("Bounded") boundedClassKey
-- List functions
@@ -590,7 +590,7 @@ indexOfPName = varQual gHC_PARR FSLIT("indexOfP") indexOfPIdKey
-- IOBase things
ioTyConName = tcQual gHC_IO_BASE FSLIT("IO") ioTyConKey
-ioDataConName = conName ioTyConName FSLIT("IO") ioDataConKey
+ioDataConName = conName gHC_IO_BASE FSLIT("IO") ioDataConKey
thenIOName = varQual gHC_IO_BASE FSLIT("thenIO") thenIOIdKey
bindIOName = varQual gHC_IO_BASE FSLIT("bindIO") bindIOIdKey
returnIOName = varQual gHC_IO_BASE FSLIT("returnIO") returnIOIdKey
@@ -611,7 +611,7 @@ word16TyConName = tcQual gHC_WORD FSLIT("Word16") word16TyConKey
word32TyConName = tcQual gHC_WORD FSLIT("Word32") word32TyConKey
word64TyConName = tcQual gHC_WORD FSLIT("Word64") word64TyConKey
wordTyConName = tcQual gHC_WORD FSLIT("Word") wordTyConKey
-wordDataConName = conName wordTyConName FSLIT("W#") wordDataConKey
+wordDataConName = conName gHC_WORD FSLIT("W#") wordDataConKey
-- PrelPtr module
ptrTyConName = tcQual gHC_PTR FSLIT("Ptr") ptrTyConKey
@@ -626,7 +626,7 @@ runSTRepName = varQual gHC_ST FSLIT("runSTRep") runSTRepIdKey
-- Recursive-do notation
monadFixClassName = clsQual mONAD_FIX FSLIT("MonadFix") monadFixClassKey
-mfixName = methName monadFixClassName FSLIT("mfix") mfixIdKey
+mfixName = methName mONAD_FIX FSLIT("mfix") mfixIdKey
-- Arrow notation
arrAName = varQual aRROW FSLIT("arr") arrAIdKey
@@ -666,20 +666,15 @@ tcQual = mk_known_key_name tcName
clsQual = mk_known_key_name clsName
mk_known_key_name space mod str uniq
- = mkExternalName uniq mod (mkOccNameFS space str)
- Nothing noSrcLoc
-
-conName :: Name -> FastString -> Unique -> Name
--- Be careful to ghve constructor names the right parent!
-conName tycon occ uniq
- = mkExternalName uniq (nameModule tycon) (mkOccNameFS dataName occ)
- (Just tycon) noSrcLoc
-
-methName :: Name -> FastString -> Unique -> Name
--- Be careful to ghve method names the right parent!
-methName cls occ uniq
- = mkExternalName uniq (nameModule cls) (mkVarOccFS occ)
- (Just cls) noSrcLoc
+ = mkExternalName uniq mod (mkOccNameFS space str) noSrcLoc
+
+conName :: Module -> FastString -> Unique -> Name
+conName mod occ uniq
+ = mkExternalName uniq mod (mkOccNameFS dataName occ) noSrcLoc
+
+methName :: Module -> FastString -> Unique -> Name
+methName mod occ uniq
+ = mkExternalName uniq mod (mkVarOccFS occ) noSrcLoc
\end{code}
%************************************************************************
diff --git a/compiler/prelude/TysPrim.lhs b/compiler/prelude/TysPrim.lhs
index 4b6832a856..7a316835ea 100644
--- a/compiler/prelude/TysPrim.lhs
+++ b/compiler/prelude/TysPrim.lhs
@@ -103,7 +103,6 @@ mkPrimTc :: FastString -> Unique -> TyCon -> Name
mkPrimTc fs uniq tycon
= mkWiredInName gHC_PRIM (mkOccNameFS tcName fs)
uniq
- Nothing -- No parent object
(ATyCon tycon) -- Relevant TyCon
UserSyntax -- None are built-in syntax
diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs
index 598fa42032..436b121adc 100644
--- a/compiler/prelude/TysWiredIn.lhs
+++ b/compiler/prelude/TysWiredIn.lhs
@@ -133,36 +133,34 @@ wiredInTyCons = [ unitTyCon -- Not treated like other tuples, because
mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
mkWiredInTyConName built_in mod fs uniq tycon
= mkWiredInName mod (mkOccNameFS tcName fs) uniq
- Nothing -- No parent object
(ATyCon tycon) -- Relevant TyCon
built_in
-mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name -> Name
-mkWiredInDataConName built_in mod fs uniq datacon parent
+mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name
+mkWiredInDataConName built_in mod fs uniq datacon
= mkWiredInName mod (mkOccNameFS dataName fs) uniq
- (Just parent) -- Name of parent TyCon
(ADataCon datacon) -- Relevant DataCon
built_in
charTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Char") charTyConKey charTyCon
-charDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("C#") charDataConKey charDataCon charTyConName
+charDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("C#") charDataConKey charDataCon
intTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Int") intTyConKey intTyCon
-intDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("I#") intDataConKey intDataCon intTyConName
+intDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("I#") intDataConKey intDataCon
boolTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Bool") boolTyConKey boolTyCon
-falseDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("False") falseDataConKey falseDataCon boolTyConName
-trueDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("True") trueDataConKey trueDataCon boolTyConName
+falseDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("False") falseDataConKey falseDataCon
+trueDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("True") trueDataConKey trueDataCon
listTyConName = mkWiredInTyConName BuiltInSyntax gHC_BASE FSLIT("[]") listTyConKey listTyCon
-nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT("[]") nilDataConKey nilDataCon listTyConName
-consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT(":") consDataConKey consDataCon listTyConName
+nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT("[]") nilDataConKey nilDataCon
+consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT(":") consDataConKey consDataCon
floatTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Float") floatTyConKey floatTyCon
-floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("F#") floatDataConKey floatDataCon floatTyConName
+floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("F#") floatDataConKey floatDataCon
doubleTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Double") doubleTyConKey doubleTyCon
-doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("D#") doubleDataConKey doubleDataCon doubleTyConName
+doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("D#") doubleDataConKey doubleDataCon
parrTyConName = mkWiredInTyConName BuiltInSyntax gHC_PARR FSLIT("[::]") parrTyConKey parrTyCon
-parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR FSLIT("PArr") parrDataConKey parrDataCon parrTyConName
+parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR FSLIT("PArr") parrDataConKey parrDataCon
boolTyCon_RDR = nameRdrName boolTyConName
false_RDR = nameRdrName falseDataConName
@@ -240,7 +238,6 @@ pcDataConWithFixity declared_infix dc_name tyvars arg_tys tycon
wrk_occ = mkDataConWorkerOcc (nameOccName dc_name)
wrk_key = incrUnique (nameUnique dc_name)
wrk_name = mkWiredInName mod wrk_occ wrk_key
- (Just (tyConName tycon))
(AnId (dataConWorkId data_con)) UserSyntax
bogus_wrap_name = pprPanic "Wired-in data wrapper id" (ppr dc_name)
-- Wired-in types are too simple to need wrappers
@@ -274,7 +271,7 @@ mk_tuple boxity arity = (tycon, tuple_con)
tycon = mkTupleTyCon tc_name tc_kind arity tyvars tuple_con boxity gen_info
mod = mkTupleModule boxity arity
tc_name = mkWiredInName mod (mkTupleOcc tcName boxity arity) tc_uniq
- Nothing (ATyCon tycon) BuiltInSyntax
+ (ATyCon tycon) BuiltInSyntax
tc_kind = mkArrowKinds (map tyVarKind tyvars) res_kind
res_kind | isBoxed boxity = liftedTypeKind
| otherwise = ubxTupleKind
@@ -285,7 +282,7 @@ mk_tuple boxity arity = (tycon, tuple_con)
tuple_con = pcDataCon dc_name tyvars tyvar_tys tycon
tyvar_tys = mkTyVarTys tyvars
dc_name = mkWiredInName mod (mkTupleOcc dataName boxity arity) dc_uniq
- (Just tc_name) (ADataCon tuple_con) BuiltInSyntax
+ (ADataCon tuple_con) BuiltInSyntax
tc_uniq = mkTupleTyConUnique boxity arity
dc_uniq = mkTupleDataConUnique boxity arity
gen_info = True -- Tuples all have generics..
@@ -569,7 +566,7 @@ mkPArrFakeCon arity = data_con
tyvarTys = replicate arity $ mkTyVarTy tyvar
nameStr = mkFastString ("MkPArr" ++ show arity)
name = mkWiredInName gHC_PARR (mkOccNameFS dataName nameStr) uniq
- Nothing (ADataCon data_con) UserSyntax
+ (ADataCon data_con) UserSyntax
uniq = mkPArrDataConUnique arity
-- checks whether a data constructor is a fake constructor for parallel arrays