diff options
Diffstat (limited to 'luxc')
| -rw-r--r-- | luxc/src/lux/base.clj | 2 | ||||
| -rw-r--r-- | luxc/src/lux/compiler/core.clj | 6 | ||||
| -rw-r--r-- | luxc/src/lux/compiler/js.clj | 2 | ||||
| -rw-r--r-- | luxc/src/lux/compiler/jvm.clj | 6 | ||||
| -rw-r--r-- | 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!)] | 
