|
2023 | 2023 | [`(. ~target ~val) alt] |
2024 | 2024 | [target val])] |
2025 | 2025 | (disallowing-recur |
2026 | | - (let [enve (assoc env :context :expr) |
2027 | | - targetexpr (cond |
2028 | | - (and (= target '*unchecked-if*) ;; TODO: proper resolve |
2029 | | - (or (true? val) (false? val))) |
2030 | | - (do |
2031 | | - (set! *unchecked-if* val) |
2032 | | - ::set-unchecked-if) |
2033 | | - |
2034 | | - (and (= target '*unchecked-arrays*) ;; TODO: proper resolve |
2035 | | - (or (true? val) (false? val))) |
2036 | | - (do |
2037 | | - (set! *unchecked-arrays* val) |
2038 | | - ::set-unchecked-arrays) |
2039 | | - |
2040 | | - (= target '*warn-on-infer*) |
2041 | | - (do |
2042 | | - (set! *cljs-warnings* (assoc *cljs-warnings* :infer-warning true)) |
2043 | | - ::set-warn-on-infer) |
2044 | | - |
2045 | | - (symbol? target) |
2046 | | - (do |
2047 | | - (when (some? (:const (resolve-var (dissoc env :locals) target))) |
2048 | | - (throw (error env "Can't set! a constant"))) |
2049 | | - (let [local (-> env :locals target)] |
2050 | | - (when-not (or (nil? local) |
2051 | | - (and (:field local) |
2052 | | - (or (:mutable local) |
2053 | | - (:unsynchronized-mutable local) |
2054 | | - (:volatile-mutable local)))) |
2055 | | - (throw (error env "Can't set! local var or non-mutable field")))) |
2056 | | - (analyze-symbol enve target)) |
2057 | | - |
2058 | | - :else |
2059 | | - (when (seq? target) |
2060 | | - (let [targetexpr (analyze-seq enve target nil)] |
2061 | | - (when (:field targetexpr) |
2062 | | - targetexpr)))) |
2063 | | - valexpr (analyze enve val)] |
2064 | | - (when-not targetexpr |
2065 | | - (throw (error env "set! target must be a field or a symbol naming a var"))) |
2066 | | - (cond |
2067 | | - (some? (#{::set-unchecked-if ::set-unchecked-arrays ::set-warn-on-infer} targetexpr)) |
2068 | | - {:env env :op :no-op} |
| 2026 | + (let [enve (assoc env :context :expr) |
| 2027 | + texpr (cond |
| 2028 | + (symbol? target) |
| 2029 | + (do |
| 2030 | + (cond |
| 2031 | + (and (= target '*unchecked-if*) ;; TODO: proper resolve |
| 2032 | + (or (true? val) (false? val))) |
| 2033 | + (set! *unchecked-if* val) |
| 2034 | + |
| 2035 | + (and (= target '*unchecked-arrays*) ;; TODO: proper resolve |
| 2036 | + (or (true? val) (false? val))) |
| 2037 | + (set! *unchecked-arrays* val) |
| 2038 | + |
| 2039 | + (and (= target '*warn-on-infer*) |
| 2040 | + (or (true? val) (false? val))) |
| 2041 | + (set! *cljs-warnings* (assoc *cljs-warnings* :infer-warning val))) |
| 2042 | + (when (some? (:const (resolve-var (dissoc env :locals) target))) |
| 2043 | + (throw (error env "Can't set! a constant"))) |
| 2044 | + (let [local (-> env :locals target)] |
| 2045 | + (when-not (or (nil? local) |
| 2046 | + (and (:field local) |
| 2047 | + (or (:mutable local) |
| 2048 | + (:unsynchronized-mutable local) |
| 2049 | + (:volatile-mutable local)))) |
| 2050 | + (throw (error env "Can't set! local var or non-mutable field")))) |
| 2051 | + (analyze-symbol enve target)) |
| 2052 | + |
| 2053 | + :else |
| 2054 | + (when (seq? target) |
| 2055 | + (let [texpr (analyze-seq enve target nil)] |
| 2056 | + (when (:field texpr) |
| 2057 | + texpr)))) |
| 2058 | + vexpr (analyze enve val)] |
| 2059 | + (when-not texpr |
| 2060 | + (throw (error env "set! target must be a field or a symbol naming a var"))) |
| 2061 | + (cond |
| 2062 | + (and (not (:def-emits-var env)) ;; non-REPL context |
| 2063 | + (some? ('#{*unchecked-if* *unchecked-array* *warn-on-infer*} target))) |
| 2064 | + {:env env :op :no-op} |
2069 | 2065 |
|
2070 | | - :else |
2071 | | - {:env env :op :set! :form form :target targetexpr :val valexpr |
2072 | | - :children [targetexpr valexpr]}))))) |
| 2066 | + :else |
| 2067 | + {:env env :op :set! :form form :target texpr :val vexpr |
| 2068 | + :children [texpr vexpr]}))))) |
2073 | 2069 |
|
2074 | 2070 | #?(:clj (declare analyze-file)) |
2075 | 2071 |
|
|
0 commit comments