We're updating the issue view to help you get more done. 

Instrumenting next gives maximum call stack size exceeded

Description

rest and last can be successfully instrumented, but next seems to be vulnerable to a maximum call stack size exceeded error.

Repro:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ clj -Srepro -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.439"} org.clojure/test.check {:mvn/version "RELEASE"}}}' -m cljs.main -re node -r ClojureScript 1.10.439 cljs.user=> (require '[clojure.spec.alpha :as s]) nil cljs.user=> (require '[clojure.spec.test.alpha :as stest]) nil cljs.user=> (s/fdef clojure.core/next :args (s/cat :coll seqable?)) cljs.core/next cljs.user=> (stest/instrument `next) repl:42 throw e__6573__auto__; ^ RangeError: Maximum call stack size exceeded at /private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:147:18 at Object.G__47574__delegate (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:181:27) at Object.G__47574 [as next] (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:191:27) at Function.cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/core.js:13123:99) at Function.cljs.core.apply.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/core.js:13405:34) at cljs$core$apply (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/core.js:13358:24) at /private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:157:24 at Object.G__47574__delegate (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:181:27) at Object.G__47574 [as next] (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/spec/test/alpha.js:191:27) at Function.cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/7t/gpzjxhts24d5wvqys1dfvrd80000gn/T/out92072095452558798682044329212169952/cljs/core.js:13123:99) (node:11768) [DEP0097] DeprecationWarning: Using a domain property in MakeCallback is deprecated. Use the async_context variant of MakeCallback or the AsyncResource class instead. cljs.user=>

Patch CLJS-3023-2 provides a solution by going through the protocol method directly instead of using the function next in apply-to-simple. This seems reasonable, since this was already done to first as well.

Patch CLJS-3023-3 restores the fallback for seqs that do not implement INext.

Patch CLJS-3023-4 rebased on master.

Environment

None

Status

Assignee

David Nolen

Reporter

Michiel Borkent

Labels

Approval

Accepted

Patch

Code and Test

Priority

Minor