-module VectType ( vectTyCon, vectType )
+module VectType ( vectTyCon, vectType, vectTypeEnv )
where
#include "HsVersions.h"
import VectMonad
import VectUtils
+import HscTypes ( TypeEnv, extendTypeEnvList, typeEnvTyCons )
import DataCon
import TyCon
import Type
import OccName
import MkId
import BasicTypes ( StrictnessMark(..), boolToRecFlag )
+import NameEnv
+import TysWiredIn
+import Unique
import UniqFM
import UniqSet
import Digraph ( SCC(..), stronglyConnComp )
type TyConGroup = ([TyCon], UniqSet TyCon)
+vectTypeEnv :: TypeEnv -> VM TypeEnv
+vectTypeEnv env
+ = do
+ cs <- readGEnv $ mk_map . global_tycons
+ let (conv_tcs, keep_tcs) = classifyTyCons cs groups
+ keep_dcs = concatMap tyConDataCons keep_tcs
+ zipWithM_ defTyCon keep_tcs keep_tcs
+ zipWithM_ defDataCon keep_dcs keep_dcs
+ new_tcs <- vectTyConDecls conv_tcs
+ return $ extendTypeEnvList env
+ (map ATyCon new_tcs ++ [ADataCon dc | tc <- new_tcs
+ , dc <- tyConDataCons tc])
+ where
+ tycons = typeEnvTyCons env
+ groups = tyConGroups tycons
+
+ mk_map env = listToUFM_Directly [(u, getUnique n /= u) | (u,n) <- nameEnvUniqueElts env]
+
+ keep_tc tc = let dcs = tyConDataCons tc
+ in
+ defTyCon tc tc >> zipWithM_ defDataCon dcs dcs
+
+
vectTyConDecls :: [TyCon] -> VM [TyCon]
vectTyConDecls tcs = fixV $ \tcs' ->
do
arg_tys <- mapM vectType rep_arg_tys
wrk_name <- cloneName mkDataConWorkerOcc name'
- let ids = mkDataConIds (panic "vectDataCon: wrapped id")
+ let ids = mkDataConIds (panic "vectDataCon: wrapper id")
wrk_name
data_con
data_con = mkDataCon name'
where
name = dataConName dc
univ_tvs = dataConUnivTyVars dc
- rep_arg_tys = dataConOrigArgTys dc
+ rep_arg_tys = dataConRepArgTys dc
tycon = dataConTyCon dc
+{-
+mkPArrTyCon :: TyCon -> VM TyCon
+mkPArrTyCon tc = fixV $ \repr_tc ->
+ do
+-}
+
+mkPArrayDataCon :: TyCon -> TyCon -> VM DataCon
+mkPArrayDataCon orig_tc repr_tc
+ = do
+ name <- cloneName mkPArrayDataConOcc (tyConName orig_tc)
+ shape_ty <- mkPArrayType intTy -- FIXME: we want to unbox this!
+ repr_tys <- mapM mkPArrayType types
+ wrk_name <- cloneName mkDataConWorkerOcc name
+ wrp_name <- cloneName mkDataConWrapperOcc name
+
+ let ids = mkDataConIds wrp_name wrk_name data_con
+ data_con = mkDataCon name
+ False
+ (MarkedStrict : map (const NotMarkedStrict) repr_tys)
+ []
+ (tyConTyVars orig_tc)
+ []
+ []
+ []
+ repr_tys
+ repr_tc
+ []
+ ids
+
+ return data_con
+ where
+ types = [ty | dc <- tyConDataCons orig_tc
+ , ty <- dataConRepArgTys dc]
+
-- | Split the given tycons into two sets depending on whether they have to be
-- converted (first list) or not (second list). The first argument contains
-- information about the conversion status of external tycons:
tyConsOfType ty
| Just ty' <- coreView ty = tyConsOfType ty'
tyConsOfType (TyVarTy v) = emptyUniqSet
-tyConsOfType (TyConApp tc tys) = tyConsOfTypes tys `addOneToUniqSet` tc
+tyConsOfType (TyConApp tc tys) = extend (tyConsOfTypes tys)
+ where
+ extend | isUnLiftedTyCon tc
+ || isTupleTyCon tc = id
+
+ | otherwise = (`addOneToUniqSet` tc)
+
tyConsOfType (AppTy a b) = tyConsOfType a `unionUniqSets` tyConsOfType b
tyConsOfType (FunTy a b) = (tyConsOfType a `unionUniqSets` tyConsOfType b)
`addOneToUniqSet` funTyCon