summaryrefslogtreecommitdiff
path: root/compiler/ghci
diff options
context:
space:
mode:
authorRoland Senn <rsx@bluewin.ch>2019-07-18 10:41:44 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-07-21 05:04:17 -0400
commit32be44613fed3fa7bff7190381acbdaa8ea15cfc (patch)
tree5c2c2fcadafb1d26386acba9d8ffe7d5ea7db256 /compiler/ghci
parent67ee741bd6a7017a62719c3c25a5447a0b03191e (diff)
downloadhaskell-32be44613fed3fa7bff7190381acbdaa8ea15cfc.tar.gz
Fix #8487: Debugger confuses variables
To display the free variables for a single breakpoint, GHCi pulls out the information from the fields `modBreaks_breakInfo` and `modBreaks_vars` of the `ModBreaks` data structure. For a specific breakpoint this gives 2 lists of types 'Id` (`Var`) and `OccName`. They are used to create the Id's for the free variables and must be kept in sync: If we remove an element from the Names list, then we also must remove the corresponding element from the OccNames list.
Diffstat (limited to 'compiler/ghci')
-rw-r--r--compiler/ghci/ByteCodeGen.hs4
-rw-r--r--compiler/ghci/ByteCodeTypes.hs6
2 files changed, 6 insertions, 4 deletions
diff --git a/compiler/ghci/ByteCodeGen.hs b/compiler/ghci/ByteCodeGen.hs
index 8b23e08003..12331e2d52 100644
--- a/compiler/ghci/ByteCodeGen.hs
+++ b/compiler/ghci/ByteCodeGen.hs
@@ -432,8 +432,8 @@ schemeER_wrk d p rhs
return $ breakInstr `consOL` code
| otherwise = schemeE d 0 p rhs
-getVarOffSets :: DynFlags -> StackDepth -> BCEnv -> [Id] -> [(Id, Word16)]
-getVarOffSets dflags depth env = catMaybes . map getOffSet
+getVarOffSets :: DynFlags -> StackDepth -> BCEnv -> [Id] -> [Maybe (Id, Word16)]
+getVarOffSets dflags depth env = map getOffSet
where
getOffSet id = case lookupBCEnv_maybe id env of
Nothing -> Nothing
diff --git a/compiler/ghci/ByteCodeTypes.hs b/compiler/ghci/ByteCodeTypes.hs
index 628b576ca0..0c0c34ad64 100644
--- a/compiler/ghci/ByteCodeTypes.hs
+++ b/compiler/ghci/ByteCodeTypes.hs
@@ -35,6 +35,7 @@ import Data.Array.Base ( UArray(..) )
import Data.ByteString (ByteString)
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
+import Data.Maybe (catMaybes)
import GHC.Exts.Heap
import GHC.Stack.CCS
@@ -110,14 +111,15 @@ instance NFData BCONPtr where
-- | Information about a breakpoint that we know at code-generation time
data CgBreakInfo
= CgBreakInfo
- { cgb_vars :: [(Id,Word16)]
+ { cgb_vars :: [Maybe (Id,Word16)]
, cgb_resty :: Type
}
+-- See Note [Syncing breakpoint info] in compiler/main/InteractiveEval.hs
-- Not a real NFData instance because we can't rnf Id or Type
seqCgBreakInfo :: CgBreakInfo -> ()
seqCgBreakInfo CgBreakInfo{..} =
- rnf (map snd cgb_vars) `seq`
+ rnf (map snd (catMaybes (cgb_vars))) `seq`
seqType cgb_resty
instance Outputable UnlinkedBCO where