Skip to content

Commit

Permalink
Avoid concatenating Text values in termToPat.
Browse files Browse the repository at this point in the history
Fixes #1263.

We now use `identBaseName` instead of `identText` in the `termToPat`
definition. While `identText` concatenates the module name and base
name, `identBaseName` just returns the base name directly.

Using only the base name means that there is a chance of name collisions
between constants that differ only by module name. However, term nets
are only used as an approximate filter prior to term matching; it is
not a problem if a few extra hits are returned from time to time.

Ultimately it might be better to replace the use of `Text` in the term
net `Atom` constructor with a more specialized key type; for example
with `ExtCns` names we could use the `VarIndex` for matching. However,
this would require modifying the term net library.
  • Loading branch information
Brian Huffman committed Apr 28, 2021
1 parent 7b8c134 commit 481c618
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 7 deletions.
6 changes: 3 additions & 3 deletions saw-core/src/Verifier/SAW/Conversion.hs
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ resolveArgs (Matcher p m) (defaultArgsMatcher -> args@(ArgsMatcher pl _)) =

-- | Match a global definition.
asGlobalDef :: Ident -> Matcher ()
asGlobalDef ident = Matcher (Net.Atom (identText ident)) f
asGlobalDef ident = Matcher (Net.Atom (identBaseName ident)) f
where f (R.asGlobalDef -> Just o) | ident == o = return ()
f _ = Nothing

Expand Down Expand Up @@ -262,15 +262,15 @@ asRecordSelector m = asVar $ \t -> _1 (runMatcher m) =<< R.asRecordSelector t

-- | Match a constructor
asCtor :: ArgsMatchable v a => Ident -> v a -> Matcher a
asCtor o = resolveArgs $ Matcher (Net.Atom (identText o)) match
asCtor o = resolveArgs $ Matcher (Net.Atom (identBaseName o)) match
where match t = do
CtorApp c params l <- R.asFTermF t
guard (c == o)
return (params ++ l)

-- | Match a datatype.
asDataType :: ArgsMatchable v a => Ident -> v a -> Matcher a
asDataType o = resolveArgs $ Matcher (Net.Atom (identText o)) match
asDataType o = resolveArgs $ Matcher (Net.Atom (identBaseName o)) match
where match t = do
DataTypeApp dt params l <- R.asFTermF t
guard (dt == o)
Expand Down
8 changes: 4 additions & 4 deletions saw-core/src/Verifier/SAW/Term/Functor.hs
Original file line number Diff line number Diff line change
Expand Up @@ -344,15 +344,15 @@ instance Net.Pattern Term where
termToPat :: Term -> Net.Pat
termToPat t =
case unwrapTermF t of
Constant ec _ -> Net.Atom (toAbsoluteName (ecName ec))
Constant ec _ -> Net.Atom (toShortName (ecName ec))
App t1 t2 -> Net.App (termToPat t1) (termToPat t2)
FTermF (Primitive ec) -> Net.Atom (toAbsoluteName (ecName ec))
FTermF (Primitive ec) -> Net.Atom (toShortName (ecName ec))
FTermF (Sort s) -> Net.Atom (Text.pack ('*' : show s))
FTermF (NatLit _) -> Net.Var
FTermF (DataTypeApp c ps ts) ->
foldl Net.App (Net.Atom (identText c)) (map termToPat (ps ++ ts))
foldl Net.App (Net.Atom (identBaseName c)) (map termToPat (ps ++ ts))
FTermF (CtorApp c ps ts) ->
foldl Net.App (Net.Atom (identText c)) (map termToPat (ps ++ ts))
foldl Net.App (Net.Atom (identBaseName c)) (map termToPat (ps ++ ts))
_ -> Net.Var

unwrapTermF :: Term -> TermF Term
Expand Down

0 comments on commit 481c618

Please sign in to comment.