Skip to content

Commit 94d3a39

Browse files
committed
WIP
1 parent 567c8f0 commit 94d3a39

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

haskell-debugger-view/src/GHC/Debugger/View/Class.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,12 @@ instance DebugView (a, b) where
162162
, ("snd", VarFieldValue y) ]
163163

164164
instance DebugView [a] where
165-
debugValue _ = simpleValue "[]" True
165+
debugValue [] = simpleValue "[]" False
166+
debugValue (x:xs) = simpleValue "[...]" True
166167
debugFields v = VarFields <$> go 0 v
167168
where
168169
go :: Int -> [a] -> Program [(String, VarFieldValue)]
170+
go 50 xs = pure [("tail", VarFieldValue xs)]
169171
go _ [] = pure []
170172
go n (x:xs) = ((show n, VarFieldValue x) :) <$>
171173
(ifP (isThunk xs) (pure $ [("tail", VarFieldValue xs)])

haskell-debugger/GHC/Debugger/Runtime/Instances.hs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import GHC.Runtime.Interpreter as Interp
1515
import GHC.Types.Name (nameOccName)
1616
import GHC.Types.Name.Occurrence (occNameString)
1717
import qualified GHC.Debugger.Logger as Logger
18-
import GHC.Utils.Outputable (text, (<+>), ppr)
18+
import GHC.Utils.Outputable (text, (<+>), ppr, ($$))
19+
import GHC.Utils.Panic
1920
import Control.Monad.Reader
2021
import GHC.Core.TyCo.Compare
2122
import GHC.Driver.Config
23+
import GHC.Stack
2224

2325

2426

@@ -104,22 +106,41 @@ checkType ty = do
104106
t <- anyTerm
105107
unless (termType t `eqType` ty) (parseError (TermParseError "ty mismatch"))
106108

109+
traceTerm :: HasCallStack => TermParser ()
110+
traceTerm = do
111+
t <- anyTerm
112+
liftDebugger $ logSDoc Logger.Debug (ppr t $$ callStackDoc)
113+
107114
-- | Evaluate the currently focused term
108-
seqTermP :: TermParser a -> TermParser a
115+
seqTermP :: HasCallStack => TermParser a -> TermParser a
109116
seqTermP term_parser = do
110117
t <- anyTerm
111118
hsc_env <- liftDebugger $ getSession
112119
focus (liftIO $ seqTerm hsc_env t)
113120
term_parser
114121

122+
refreshTerm :: TermParser Term
123+
refreshTerm = do
124+
t <- anyTerm
125+
hsc_env <- liftDebugger $ getSession
126+
case t of
127+
Suspension {} -> do
128+
liftDebugger $ logSDoc Logger.Debug (ppr t <+> ppr (ty t))
129+
t' <- liftDebugger $ liftIO $ cvObtainTerm hsc_env 2 False (ty t) (val t)
130+
liftDebugger $ logSDoc Logger.Debug (ppr t' <+> ppr (ty t'))
131+
return t'
132+
_ -> return t
133+
134+
135+
115136
-- | Change the focus of the term parser onto the specified term.
116137
focus :: TermParser Term -> TermParser a -> TermParser a
117138
focus parse_term term_parser =
118139
parse_term >>= \t ->
119140
TermParser $ \_ -> runTermParser term_parser t
120141

121142
-- | Focus on a new subtree, after forcing it to WHNF.
122-
focusSeq :: TermParser Term -> TermParser a -> TermParser a
143+
focusSeq :: HasCallStack => TermParser Term -> TermParser a -> TermParser a
123144
focusSeq parse_term term_parser = focus parse_term (seqTermP term_parser)
124145

125146
subtermTerm :: Int -> TermParser Term
@@ -128,6 +149,7 @@ subtermTerm idx = do
128149
case t of
129150
Term{subTerms}
130151
| idx < length subTerms -> do
152+
liftDebugger $ logSDoc Logger.Debug (ppr subTerms)
131153
pure (subTerms !! idx)
132154
| otherwise -> parseError (TermParseError $ "missing subterm index " <> show idx)
133155
other -> parseError (TermParseError $ "expected Term with subterms, got " <> termTag other)
@@ -188,8 +210,9 @@ newtypeWrapParser = do
188210

189211
-- | Is the current focus a suspension?
190212
isSuspension :: TermParser Bool
191-
isSuspension = do
213+
isSuspension = focus refreshTerm $ do
192214
t <- anyTerm
215+
traceTerm
193216
case t of
194217
Suspension{} -> pure True
195218
other -> do
@@ -292,7 +315,8 @@ programTermParser =
292315
programAskThunkParser = do
293316
matchConstructorTerm "ProgramAskThunk"
294317
-- Get what we need to check THUNKiness for
295-
is_thunk <- focus (subtermTerm 0) isSuspension
318+
traceTerm
319+
is_thunk <- focus (subtermTerm 1) isSuspension
296320
liftDebugger $ logSDoc Logger.Debug (text "is_thunk" <+> ppr is_thunk )
297321
bool_fv <- liftDebugger $ reifyBool is_thunk
298322
hsc_env <- liftDebugger $ getSession

haskell-debugger/GHC/Debugger/Runtime/Term/Cache.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ lookupTermCache = lookupTermKeyMap
3131
--
3232
-- Overwrites existing values.
3333
insertTermCache :: TermKey -> Term -> TermCache -> TermCache
34-
insertTermCache = insertTermKeyMap
34+
insertTermCache _ _ tc = tc -- insertTermKeyMap
3535

3636
--------------------------------------------------------------------------------
3737
-- * TermKeyMap

test/integration-tests/data/T47a/Main.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ data Y = Y String
88
deriving Show
99

1010
instance DebugView X where
11-
debugValue _ = VarValue "SDJFLSKDJFLKSDJFLSJDKFL" True
12-
debugFields (X s) = VarFields
11+
debugValue _ = simpleValue "SDJFLSKDJFLKSDJFLSJDKFL" True
12+
debugFields (X s) = pure $ VarFields
1313
[ ("field1", (VarFieldValue s))
1414
, ("myfield2", (VarFieldValue (length s)))
1515
, ("field4", (VarFieldValue (2345 :: Int)))

0 commit comments

Comments
 (0)