ClojureScript

Self-host: cljs/compile-str not handling errors properly

Details

  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Minor Minor
  • Resolution: Completed
  • Affects Version/s: 1.7.145, 1.7.228
  • Fix Version/s: None
  • Component/s: None
  • Labels:
  • Patch:
    Code and Test

Description

cljs/compile-str throws on some errors which cljs/eval[-str] handles gracefully.

Example: on `(fn [] (let [x 7 y] (prn y)))`, cljs/eval-str returns:

{:message "Could not eval eval-str", :data {:tag :cljs/analysis-error}, :cause #error {:message "bindings must be vector of even number of elements at line 1 ", :data {:file nil, :line 1, :column 8, :tag :cljs/analysis-error}}}

whereas cljs/compile-str throws:

Uncaught Error: No method in multimethod 'cljs.compiler/emit*' for dispatch value:
cljs$core$throw_no_method_error @ core.cljs:9611
cljs.core.MultiFn.call.G_10698_2 @ core.cljs:9626
cljs.core.MultiFn.call.G__10698 @ core.cljs:9613
cljs$compiler$emit @ compiler.cljc:170
(anonymous function) @ js.cljs:630
cljs$js$compile_str_STAR__$_compile_loop @ js.cljs:630
cljs$js$compile_str_STAR_ @ js.cljs:603
cljs.js.compile_str.cljs$core$IFn$_invoke$arity$5 @ js.cljs:674
cljs$js$compile_str @ js.cljs:644
(anonymous function) @ core.cljs:28

Minimal example: https://github.com/mhuebert/mies-cljs.js

Activity

Hide
Mike Fikes added a comment -

If you use cljs.js/compile-str on a form that cannot be analyzed, then the analysis error is wrapped, but inadvertently passed on to compilation as an AST structure. This results in the compiler derailing because it tries to process a nil :op.

The fix is to employ the same pattern used in cljs.js/eval-str, namely: Wrap successful analysis in a {:value ast} map, and then additionally check for an :error key in the result and cb early, otherwise extract the :value and continue on to compilation.

With the patch this error should be produced:

#error {:message "Could not compile ", :data {:tag :cljs/analysis-error}, :cause #error {:message "bindings must be vector of even number of elements at line 1 ", :data {:file nil, :line 1, :column 8, :tag :cljs/analysis-error}}}
Show
Mike Fikes added a comment - If you use cljs.js/compile-str on a form that cannot be analyzed, then the analysis error is wrapped, but inadvertently passed on to compilation as an AST structure. This results in the compiler derailing because it tries to process a nil :op. The fix is to employ the same pattern used in cljs.js/eval-str, namely: Wrap successful analysis in a {:value ast} map, and then additionally check for an :error key in the result and cb early, otherwise extract the :value and continue on to compilation. With the patch this error should be produced:
#error {:message "Could not compile ", :data {:tag :cljs/analysis-error}, :cause #error {:message "bindings must be vector of even number of elements at line 1 ", :data {:file nil, :line 1, :column 8, :tag :cljs/analysis-error}}}
Hide
Mike Fikes added a comment -

Confirmed fixed with downstream bootstrapped client.

Show
Mike Fikes added a comment - Confirmed fixed with downstream bootstrapped client.

People

Vote (0)
Watch (0)

Dates

  • Created:
    Updated:
    Resolved: