From 4e980a83d5e7532ed58337658c0631e2282c969f Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sun, 19 Feb 2017 18:22:27 -0400 Subject: - Now storing the compiler's version and the module-file's hash inside the module-descriptor, instead of .class files (to make it reusable across different compiler targets). --- luxc/src/lux/base.clj | 2 -- luxc/src/lux/compiler/core.clj | 6 ++++-- luxc/src/lux/compiler/js.clj | 2 +- luxc/src/lux/compiler/jvm.clj | 6 +----- luxc/src/lux/compiler/jvm/cache.clj | 34 ++++++++++++++++++---------------- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/luxc/src/lux/base.clj b/luxc/src/lux/base.clj index 1a9fadf63..bbb5f3888 100644 --- a/luxc/src/lux/base.clj +++ b/luxc/src/lux/base.clj @@ -220,9 +220,7 @@ ("DictA" 1)) ;; [Exports] -(def ^:const hash-field "_hash") (def ^:const value-field "_value") -(def ^:const compiler-field "_compiler") (def ^:const eval-field "_eval") (def ^:const module-class-name "_") (def ^:const +name-separator+ ";") diff --git a/luxc/src/lux/compiler/core.clj b/luxc/src/lux/compiler/core.clj index 4779c3c28..6dacb4e54 100644 --- a/luxc/src/lux/compiler/core.clj +++ b/luxc/src/lux/compiler/core.clj @@ -44,7 +44,7 @@ (return (slurp (str @!output-dir java.io.File/separator (.replace name "/" java.io.File/separator) java.io.File/separator lux-module-descriptor-name) :encoding "UTF-8")))) -(def generate-module-descriptor +(defn generate-module-descriptor [file-hash] (|do [module-name &/get-module-name module-anns (&a-module/get-anns module-name) defs &a-module/defs @@ -73,7 +73,9 @@ (str type datum-separator))))) (&/|interpose entry-separator) (&/fold str "")) - module-descriptor (->> (&/|list import-entries + module-descriptor (->> (&/|list &/compiler-version + (Long/toUnsignedString file-hash) + import-entries tag-entries (&&&ann/serialize-anns module-anns) def-entries) diff --git a/luxc/src/lux/compiler/js.clj b/luxc/src/lux/compiler/js.clj index 5bb97728f..b17c06436 100644 --- a/luxc/src/lux/compiler/js.clj +++ b/luxc/src/lux/compiler/js.clj @@ -151,7 +151,7 @@ (&/$Right ?state _) (&/run-state (|do [_ (&a-module/flag-compiled-module name) ;; _ (&&/save-class! &/module-class-name (.toByteArray =class)) - module-descriptor &&core/generate-module-descriptor + module-descriptor (&&core/generate-module-descriptor file-hash) _ (&&core/write-module-descriptor! name module-descriptor)] (return file-hash)) ?state) diff --git a/luxc/src/lux/compiler/jvm.clj b/luxc/src/lux/compiler/jvm.clj index d0d3c1bc3..68dcb0306 100644 --- a/luxc/src/lux/compiler/jvm.clj +++ b/luxc/src/lux/compiler/jvm.clj @@ -188,10 +188,6 @@ =class (doto (new ClassWriter ClassWriter/COMPUTE_MAXS) (.visit &host/bytecode-version (+ Opcodes/ACC_PUBLIC Opcodes/ACC_SUPER) module-class-name nil "java/lang/Object" nil) - (-> (.visitField +field-flags+ &/hash-field "I" nil file-hash) - .visitEnd) - (-> (.visitField +field-flags+ &/compiler-field "Ljava/lang/String;" nil &/compiler-version) - .visitEnd) (.visitSource file-name nil))] _ (if (= "lux" name) (|do [_ &&rt/compile-Function-class @@ -206,7 +202,7 @@ (&/run-state (|do [:let [_ (.visitEnd =class)] _ (&a-module/flag-compiled-module name) _ (&&/save-class! &/module-class-name (.toByteArray =class)) - module-descriptor &&core/generate-module-descriptor + module-descriptor (&&core/generate-module-descriptor file-hash) _ (&&core/write-module-descriptor! name module-descriptor)] (return file-hash)) ?state) diff --git a/luxc/src/lux/compiler/jvm/cache.clj b/luxc/src/lux/compiler/jvm/cache.clj index cfbaf3810..b2b4f2bac 100644 --- a/luxc/src/lux/compiler/jvm/cache.clj +++ b/luxc/src/lux/compiler/jvm/cache.clj @@ -145,10 +145,10 @@ _ (&/map% (partial process-tag-group module) tag-groups)] (return nil))) -(defn ^:private process-module [pre-load! source-dirs cache-table module-name module-hash loader] +(defn ^:private process-module [pre-load! source-dirs cache-table module-name module-hash loader + _imports-section _tags-section _module-anns-section _defs-section] (|do [^String descriptor (&&core/read-module-descriptor! module-name) - :let [[imports-section tags-section module-anns-section defs-section] (.split descriptor &&core/section-separator) - imports (let [imports (vec (.split ^String imports-section &&core/entry-separator)) + :let [imports (let [imports (vec (.split ^String _imports-section &&core/entry-separator)) imports (if (= [""] imports) &/$Nil (&/->list imports))] @@ -164,9 +164,9 @@ (|let [[_module _hash] _import] (contains? cache-table* _module))) imports) - (let [tag-groups (parse-tag-groups tags-section) - module-anns (&&&ann/deserialize-anns module-anns-section) - def-entries (let [def-entries (vec (.split ^String defs-section &&core/entry-separator))] + (let [tag-groups (parse-tag-groups _tags-section) + module-anns (&&&ann/deserialize-anns _module-anns-section) + def-entries (let [def-entries (vec (.split ^String _defs-section &&core/entry-separator))] (if (= [""] def-entries) &/$Nil (&/->list def-entries)))] @@ -198,30 +198,32 @@ (.substring prefix-to-subtract))) &/->list))) -(defn ^:private pre-load! [source-dirs cache-table module module-hash] - (cond (contains? cache-table module) +(defn ^:private pre-load! [source-dirs cache-table module-name module-hash] + (cond (contains? cache-table module-name) (return cache-table) - (not (cached? module)) + (not (cached? module-name)) (return cache-table) :else (|do [loader &/loader !classes &/classes - :let [module* (&host-generics/->class-name module) - module-path (str @&&core/!output-dir java.io.File/separator module) + ^String descriptor (&&core/read-module-descriptor! module-name) + :let [module* (&host-generics/->class-name module-name) + module-path (str @&&core/!output-dir java.io.File/separator module-name) class-name (str module* "." &/module-class-name) ^Class module-class (do (swap! !classes assoc class-name (read-file (new File (str module-path java.io.File/separator module-class-file)))) (&&/load-class! loader class-name)) installed-classes (install-all-defs-in-module !classes module* module-path) - valid-cache? (and (= module-hash (get-field &/hash-field module-class)) - (= &/compiler-version (get-field &/compiler-field module-class))) - drop-cache! (|do [_ (uninstall-cache module) + [_compiler _hash _imports-section _tags-section _module-anns-section _defs-section] (.split descriptor &&core/section-separator) + drop-cache! (|do [_ (uninstall-cache module-name) :let [_ (swap! !classes (fn [_classes-dict] (reduce dissoc _classes-dict installed-classes)))]] (return cache-table))]] - (if valid-cache? - (|do [[success? cache-table*] (process-module pre-load! source-dirs cache-table module module-hash loader) + (if (and (= module-hash (Long/parseUnsignedLong ^String _hash)) + (= &/compiler-version _compiler)) + (|do [[success? cache-table*] (process-module pre-load! source-dirs cache-table module-name module-hash loader + _imports-section _tags-section _module-anns-section _defs-section) _ (if success? (return nil) drop-cache!)] -- cgit v1.2.3