diff --git a/src/cloroutine/impl.cljc b/src/cloroutine/impl.cljc index 23c802a..68c6d35 100644 --- a/src/cloroutine/impl.cljc +++ b/src/cloroutine/impl.cljc @@ -110,8 +110,13 @@ (with-meta (cons 'cljs.core/js-obj (interleave keys args)) meta)) (emit-js-array [args meta] (with-meta (cons 'cljs.core/array args) meta)) - (emit-place [ssa tag place] - `(hint ~tag ~(-> ssa :places place :tag) ~place)) + (emit-place [{:keys [places] + :as ssa} + tag place] + `(hint ~tag + ~(when (contains? places place) + (-> places place :tag)) + ~place)) (instance [ast] (or (:instance ast) (:target ast))) (field [ast] @@ -168,9 +173,12 @@ (dissoc m k))) m ks)) (current-block [ssa] (sym (:prefix ssa) 'block (-> ssa :blocks count dec))) - (with-place [ssa place] + (with-place [{:keys [places] + :as ssa} + place] (let [block (current-block ssa)] - (if (= block (-> ssa :places place :block)) + (if (or (not (contains? places place)) + (= block (-> places place :block))) ssa (update-in ssa [:blocks block :read] conj-set place)))) (collect [ssa rf asts f & args] (loop [ssa (assoc ssa :result [] :tag []) @@ -491,7 +499,12 @@ (add-place (emit-place ssa tag place) tag)) (add-place ssa (:form ast) tag)) - (:const :var :js-var :quote :the-var :static-field) + :const + (assoc ssa + :result (:form ast) + :tag tag) + + (:var :js-var :quote :the-var :static-field) (add-place ssa `(hint ~tag ~(-> ast :o-tag tag->symbol) ~(:form ast)) tag) (:fn :reify :deftype) diff --git a/test/cloroutine/core_test.cljc b/test/cloroutine/core_test.cljc index 515b9c2..79f0dca 100644 --- a/test/cloroutine/core_test.cljc +++ b/test/cloroutine/core_test.cljc @@ -114,4 +114,6 @@ #?(:cljs (run (cr {} (js->clj ((fn [] #js{:bar 1})))) {"bar" 1})) #?(:cljs (run (cr {} (js->clj #js[1 2 3])) [1 2 3])) #?(:cljs (run (cr {} (js->clj ((fn [] #js[1 2 3])))) [1 2 3])) + #?(:cljs (run (cr {} (js* "'~{}'" "Result")) "\"Result\"")) + #?(:cljs (run (cr {} (js->clj (js-obj "key" "val"))) {:key "val"})) )