+getBindName :: VM FastString
+getBindName = readLEnv local_bind_name
+
+inBind :: Id -> VM a -> VM a
+inBind id p
+ = do updLEnv $ \env -> env { local_bind_name = occNameFS (getOccName id) }
+ p
+
+lookupRdrName :: RdrName -> VM Name
+lookupRdrName rdr_name
+ = do
+ rdr_env <- readGEnv global_rdr_env
+ case lookupGRE_RdrName rdr_name rdr_env of
+ [gre] -> return (gre_name gre)
+ [] -> pprPanic "VectMonad.lookupRdrName: not found" (ppr rdr_name)
+ _ -> pprPanic "VectMonad.lookupRdrName: ambiguous" (ppr rdr_name)
+
+lookupRdrVar :: RdrName -> VM Var
+lookupRdrVar rdr_name
+ = do
+ name <- lookupRdrName rdr_name
+ liftDs (dsLookupGlobalId name)
+
+cloneName :: (OccName -> OccName) -> Name -> VM Name
+cloneName mk_occ name = liftM make (liftDs newUnique)
+ where
+ occ_name = mk_occ (nameOccName name)
+
+ make u | isExternalName name = mkExternalName u (nameModule name)
+ occ_name
+ (nameSrcSpan name)
+ | otherwise = mkSystemName u occ_name
+
+cloneId :: (OccName -> OccName) -> Id -> Type -> VM Id
+cloneId mk_occ id ty
+ = do
+ name <- cloneName mk_occ (getName id)
+ let id' | isExportedId id = Id.mkExportedLocalId name ty
+ | otherwise = Id.mkLocalId name ty
+ return id'
+
+newExportedVar :: OccName -> Type -> VM Var
+newExportedVar occ_name ty
+ = do
+ mod <- liftDs getModuleDs
+ u <- liftDs newUnique
+
+ let name = mkExternalName u mod occ_name noSrcSpan
+
+ return $ Id.mkExportedLocalId name ty
+