cognitect / transit-cljs

Transit for ClojureScript
http://transit-format.org
Apache License 2.0
323 stars 20 forks source link

Use of aget / aset when options present triggers checked-arrays #52

Closed mfikes closed 2 years ago

mfikes commented 5 years ago

If you specify options to t/writer with :checked-arrays enabled, this code will trigger.

Here is a working example without the compiler flag:

$ clj -Srepro -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} com.cognitect/transit-cljs {:mvn/version "0.8.256"} com.cognitect/transit-js {:mvn/version "0.8.861"}}}' -m cljs.main -re node -r
ClojureScript 1.10.520
cljs.user=> (require '[cognitect.transit :as t])
nil
cljs.user=> (t/write (t/writer :json {:transform t/write-meta}) ^:foo [1 2])
"[\"~#with-meta\",[[1,2],[\"^ \",\"~:foo\",true]]]"

And here is an example with the flag enabled at the :warn level:

$ clj -Srepro -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} com.cognitect/transit-cljs {:mvn/version "0.8.256"} com.cognitect/transit-js {:mvn/version "0.8.861"}}}' -m cljs.main -co '{:checked-arrays :warn}' -re node -r
ClojureScript 1.10.520
cljs.user=> (require '[cognitect.transit :as t])
nil
cljs.user=> (t/write (t/writer :json {:transform t/write-meta}) ^:foo [1 2])
Error: Assert failed: (or (array? array) (goog/isArrayLike array))
    at Function.cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cljs/core.js:524:8)
    at cljs$core$checked_aget (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cljs/core.js:490:31)
    at cognitect$transit$opts_merge (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:132:37)
    at Function.cognitect.transit.writer.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:906:97)
    at cognitect$transit$writer (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:883:33)
    at repl:1:148
    at repl:9:3
    at repl:14:4
    at ContextifyScript.Script.runInThisContext (vm.js:50:33)
    at Object.runInThisContext (vm.js:139:38)
Error: Assert failed: (or (array? array) (goog/isArrayLike array))
    at Function.cljs.core.checked_aset.cljs$core$IFn$_invoke$arity$3 (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cljs/core.js:601:8)
    at cljs$core$checked_aset (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cljs/core.js:567:31)
    at cognitect$transit$opts_merge (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:133:24)
    at Function.cognitect.transit.writer.cljs$core$IFn$_invoke$arity$2 (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:906:97)
    at cognitect$transit$writer (/private/var/folders/yw/77skdn6s2099kb4_43vvrg1c0000gn/T/out5495452781688741529186887019006156/cognitect/transit.js:883:33)
    at repl:1:148
    at repl:9:3
    at repl:14:4
    at ContextifyScript.Script.runInThisContext (vm.js:50:33)
    at Object.runInThisContext (vm.js:139:38)
"[\"~#with-meta\",[[1,2],[\"^ \",\"~:foo\",true]]]"
swannodette commented 2 years ago

Fixed in master.