- vfn_var <- hoistExpr FSLIT("vfn") poly_vfn
- lfn_var <- hoistExpr FSLIT("lfn") poly_lfn
-
- let (venv, lenv) = mkClosureEnvs info lc
-
- let env_ty = cenv_vty info
-
- pa_dict <- paDictOfType env_ty
-
- arg_ty <- vectType (varType bndr)
- res_ty <- vectType (exprType $ deAnnotate body)
-
- -- FIXME: move the functions to the top level
- mono_vfn <- applyToTypes (Var vfn_var) (map TyVarTy tyvars)
- mono_lfn <- applyToTypes (Var lfn_var) (map TyVarTy tyvars)
-
- mk_clo <- builtin mkClosureVar
- mk_cloP <- builtin mkClosurePVar
-
- let vclo = Var mk_clo `mkTyApps` [arg_ty, res_ty, env_ty]
- `mkApps` [pa_dict, mono_vfn, mono_lfn, venv]
-
- lclo = Var mk_cloP `mkTyApps` [arg_ty, res_ty, env_ty]
- `mkApps` [pa_dict, mono_vfn, mono_lfn, lenv]
-
- return (vclo, lclo)
-
-
-data CEnvInfo = CEnvInfo {
- cenv_vars :: [Var]
- , cenv_values :: [(CoreExpr, CoreExpr)]
- , cenv_vty :: Type
- , cenv_lty :: Type
- , cenv_repr_tycon :: TyCon
- , cenv_repr_tyargs :: [Type]
- , cenv_repr_datacon :: DataCon
- }
-
-mkCEnvInfo :: VarSet -> Var -> CoreExprWithFVs -> VM CEnvInfo
-mkCEnvInfo fvs arg body
- = do
- locals <- readLEnv local_vars
- let
- (vars, vals) = unzip
- [(var, val) | var <- varSetElems fvs
- , Just val <- [lookupVarEnv locals var]]
- vtys <- mapM (vectType . varType) vars
-
- (vty, repr_tycon, repr_tyargs, repr_datacon) <- mk_env_ty vtys
- lty <- mkPArrayType vty
-
- return $ CEnvInfo {
- cenv_vars = vars
- , cenv_values = vals
- , cenv_vty = vty
- , cenv_lty = lty
- , cenv_repr_tycon = repr_tycon
- , cenv_repr_tyargs = repr_tyargs
- , cenv_repr_datacon = repr_datacon
- }
- where
- mk_env_ty [vty]
- = return (vty, error "absent cinfo_repr_tycon"
- , error "absent cinfo_repr_tyargs"
- , error "absent cinfo_repr_datacon")
-
- mk_env_ty vtys
- = do
- let ty = mkCoreTupTy vtys
- (repr_tc, repr_tyargs) <- lookupPArrayFamInst ty
- let [repr_con] = tyConDataCons repr_tc
- return (ty, repr_tc, repr_tyargs, repr_con)
-
-
-
-mkClosureEnvs :: CEnvInfo -> CoreExpr -> (CoreExpr, CoreExpr)
-mkClosureEnvs info lc
- | [] <- vals
- = (Var unitDataConId, mkApps (Var $ dataConWrapId (cenv_repr_datacon info))
- [lc, Var unitDataConId])
-
- | [(vval, lval)] <- vals
- = (vval, lval)
-
- | otherwise
- = (mkCoreTup vvals, Var (dataConWrapId $ cenv_repr_datacon info)
- `mkTyApps` cenv_repr_tyargs info
- `mkApps` (lc : lvals))