[#1055] Segfault when reifying FileVisitor with visitFileFailed

This commit is contained in:
Michiel Borkent 2021-11-07 12:05:16 +01:00
parent c86b28a210
commit 2bb7499fd5
3 changed files with 36 additions and 4 deletions

View file

@ -19,7 +19,7 @@
babashka/babashka.curl {:local/root "babashka.curl"}
babashka/fs {:local/root "fs"}
borkdude/graal.locking {:mvn/version "0.0.2"},
org.clojure/core.async {:mvn/version "1.3.618"},
org.clojure/core.async {:mvn/version "1.4.627"},
org.clojure/tools.cli {:mvn/version "1.0.206"},
org.clojure/data.csv {:mvn/version "1.0.0"},
cheshire/cheshire {:mvn/version "5.10.1"}
@ -39,8 +39,7 @@
rewrite-clj/rewrite-clj {:mvn/version "1.0.699-alpha"}
selmer/selmer {:mvn/version "1.12.44"}
com.taoensso/timbre {:mvn/version "5.1.2"}
org.clojure/tools.logging {:mvn/version "1.1.0"}
#_#_borkdude/edamame {:local/root "../edamame"}}
org.clojure/tools.logging {:mvn/version "1.1.0"}}
:aliases {:babashka/dev
{:main-opts ["-m" "babashka.main"]}
:profile

View file

@ -67,7 +67,8 @@
java.nio.file.FileVisitor
{preVisitDirectory [[this p attrs]]
postVisitDirectory [[this p attrs]]
visitFile [[this p attrs]]}
visitFile [[this p attrs]]
visitFileFailed [[this p ex]]}
java.io.FileFilter
{accept [[this f]]}

View file

@ -65,3 +65,35 @@
(toString [_] (str :foo))))
(hash m)
")))))
(deftest reify-file-visitor-test
(let [prog '(do (ns dude
(:import
[java.io File]
[java.nio.file FileSystems FileVisitor FileVisitResult Files Path])
(:gen-class))
(defn match-paths
"Match glob to paths under root and return a collection of Path objects"
[^File root glob]
(let [root-path (.toPath root)
matcher (.getPathMatcher (FileSystems/getDefault) (str "glob:" glob))
paths (volatile! [])
visitor (reify FileVisitor
(visitFile [_ path attrs]
(when (.matches matcher (.relativize root-path ^Path path))
(vswap! paths conj path))
FileVisitResult/CONTINUE)
(visitFileFailed [_ path ex]
FileVisitResult/CONTINUE)
(preVisitDirectory [_ _ _] FileVisitResult/CONTINUE)
(postVisitDirectory [_ _ _] FileVisitResult/CONTINUE))]
(Files/walkFileTree root-path visitor)
@paths))
[(count (match-paths (File. ".") "**"))
;; visitFileFailed is implemented
(count (match-paths (File. "xxx") "**"))])
[x y] (bb nil prog)]
(is (pos? x))
(is (zero? y))))