Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/56c89c4098aa8679e5ad45b4db81de3b414f3ef5

>---------------------------------------------------------------

commit 56c89c4098aa8679e5ad45b4db81de3b414f3ef5
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Wed Apr 18 18:48:45 2012 +0100

    Ensure we can copy in lambdaBound bindigns for update frames in MSG

>---------------------------------------------------------------

 compiler/supercompile/Supercompile/Drive/MSG.hs |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/MSG.hs 
b/compiler/supercompile/Supercompile/Drive/MSG.hs
index dd08bff..b8bbe2a 100644
--- a/compiler/supercompile/Supercompile/Drive/MSG.hs
+++ b/compiler/supercompile/Supercompile/Drive/MSG.hs
@@ -509,10 +509,10 @@ msgPureHeap {- mm -} rn2 msg_s init_h_l init_h_r 
(k_bvs_l, k_fvs_l) (k_bvs_r, k_
                       -- Nothing      ==> unavailable for individual heap
                       -- Just Nothing ==> available for individual heap but 
already in it
                       -- Just Just    ==> available for individual heap and 
not in it yet
-    find init_h k_bvs h used x = case M.lookup x init_h of
+    find init_h k_bvs h used x = second (\individual -> if x `M.member` h then 
return (used, Nothing) else individual) $ case M.lookup x init_h of
          -- Variable bound by the heap (vastly common case):
-        Just hb | S.notMember x used -> (return (used', hb),  if x `M.member` 
h then return (used, Nothing) else return (used', Just hb))
-                | otherwise          -> (Left "used heap binding", if x 
`M.member` h then return (used, Nothing) else Left "used heap binding")
+        Just hb | S.notMember x used -> (return (used', hb),       return 
(used', Just hb))
+                | otherwise          -> (Left "used heap binding", Left "used 
heap binding")
           where used' | Just (_, e) <- heapBindingTerm hb
                       , not (termIsCheap e)
                       = S.insert x used
@@ -521,7 +521,7 @@ msgPureHeap {- mm -} rn2 msg_s init_h_l init_h_r (k_bvs_l, 
k_fvs_l) (k_bvs_r, k_
          -- By a process of elimination, variable must be bound be the stack. 
Normally it will in fact be bound by the "instance" portion
          -- of the stack because matches involving the common portion 
variables either already failed or were discharged by RnEnv2, but
          -- if "find" is called by "sucks" then this may not necessarily be 
the case
-        Nothing -> (Left "used stack binding", if x `elemVarSet` k_bvs then 
return (used, Nothing) else Left $ "used stack binding")
+        Nothing -> (Left "used stack binding", if x `elemVarSet` k_bvs then 
return (used, Just lambdaBound) else Left "used stack binding")
 
     suck :: PureHeap -> BoundVars -> PureHeap -> Var -> (S.Set Var, Maybe 
HeapBinding) -> MSG' (S.Set Var, PureHeap)
     suck _      _     h _ (used, Nothing) = return (used, h)                   
                                                                -- Already 
copied in



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to