@@ -32,6 +32,7 @@ import Control.Monad.Primitive
3232import Data.IORef
3333import Data.Primitive.SmallArray
3434import GHC.Exts (Any)
35+import GHC.Stack (HasCallStack)
3536import Unsafe.Coerce
3637import qualified Data.IntMap.Strict as IM
3738
@@ -178,8 +179,8 @@ cloneEnv (Env forks@(Forks _ baseIx lref0 _) gref0 gen0) = do
178179 EnvRef _ es0 fs0 <- readIORef gref0
179180 EnvRef n _ _ <- readIORef lref0
180181 let len = baseIx + n
181− es <- newSmallArray len (error "undefined field")
182− fs <- newSmallArray len (error "undefined field")
182+ es <- newSmallArray len undefinedData
183+ fs <- newSmallArray len undefinedData
183184 baseN <- copyForks es fs len forks
184185 copySmallMutableArray es 0 es0 0 baseN
185186 copySmallMutableArray fs 0 fs0 0 baseN
@@ -364,10 +365,10 @@ unsafeConsEnv e f (Env fork gref gen) = case fork of
364365 writeIORef ref $! EnvRef (n + 1) es0 fs0
365366 EQ -> do
366367 let len = doubleCapacity len0
367− es <- newSmallArray len (error "undefined field")
368+ es <- newSmallArray len undefinedData
368369 copySmallMutableArray es 0 es0 0 len0
369370 e `seq` writeSmallArray es n (toAny e)
370− fs <- newSmallArray len (error "undefined field")
371+ fs <- newSmallArray len undefinedData
371372 copySmallMutableArray fs 0 fs0 0 len0
372373 f `seq` writeSmallArray fs n (toAny f)
373374 writeIORef ref $! EnvRef (n + 1) es fs
@@ -393,8 +394,8 @@ unsafeTailEnv len (Env fork gref gen) = case fork of
393394 if k /= n - 1
394395 then error $ "k (" ++ show k ++ ") /= n - 1 (" ++ show (n - 1) ++ ")"
395396 else do
396− writeSmallArray es k (error "undefined field")
397− writeSmallArray fs k (error "undefined field")
397+ writeSmallArray es k undefinedData
398+ writeSmallArray fs k undefinedData
398399 writeIORef ref $! EnvRef k es fs
399400{-# NOINLINE unsafeTailEnv #-}
400401
@@ -436,10 +437,13 @@ unsafeStateEnv f env = do
436437----------------------------------------
437438-- Internal helpers
438439
440+undefinedData :: HasCallStack => a
441+undefinedData = error "undefined data"
442+
439443emptyEnvRef :: IO (IORef EnvRef)
440444emptyEnvRef = do
441− es <- newSmallArray 0 (error "undefined field")
442− fs <- newSmallArray 0 (error "undefined field")
445+ es <- newSmallArray 0 undefinedData
446+ fs <- newSmallArray 0 undefinedData
443447 newIORef $ EnvRef 0 es fs
444448
445449-- | Determine location of the data type in the environment.