aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--luxc/src/lux/compiler.clj4
-rw-r--r--luxc/src/lux/compiler/cache.clj49
-rw-r--r--luxc/src/lux/compiler/io.clj15
3 files changed, 46 insertions, 22 deletions
diff --git a/luxc/src/lux/compiler.clj b/luxc/src/lux/compiler.clj
index b9b4e8de0..15b74bc9e 100644
--- a/luxc/src/lux/compiler.clj
+++ b/luxc/src/lux/compiler.clj
@@ -127,6 +127,7 @@
[resources-dirs ^String target-dir]
(do (reset! &&/!output-dir target-dir)
(&&parallel/setup!)
+ (&&io/init-libs!)
(reset! !source->last-line {})
(.mkdirs (new java.io.File target-dir))
(let [class-loader (ClassLoader/getSystemClassLoader)
@@ -258,7 +259,8 @@
(let [!err! *err*]
(defn compile-program [mode program-module resources-dir source-dirs target-dir]
(do (init! resources-dir target-dir)
- (let [m-action (|do [_ (compile-module source-dirs "lux")]
+ (let [m-action (|do [_ (&&cache/pre-load-cache! source-dirs)
+ _ (compile-module source-dirs "lux")]
(compile-module source-dirs program-module))]
(|case (m-action (&/init-state mode))
(&/$Right ?state _)
diff --git a/luxc/src/lux/compiler/cache.clj b/luxc/src/lux/compiler/cache.clj
index 9ba3ac815..ce0a0325b 100644
--- a/luxc/src/lux/compiler/cache.clj
+++ b/luxc/src/lux/compiler/cache.clj
@@ -147,13 +147,9 @@
def-value (get-field &/value-field def-class)]
(&a-module/define module _name def-type def-anns def-value)))))
-(defn ^:private redo-cache [compile-module module]
- (|do [_ (delete module)
- ;; async (compile-module module)
- ]
- ;; (assume-async-result @async)
- (compile-module module)
- ))
+(defn ^:private uninstall-cache [module]
+ (|do [_ (delete module)]
+ (return false)))
(defn ^:private install-module [loader module module-hash imports tag-groups module-anns def-entries]
(|do [_ (&a-module/create-module module module-hash)
@@ -183,10 +179,41 @@
(&/->list def-entries)))]
(install-module loader module module-hash
imports tag-groups module-anns def-entries))
- (redo-cache compile-module module))))
+ (uninstall-cache module))))
+
+(defn ^:private enumerate-cached-modules!* [^File parent]
+ (if (.isDirectory parent)
+ (let [children (for [^File child (seq (.listFiles parent))
+ entry (enumerate-cached-modules!* child)]
+ entry)]
+ (if (.exists (new File parent "_.class"))
+ (list* (.getAbsolutePath parent)
+ children)
+ children))
+ (list)))
+
+(defn ^:private enumerate-cached-modules! []
+ (let [output-dir (new File @&&/!output-dir)
+ prefix-to-subtract (inc (.length (.getAbsolutePath output-dir)))]
+ (->> output-dir
+ enumerate-cached-modules!*
+ rest
+ (map #(.substring ^String % prefix-to-subtract))
+ &/->list)))
+
+(def !pre-loaded-cache (atom nil))
+(defn pre-load-cache! [source-dirs]
+ (let [cached-modules (enumerate-cached-modules!)
+ loaded-dict (&/fold (fn [loaded-dict present-module]
+ (assoc loaded-dict present-module false))
+ {}
+ cached-modules)]
+ (do (&/|log! (prn-str 'pre-load-cache! (&/->seq source-dirs)))
+ (&/|log! (prn-str 'pre-load-cache! (&/->seq cached-modules)))
+ (return nil))))
(defn load [source-dirs module module-hash compile-module]
- "(-> (List Text) Text Int (-> Text (Lux [])) (Lux Bool))"
+ "(-> (List Text) Text Int (-> Text (Lux [])) (Lux Nil))"
(|do [already-loaded? (&a-module/exists? module)]
(if already-loaded?
(return nil)
@@ -204,5 +231,5 @@
(= &/compiler-version (get-field &/compiler-field module-class)))
(process-module load compile-module source-dirs loader module module-hash)
(do (reset! !classes old-classes)
- (redo-cache compile-module module))))
- (redo-cache compile-module module)))))
+ (uninstall-cache module))))
+ (uninstall-cache module)))))
diff --git a/luxc/src/lux/compiler/io.clj b/luxc/src/lux/compiler/io.clj
index ecb2066cd..179e2a097 100644
--- a/luxc/src/lux/compiler/io.clj
+++ b/luxc/src/lux/compiler/io.clj
@@ -11,13 +11,10 @@
;; [Utils]
(def ^:private !libs (atom nil))
-(defn ^:private libs-imported? []
- (not (nil? @!libs)))
-
-(defn ^:private init-libs! []
+;; [Resources]
+(defn init-libs! []
(reset! !libs (&lib/load)))
-;; [Resources]
(defn read-file [source-dirs ^String file-name]
(|case (&/|some (fn [source-dir]
(let [file (new java.io.File (str source-dir "/" file-name))]
@@ -29,8 +26,6 @@
(return (slurp file))
(&/$None)
- (do (when (not (libs-imported?))
- (init-libs!))
- (if-let [code (get @!libs file-name)]
- (return code)
- (fail (str "[I/O Error] File doesn't exist: " file-name))))))
+ (if-let [code (get @!libs file-name)]
+ (return code)
+ (fail (str "[I/O Error] File doesn't exist: " file-name)))))