@@ -745,7 +745,37 @@ cursorizeExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
745745 -- Exactly same as cursorizePackedExp
746746 LetRegionE reg sz _ bod -> do
747747 (region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv False reg sz
748- mkLets (region_lets) <$> cursorizeExp freeVarToVarEnv' lenv ddfs fundefs denv tenv senv bod
748+ let reg_var = regionToVar reg
749+ let reg_ty = case reg_var of
750+ SingleR {} -> MkTy2 CursorTy
751+ SoARv _ flr -> MkTy2 $ CursorArrayTy (1 + length flr)
752+
753+ reg_var_name <- case (M. lookup (fromRegVarToFreeVarsTy reg_var) freeVarToVarEnv') of
754+ Just var -> return var
755+ Nothing -> do
756+ case reg_var of
757+ SingleR v -> return v
758+ SoARv {} -> do
759+ n <- gensym " region_cursor_ptr"
760+ return n
761+
762+ -- For end of the region
763+ reg_var_name_end <- case (M. lookup (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) freeVarToVarEnv') of
764+ Just var -> return var
765+ Nothing -> do
766+ case reg_var of
767+ SingleR v -> return $ toEndV v
768+ SoARv {} -> do
769+ n <- gensym " region_cursor_ptr_end"
770+ return n
771+
772+ let freeVarToVarEnv'' = M. insert (fromRegVarToFreeVarsTy reg_var) reg_var_name freeVarToVarEnv'
773+ let freeVarToVarEnv''' = M. insert (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) reg_var_name_end freeVarToVarEnv''
774+
775+
776+ let tenv' = M. insert reg_var_name reg_ty tenv
777+ let tenv'' = M. insert reg_var_name_end reg_ty tenv'
778+ mkLets (region_lets) <$> cursorizeExp freeVarToVarEnv''' lenv ddfs fundefs denv tenv'' senv bod
749779
750780 LetParRegionE reg sz _ bod -> do
751781 (region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv True reg sz
@@ -768,7 +798,7 @@ cursorizeExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
768798 dereference_bound_var <- gensym " deref"
769799 let bnd = [(dereference_bound_var, [] , CursorTy , Ext $ DerefMutCursor bound_var)]
770800 pure (bnd, dereference_bound_var)
771- Nothing -> error " expected variable to have type!"
801+ Nothing -> error $ " expected variable to have type!: " ++ show bound_var
772802 _ -> pure ([] , bound_var)
773803 let cur_loc = toLocVar cur
774804 let cur_var = case (M. lookup (fromLocVarToFreeVarsTy cur_loc) freeVarToVarEnv) of
@@ -1501,7 +1531,37 @@ cursorizePackedExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
15011531
15021532 LetRegionE r sz _ bod -> do
15031533 (region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv False r sz
1504- onDi (mkLets (region_lets)) <$> go freeVarToVarEnv' tenv senv bod
1534+ let reg_var = regionToVar r
1535+ let reg_ty = case reg_var of
1536+ SingleR {} -> MkTy2 CursorTy
1537+ SoARv _ flr -> MkTy2 $ CursorArrayTy (1 + length flr)
1538+
1539+ reg_var_name <- case (M. lookup (fromRegVarToFreeVarsTy reg_var) freeVarToVarEnv') of
1540+ Just var -> return var
1541+ Nothing -> do
1542+ case reg_var of
1543+ SingleR v -> return v
1544+ SoARv {} -> do
1545+ n <- gensym " region_cursor_ptr"
1546+ return n
1547+
1548+ -- For end of the region
1549+ reg_var_name_end <- case (M. lookup (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) freeVarToVarEnv') of
1550+ Just var -> return var
1551+ Nothing -> do
1552+ case reg_var of
1553+ SingleR v -> return $ toEndV v
1554+ SoARv {} -> do
1555+ n <- gensym " region_cursor_ptr_end"
1556+ return n
1557+
1558+ let freeVarToVarEnv'' = M. insert (fromRegVarToFreeVarsTy reg_var) reg_var_name freeVarToVarEnv'
1559+ let freeVarToVarEnv''' = M. insert (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) reg_var_name_end freeVarToVarEnv''
1560+
1561+
1562+ let tenv' = M. insert reg_var_name reg_ty tenv
1563+ let tenv'' = M. insert reg_var_name_end reg_ty tenv'
1564+ onDi (mkLets (region_lets)) <$> go freeVarToVarEnv''' tenv'' senv bod
15051565
15061566 LetParRegionE r sz _ bod -> do
15071567 (region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv True r sz
0 commit comments