Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/bd7d252bf86c937d56e146775a46fff346047582 >--------------------------------------------------------------- commit bd7d252bf86c937d56e146775a46fff346047582 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Thu Feb 16 08:45:29 2012 +0000 Let the splitBy functions report failure >--------------------------------------------------------------- .../supercompile/Supercompile/Drive/Process1.hs | 4 ++-- .../supercompile/Supercompile/Drive/Process3.hs | 2 +- compiler/supercompile/Supercompile/Drive/Split.hs | 6 +++--- compiler/supercompile/Supercompile/Utilities.hs | 9 +++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Process1.hs b/compiler/supercompile/Supercompile/Drive/Process1.hs index 336b032..73c5073 100644 --- a/compiler/supercompile/Supercompile/Drive/Process1.hs +++ b/compiler/supercompile/Supercompile/Drive/Process1.hs @@ -70,7 +70,7 @@ data Promise = P { instance MonadStatics ScpBM where bindCapturedFloats = bindFloats - monitorFVs mx = ScpM $ \e s k -> unScpM mx e s (\x s' -> let (fss_delta, _fss_common) = splitByReverse (pTreeHole s) (pTreeHole s') + monitorFVs mx = ScpM $ \e s k -> unScpM mx e s (\x s' -> let (Right fss_delta, _fss_common) = splitByReverse (pTreeHole s) (pTreeHole s') in k (unionVarSets [fvedTermFreeVars e' | (_, e') <- concatMap fulfilmentTreeFulfilments fss_delta], x) s') -- Note [Floating h-functions past the let-bound variables to which they refer] @@ -347,7 +347,7 @@ catchScpM :: ((forall b. c -> ScpBM b) -> ScpBM a) -- ^ Action to try: supplies catchScpM f_try f_abort = ScpM $ \e s k -> unScpM (f_try (\c -> ScpM $ \e' s' _k' -> unScpM (f_abort c) e (if False -- dISCARD_FULFILMENTS_ON_ROLLBACK then s - else let (fss_candidates, _fss_common) = splitByReverse (pTreeContext e) (pTreeContext e') + else let (Right fss_candidates, _fss_common) = splitByReverse (pTreeContext e) (pTreeContext e') -- Since we are rolling back we need to float as many of the fulfilments created in between here and the rollback point -- upwards. This means that we don't lose the work that we already did to supercompile those bindings. diff --git a/compiler/supercompile/Supercompile/Drive/Process3.hs b/compiler/supercompile/Supercompile/Drive/Process3.hs index c69cffd..0778d6b 100644 --- a/compiler/supercompile/Supercompile/Drive/Process3.hs +++ b/compiler/supercompile/Supercompile/Drive/Process3.hs @@ -72,7 +72,7 @@ leftExtension :: Train a b -- ^ Longer list -> Train a b -- ^ Shorter list -> ([a], Train a b) -- Pair of the prefix present in the longer list and the common suffix (== shorter list) leftExtension xs_train ys_train = (reverse prefix_rev, ys_train) - where (prefix_rev, _suffix_rev) = splitBy (trainCars ys_train) (reverse (trainCars xs_train)) -- NB: we actually assume ys == suffix_rev + where (prefix_rev, Right _suffix_rev) = splitBy (trainCars ys_train) (reverse (trainCars xs_train)) -- NB: we actually assume ys == suffix_rev data MemoState = MS { diff --git a/compiler/supercompile/Supercompile/Drive/Split.hs b/compiler/supercompile/Supercompile/Drive/Split.hs index 41867dd..3a7388a 100644 --- a/compiler/supercompile/Supercompile/Drive/Split.hs +++ b/compiler/supercompile/Supercompile/Drive/Split.hs @@ -435,7 +435,7 @@ zipBracketeds (TailsUnknown bshell bholes) = TailsUnknown (Shell shell_tags shel = (plusResidTags shell_extra_tags (bracketedExtraTags rbracketed), shell_extra_fvs `unionVarSet` nonRecBindersFreeVars bvs (bracketedExtraFvs rbracketed), \es rev_es' -> case splitBy (bracketedHoles rbracketed) es of - (es_here, es_later) -> shell_wrapper es_later (shellWrapper (bracketedShell rbracketed) es_here:rev_es'), + (es_here, Right es_later) -> shell_wrapper es_later (shellWrapper (bracketedShell rbracketed) es_here:rev_es'), bracketedHoles rbracketed ++ holes) where rbracketed = rigidizeBracketed bracketed zipBracketeds (TailsKnown bty mk_bshell bholes) = case ei_holes of @@ -450,12 +450,12 @@ zipBracketeds (TailsKnown bty mk_bshell bholes) = case ei_holes of -> (\ty -> plusResidTags (shell_extra_tags ty) (shellExtraTags (mk_shell ty)), \ty -> shell_extra_fvs ty `unionVarSet` nonRecBindersFreeVars bvs (shellExtraFvs (mk_shell ty)), \ty es rev_es' -> case splitBy holes' es of - (es_here, es_later) -> shell_wrapper ty es_later (shellWrapper (mk_shell ty) es_here:rev_es'), + (es_here, Right es_later) -> shell_wrapper ty es_later (shellWrapper (mk_shell ty) es_here:rev_es'), Right (holes' ++ holes)) _ -> (\ty -> plusResidTags (shell_extra_tags ty) (bracketedExtraTags rbracketed), \ty -> shell_extra_fvs ty `unionVarSet` nonRecBindersFreeVars bvs (bracketedExtraFvs rbracketed), \ty es rev_es' -> case splitBy (bracketedHoles rbracketed) es of - (es_here, es_later) -> shell_wrapper ty es_later (shellWrapper (bracketedShell rbracketed) es_here:rev_es'), + (es_here, Right es_later) -> shell_wrapper ty es_later (shellWrapper (bracketedShell rbracketed) es_here:rev_es'), case ei_holes of Left holes -> Left (bracketedHoles rbracketed ++ holes) Right holes | is_tail -> Left (bracketedHoles rbracketed ++ map tailishHole holes) | otherwise -> Right (map (TailishHole False) (bracketedHoles rbracketed) ++ holes)) diff --git a/compiler/supercompile/Supercompile/Utilities.hs b/compiler/supercompile/Supercompile/Utilities.hs index 44f2d3c..c22a6af 100644 --- a/compiler/supercompile/Supercompile/Utilities.hs +++ b/compiler/supercompile/Supercompile/Utilities.hs @@ -425,12 +425,13 @@ safeTail (_:xs) = xs expectHead :: String -> [a] -> a expectHead s = expectJust s . safeHead -splitBy :: [b] -> [a] -> ([a], [a]) -splitBy [] xs = ([], xs) +splitBy :: [b] -> [a] -> ([a], Either [b] [a]) +splitBy [] xs = ([], Right xs) +splitBy (y:ys) [] = ([], Left (y:ys)) splitBy (_:ys) (x:xs) = first (x:) $ splitBy ys xs -splitByReverse :: [b] -> [a] -> ([a], [a]) -splitByReverse ys xs = case splitBy ys (reverse xs) of (xs1, xs2) -> (reverse xs2, reverse xs1) +splitByReverse :: [b] -> [a] -> (Either [b] [a], [a]) +splitByReverse ys xs = case splitBy (reverse ys) (reverse xs) of (xs1, ei_ys1_xs2) -> (either (Left . reverse) (Right . reverse) ei_ys1_xs2, reverse xs1) listContexts :: [a] -> [([a], a, [a])] listContexts xs = zipWith (\is (t:ts) -> (is, t, ts)) (inits xs) (init (tails xs)) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc