|
10 | 10 | (:refer-clojure :exclude [eval macroexpand-1 macroexpand load])
|
11 | 11 | (:require [clojure.tools.analyzer.jvm :as a]
|
12 | 12 | [clojure.tools.analyzer :refer [macroexpand-1 macroexpand]]
|
| 13 | + [clojure.tools.analyzer.passes :refer [schedule]] |
| 14 | + [clojure.tools.analyzer.env :as env] |
| 15 | + [clojure.tools.analyzer.utils :refer [mmerge]] |
13 | 16 | [clojure.tools.emitter.jvm.emit :as e]
|
14 | 17 | [clojure.tools.emitter.jvm.transform :as t]
|
| 18 | + [clojure.tools.analyzer.passes.jvm |
| 19 | + [annotate-class-id :refer [annotate-class-id]] |
| 20 | + [annotate-internal-name :refer [annotate-internal-name]] |
| 21 | + [infer-tag :refer [ensure-tag]]] |
15 | 22 | [clojure.tools.emitter.passes.jvm.collect-internal-methods :refer :all]
|
16 | 23 | [clojure.java.io :as io]
|
17 | 24 | [clojure.string :as s]
|
|
25 | 32 | ([{:keys [class-name] :as class-ast} class-loader]
|
26 | 33 | (.defineClass ^DynamicClassLoader class-loader class-name (t/-compile class-ast) nil)))
|
27 | 34 |
|
| 35 | +(def run-passes |
| 36 | + (schedule (into a/default-passes |
| 37 | + #{#'collect-internal-methods |
| 38 | + |
| 39 | + #'ensure-tag |
| 40 | + |
| 41 | + #'annotate-class-id |
| 42 | + #'annotate-internal-name}))) |
| 43 | + |
28 | 44 | (defn eval
|
29 | 45 | "(eval form)
|
30 | 46 | (eval form eval-options-map)
|
|
56 | 72 | ([form {:keys [debug? emit-opts class-loader analyze-opts]
|
57 | 73 | :or {debug? false
|
58 | 74 | emit-opts {}
|
59 |
| - analyze-opts {} |
| 75 | + analyze-opts a/default-passes-opts |
60 | 76 | class-loader (clojure.lang.RT/makeClassLoader)}
|
61 | 77 | :as options}]
|
62 | 78 | {:pre [(instance? DynamicClassLoader class-loader)]}
|
|
70 | 86 | (doseq [expr statements]
|
71 | 87 | (eval expr options))
|
72 | 88 | (eval ret options))
|
73 |
| - (let [cs (-> (a/analyze `(^:once fn* [] ~mform) (a/empty-env) analyze-opts) |
74 |
| - collect-internal-methods |
75 |
| - (e/emit-classes (merge {:debug? debug?} emit-opts))) |
76 |
| - classes (mapv #(compile-and-load % class-loader) cs)] |
77 |
| - ((.newInstance ^Class (last classes)))))))) |
| 89 | + (binding [a/run-passes run-passes] |
| 90 | + (let [cs (-> (a/analyze `(^:once fn* [] ~mform) (a/empty-env) analyze-opts) |
| 91 | + (e/emit-classes (merge {:debug? debug?} emit-opts))) |
| 92 | + classes (mapv #(compile-and-load % class-loader) cs)] |
| 93 | + ((.newInstance ^Class (last classes))))))))) |
78 | 94 |
|
79 | 95 | (def root-directory @#'clojure.core/root-directory)
|
80 | 96 |
|
|
0 commit comments