on master help sign in
Use undefinedData instead of repeating error "undefined field"
dce8558Andrzej Rybczak
src/Effectful/Internal/Env.hs+12−8
@@ -32,6 +32,7 @@ import Control.Monad.Primitive
32import Data.IORef
32import Data.IORef
33import Data.Primitive.SmallArray
33import Data.Primitive.SmallArray
34import GHC.Exts (Any)
34import GHC.Exts (Any)
35+import GHC.Stack (HasCallStack)
35import Unsafe.Coerce
36import Unsafe.Coerce
36import qualified Data.IntMap.Strict as IM
37import qualified Data.IntMap.Strict as IM
37
38
@@ -178,8 +179,8 @@ cloneEnv (Env forks@(Forks _ baseIx lref0 _) gref0 gen0) = do
178 EnvRef _ es0 fs0 <- readIORef gref0
179 EnvRef _ es0 fs0 <- readIORef gref0
179 EnvRef n _ _ <- readIORef lref0
180 EnvRef n _ _ <- readIORef lref0
180 let len = baseIx + n
181 let len = baseIx + n
181− es <- newSmallArray len (error "undefined field")
182+ es <- newSmallArray len undefinedData
182− fs <- newSmallArray len (error "undefined field")
183+ fs <- newSmallArray len undefinedData
183 baseN <- copyForks es fs len forks
184 baseN <- copyForks es fs len forks
184 copySmallMutableArray es 0 es0 0 baseN
185 copySmallMutableArray es 0 es0 0 baseN
185 copySmallMutableArray fs 0 fs0 0 baseN
186 copySmallMutableArray fs 0 fs0 0 baseN
@@ -364,10 +365,10 @@ unsafeConsEnv e f (Env fork gref gen) = case fork of
364 writeIORef ref $! EnvRef (n + 1) es0 fs0
365 writeIORef ref $! EnvRef (n + 1) es0 fs0
365 EQ -> do
366 EQ -> do
366 let len = doubleCapacity len0
367 let len = doubleCapacity len0
367− es <- newSmallArray len (error "undefined field")
368+ es <- newSmallArray len undefinedData
368 copySmallMutableArray es 0 es0 0 len0
369 copySmallMutableArray es 0 es0 0 len0
369 e `seq` writeSmallArray es n (toAny e)
370 e `seq` writeSmallArray es n (toAny e)
370− fs <- newSmallArray len (error "undefined field")
371+ fs <- newSmallArray len undefinedData
371 copySmallMutableArray fs 0 fs0 0 len0
372 copySmallMutableArray fs 0 fs0 0 len0
372 f `seq` writeSmallArray fs n (toAny f)
373 f `seq` writeSmallArray fs n (toAny f)
373 writeIORef ref $! EnvRef (n + 1) es fs
374 writeIORef ref $! EnvRef (n + 1) es fs
@@ -393,8 +394,8 @@ unsafeTailEnv len (Env fork gref gen) = case fork of
393 if k /= n - 1
394 if k /= n - 1
394 then error $ "k (" ++ show k ++ ") /= n - 1 (" ++ show (n - 1) ++ ")"
395 then error $ "k (" ++ show k ++ ") /= n - 1 (" ++ show (n - 1) ++ ")"
395 else do
396 else do
396− writeSmallArray es k (error "undefined field")
397+ writeSmallArray es k undefinedData
397− writeSmallArray fs k (error "undefined field")
398+ writeSmallArray fs k undefinedData
398 writeIORef ref $! EnvRef k es fs
399 writeIORef ref $! EnvRef k es fs
399{-# NOINLINE unsafeTailEnv #-}
400{-# NOINLINE unsafeTailEnv #-}
400
401
@@ -436,10 +437,13 @@ unsafeStateEnv f env = do
436----------------------------------------
437----------------------------------------
437-- Internal helpers
438-- Internal helpers
438
439
440+undefinedData :: HasCallStack => a
441+undefinedData = error "undefined data"
442+
439emptyEnvRef :: IO (IORef EnvRef)
443emptyEnvRef :: IO (IORef EnvRef)
440emptyEnvRef = do
444emptyEnvRef = do
441− es <- newSmallArray 0 (error "undefined field")
445+ es <- newSmallArray 0 undefinedData
442− fs <- newSmallArray 0 (error "undefined field")
446+ fs <- newSmallArray 0 undefinedData
443 newIORef $ EnvRef 0 es fs
447 newIORef $ EnvRef 0 es fs
444
448
445-- | Determine location of the data type in the environment.
449-- | Determine location of the data type in the environment.