-
-data Repr = ProdRepr {
- prod_components :: [Type]
- , prod_tycon :: TyCon
- , prod_data_con :: DataCon
- , prod_arr_tycon :: TyCon
- , prod_arr_data_con :: DataCon
- }
-
- | SumRepr {
- sum_components :: [Repr]
- , sum_tycon :: TyCon
- , sum_arr_tycon :: TyCon
- , sum_arr_data_con :: DataCon
- }
-
- | IdRepr Type
-
- | VoidRepr {
- void_tycon :: TyCon
- , void_bottom :: CoreExpr
- }
-
- | EnumRepr {
- enum_tycon :: TyCon
- , enum_data_con :: DataCon
- , enum_arr_tycon :: TyCon
- , enum_arr_data_con :: DataCon
- }
-
-voidRepr :: VM Repr
-voidRepr
- = do
- tycon <- builtin voidTyCon
- var <- builtin voidVar
- return $ VoidRepr {
- void_tycon = tycon
- , void_bottom = Var var
- }
-
-enumRepr :: VM Repr
-enumRepr
- = do
- tycon <- builtin enumerationTyCon
- let [data_con] = tyConDataCons tycon
- (arr_tycon, _) <- parrayReprTyCon (mkTyConApp tycon [])
- let [arr_data_con] = tyConDataCons arr_tycon
-
- return $ EnumRepr {
- enum_tycon = tycon
- , enum_data_con = data_con
- , enum_arr_tycon = arr_tycon
- , enum_arr_data_con = arr_data_con
- }
-
-unboxedProductRepr :: [Type] -> VM Repr
-unboxedProductRepr [] = voidRepr
-unboxedProductRepr [ty] = return $ IdRepr ty
-unboxedProductRepr tys = boxedProductRepr tys
-
-boxedProductRepr :: [Type] -> VM Repr
-boxedProductRepr tys
- = do
- tycon <- builtin (prodTyCon arity)
- let [data_con] = tyConDataCons tycon
-
- tys' <- mapM boxType tys
- (arr_tycon, _) <- parrayReprTyCon $ mkTyConApp tycon tys'
- let [arr_data_con] = tyConDataCons arr_tycon
-
- return $ ProdRepr {
- prod_components = tys
- , prod_tycon = tycon
- , prod_data_con = data_con
- , prod_arr_tycon = arr_tycon
- , prod_arr_data_con = arr_data_con
- }
- where
- arity = length tys
-
-sumRepr :: [Repr] -> VM Repr
-sumRepr [] = voidRepr
-sumRepr [repr] = boxRepr repr
-sumRepr reprs
- = do
- tycon <- builtin (sumTyCon arity)
- (arr_tycon, _) <- parrayReprTyCon
- . mkTyConApp tycon
- $ map reprType reprs
-
- let [arr_data_con] = tyConDataCons arr_tycon
-
- return $ SumRepr {
- sum_components = reprs
- , sum_tycon = tycon
- , sum_arr_tycon = arr_tycon
- , sum_arr_data_con = arr_data_con
- }
+data CompRepr = Keep Type
+ CoreExpr -- PR dictionary for the type
+ | Wrap Type
+
+data ProdRepr = EmptyProd
+ | UnaryProd CompRepr
+ | Prod { repr_tup_tc :: TyCon -- representation tuple tycon
+ , repr_ptup_tc :: TyCon -- PData representation tycon
+ , repr_comp_tys :: [Type] -- representation types of
+ , repr_comps :: [CompRepr] -- components
+ }
+data ConRepr = ConRepr DataCon ProdRepr
+
+data SumRepr = EmptySum
+ | UnarySum ConRepr
+ | Sum { repr_sum_tc :: TyCon -- representation sum tycon
+ , repr_psum_tc :: TyCon -- PData representation tycon
+ , repr_sel_ty :: Type -- type of selector
+ , repr_con_tys :: [Type] -- representation types of
+ , repr_cons :: [ConRepr] -- components
+ }
+
+tyConRepr :: TyCon -> VM SumRepr
+tyConRepr tc = sum_repr (tyConDataCons tc)