From 884c2669c433ac383c00e003cda66a1ac001d198 Mon Sep 17 00:00:00 2001
From: Ian Lynagh <igloo@earth.li>
Date: Fri, 14 Dec 2007 20:38:04 +0000
Subject: [PATCH] Fix freeze: It was trying to be safe, but in the end calling
 an unsafe function

---
 Data/Array/Base.hs | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/Data/Array/Base.hs b/Data/Array/Base.hs
index 9e024320..fdeeac62 100644
--- a/Data/Array/Base.hs
+++ b/Data/Array/Base.hs
@@ -1680,12 +1680,10 @@ freeze :: (Ix i, MArray a e m, IArray b e) => a i e -> m (b i e)
 freeze marr = do
   (l,u) <- getBounds marr
   n <- getNumElements marr
-  ies <- sequence [do e <- unsafeRead marr i; return (i,e)
-                   | i <- [0 .. n - 1]]
-  -- The old array may be lying about the number of elements in
-  -- (l,u), so recalculate it to be safe.
-  let n' = safeRangeSize (l,u)
-  return (unsafeArray (l,u) ies)
+  es <- mapM (unsafeRead marr) [0 .. n - 1]
+  -- The old array and index might not be well-behaved, so we need to
+  -- use the safe array creation function here.
+  return (listArray (l,u) es)
 
 #ifdef __GLASGOW_HASKELL__
 freezeSTUArray :: Ix i => STUArray s i e -> ST s (UArray i e)
-- 
GitLab