Skip to content

Commit 6f54f60

Browse files
committed
Merge branch '32-simplify-aspats-2' into 32-extended-syntax
2 parents 449910f + e2a5896 commit 6f54f60

File tree

29 files changed

+150
-225
lines changed

29 files changed

+150
-225
lines changed

grin/src/AbstractInterpretation/ExtendedSyntax/CreatedBy/CodeGen.hs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,7 @@ producesNode (Undefined T_NodeSet{}) = True
168168
producesNode _ = False
169169

170170
asPatternDataflow :: IR.Reg -> BPat -> CG ()
171-
asPatternDataflow r asPat@(AsPat _ asVal) = case asVal of
172-
Unit -> pure ()
173-
Lit{} -> pure ()
174-
Var v -> addReg v r
175-
ConstTagNode tag args -> do
171+
asPatternDataflow r asPat@(AsPat tag args _) = do
176172
irTag <- getTag tag
177173
bindInstructions <- forM (zip [1..] args) $ \(idx, arg) -> do
178174
argReg <- newReg
@@ -187,7 +183,6 @@ asPatternDataflow r asPat@(AsPat _ asVal) = case asVal of
187183
, srcReg = r
188184
, instructions = concat bindInstructions
189185
}
190-
valPat -> error $ "unsupported @pattern: " ++ show (PP asPat)
191186
asPatternDataflow _ pat = error $ "not @pattern: " ++ show (PP pat)
192187

193188
{- NOTE: para is needed to specify the order of evalution of the lhs and rhs on binds.
@@ -227,17 +222,10 @@ codeGen e = flip evalState emptyCGState $ para folder e >> mkCByProgramM where
227222
cgRhs
228223

229224
-- NOTE: @patterns
230-
EBindF (lhs, cgLhs) asPat@(AsPat var valPat) (_, cgRhs) -> do
225+
EBindF (lhs, cgLhs) asPat@(AsPat tag args var) (_, cgRhs) -> do
231226
lhsRes <- cgLhs
232227
case lhsRes of
233-
Z -> do
234-
r <- newReg
235-
emit IR.Set {dstReg = r, constant = IR.CSimpleType unitType}
236-
addReg var r
237-
case valPat of
238-
Unit -> pure ()
239-
Var inner -> addReg inner r
240-
_ -> error $ "pattern mismatch at CreatedBy bind codegen, expected Unit got " ++ show (PP valPat)
228+
Z -> error $ "pattern mismatch at CreatedBy bind codegen, expected Unit got " ++ show (PP $ ConstTagNode tag args)
241229
R r -> do
242230
case lhs of
243231
SReturn val | producesNode val -> do

grin/src/AbstractInterpretation/ExtendedSyntax/EffectTracking/CodeGen.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ codeGenM = cata folder where
6666
let R rhsReg = rhs
6767

6868
case bPat of
69-
VarPat var -> addReg var lhsReg
70-
AsPat var _ -> addReg var lhsReg
69+
VarPat var -> addReg var lhsReg
70+
AsPat _ _ var -> addReg var lhsReg
7171

7272
emit IR.Move { srcReg = lhsReg, dstReg = rhsReg }
7373
pure $ R rhsReg

grin/src/AbstractInterpretation/ExtendedSyntax/HeapPointsTo/CodeGen.hs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,28 +176,14 @@ codeGenM = cata folder where
176176
EBindF leftExp bpat rightExp -> do
177177
leftExp >>= \case
178178
Z -> case bpat of
179-
AsPat varName Unit -> do
180-
r <- newReg
181-
emit IR.Set {dstReg = r, constant = IR.CSimpleType unitType}
182-
addReg varName r
183179
VarPat varName -> do
184180
r <- newReg
185181
emit IR.Set {dstReg = r, constant = IR.CSimpleType unitType}
186182
addReg varName r
187183
_ -> error $ "pattern mismatch at HPT bind codegen, Unit cannot be matched against " ++ show bpat
188184
R r -> case bpat of -- QUESTION: should the evaluation continue if the pattern does not match yet?
189185
VarPat varName -> addReg varName r
190-
AsPat varName Unit -> do
191-
addReg varName r
192-
pure () -- TODO: is this ok? or error?
193-
-- NOTE: I think this is okay. Could be optimised though (since we already know the result)?
194-
AsPat varName Lit{} -> do
195-
addReg varName r
196-
pure () -- TODO: is this ok? or error?
197-
AsPat v1 (Var v2) -> do
198-
addReg v1 r
199-
addReg v2 r
200-
AsPat varName (ConstTagNode tag args) -> do
186+
AsPat tag args varName -> do
201187
addReg varName r
202188
irTag <- getTag tag
203189
bindInstructions <- forM (zip [0..] args) $ \(idx, name) -> do

grin/src/AbstractInterpretation/ExtendedSyntax/LiveVariable/CodeGen.hs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -237,16 +237,7 @@ codeGenM e = (cata folder >=> const setMainLive) e
237237

238238
case bPat of
239239
VarPat v -> mkRegsThenVarPatternDataFlow v
240-
AsPat v Unit -> do
241-
setBasicValLive lhsReg
242-
mkRegsThenVarPatternDataFlow v
243-
AsPat v Lit{} -> do
244-
setBasicValLive lhsReg
245-
mkRegsThenVarPatternDataFlow v
246-
AsPat v1 (Var v2) -> do
247-
mkRegsThenVarPatternDataFlow v1
248-
mkRegsThenVarPatternDataFlow v2
249-
AsPat v (ConstTagNode tag args) -> do
240+
AsPat tag args v -> do
250241
irTag <- getTag tag
251242
setTagLive irTag lhsReg
252243
bindInstructions <- codeGenBlock_ $ forM (zip [1..] args) $ \(idx, arg) -> do

grin/src/Grin/ExtendedSyntax/Grin.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ instance FoldNames Val where
2525

2626
instance FoldNames BPat where
2727
foldNames f = \case
28-
VarPat v -> f v
29-
AsPat v val -> f v <> foldNames f val
28+
VarPat v -> f v
29+
AsPat t vs v -> f v <> foldNames f (ConstTagNode t vs)
3030

3131

3232
instance FoldNames CPat where
@@ -54,6 +54,7 @@ _Lit :: Traversal' Val Lit
5454
_Lit f (Lit l) = Lit <$> f l
5555
_Lit _ rest = pure rest
5656

57+
-- NOTE: This will return NM "" for everyrhing that is not a Var
5758
_Var :: Traversal' Val Name
5859
_Var f (Var name) = Var <$> f name
5960
_Var _ rest = pure rest

grin/src/Grin/ExtendedSyntax/Lint.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ lint warningKinds mTypeEnv exp@(Program exts _) =
310310
when (isn't _OnlyVarPat bPat) $ do
311311
forM_ mTypeEnv $ \typeEnv -> do
312312
fromMaybe (pure ()) $ case bPat of
313-
AsPat v val -> do -- Maybe
314-
expectedPatType <- normalizeType <$> mTypeOfValTE typeEnv val
313+
AsPat tag fields v -> do -- Maybe
314+
expectedPatType <- normalizeType <$> mTypeOfValTE typeEnv (ConstTagNode tag fields)
315315
lhsType <- normalizeType <$> extract leftExp
316316
pure $ do -- Lint
317317
-- NOTE: This can still give false positive errors, because bottom-up typing can only approximate the result of HPT.

grin/src/Grin/ExtendedSyntax/Nametable.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ convert = second (view nametable) . flip runState emptyNS . cata build where
8686
ProgramF es defs -> Program <$> mapM external es <*> sequence defs
8787
DefF fn ps body -> Def <$> (nameToIdx fn) <*> (mapM nameToIdx ps) <*> body
8888
EBindF l (VarPat v) r -> EBind <$> l <*> (VarPat <$> nameToIdx v) <*> r
89-
EBindF l (AsPat var val) r -> EBind <$> l <*> (AsPat <$> nameToIdx var <*> value val) <*> r
89+
EBindF l (AsPat t vars v) r -> EBind <$> l <*> (AsPat <$> tag t <*> mapM nameToIdx vars <*> nameToIdx v) <*> r
9090
ECaseF v alts -> ECase <$> nameToIdx v <*> sequence alts
9191
SAppF v ps -> SApp <$> nameToIdx v <*> (mapM nameToIdx ps)
9292
SReturnF v -> SReturn <$> value v
@@ -107,7 +107,7 @@ restore (exp, nt) = cata build exp where
107107
ProgramF es defs -> Program (map rexternal es) defs
108108
DefF fn ps body -> Def (rname fn) (map rname ps) body
109109
EBindF l (VarPat v) r -> EBind l (VarPat $ rname v) r
110-
EBindF l (AsPat var val) r -> EBind l (AsPat (rname var) (rvalue val)) r
110+
EBindF l (AsPat t vs v) r -> EBind l (AsPat (rtag t) (map rname vs) (rname v)) r
111111
ECaseF v alts -> ECase (rname v) alts
112112
SAppF v ps -> SApp (rname v) (map rname ps)
113113
SReturnF v -> SReturn (rvalue v)

grin/src/Grin/ExtendedSyntax/Parse/AST.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ alternative i = Alt <$> try (L.indentGuard sc EQ i *> altPat) <*> (op "@" *> var
5454
-- and we don't want to parenthesize variables, literals and units.
5555
bindingPat :: Parser BPat
5656
bindingPat =
57-
try (flip AsPat <$> value <*> (op "@" *> var)) <|>
58-
VarPat <$> var
57+
VarPat <$> var <|>
58+
mkAsPat <$> parens ((,) <$> tag <*> many var) <*> (op "@" *> var)
59+
where mkAsPat (tag, fields) var = AsPat tag fields var
5960

6061

6162
altPat :: Parser CPat

grin/src/Grin/ExtendedSyntax/Pretty.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ instance Pretty Lit where
144144

145145
instance Pretty BPat where
146146
pretty = \case
147-
VarPat v -> pretty v
148-
AsPat v pat -> pretty pat <+> pretty '@' <+> pretty v
147+
VarPat v -> pretty v
148+
AsPat tag fields v -> pretty (ConstTagNode tag fields) <+> pretty '@' <+> pretty v
149149

150150
instance Pretty CPat where
151151
pretty = \case

grin/src/Grin/ExtendedSyntax/Statistics.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ statistics = cata $ \case
6767
e -> Data.Foldable.fold e
6868

6969
tagInBPat :: BPat -> Set.Set Tag
70-
tagInBPat (AsPat var (ConstTagNode t _)) = Set.singleton t
70+
tagInBPat (AsPat t _ _) = Set.singleton t
7171
tagInBPat _ = mempty
7272

7373

0 commit comments

Comments
 (0)