diff options
author | Eduardo Julian | 2016-11-06 17:42:41 -0400 |
---|---|---|
committer | Eduardo Julian | 2016-11-06 17:42:41 -0400 |
commit | 8e25b93a1ce46bfa46b322540d4732b36cbd7f02 (patch) | |
tree | 1ad5e4d5ce0ff1558bbb769c0bcc9b1ed40d4cd7 | |
parent | 7092911a2a213ea49b51af2d641c369bb09d1918 (diff) |
- Fixed a bug, wherein <clinit> methods were compiled as "public" instead of "static".
-rw-r--r-- | src/lux/compiler.clj | 4 | ||||
-rw-r--r-- | src/lux/compiler/host.clj | 33 | ||||
-rw-r--r-- | src/lux/compiler/lux.clj | 93 |
3 files changed, 66 insertions, 64 deletions
diff --git a/src/lux/compiler.clj b/src/lux/compiler.clj index 0f019bcb1..39e475aaa 100644 --- a/src/lux/compiler.clj +++ b/src/lux/compiler.clj @@ -146,7 +146,7 @@ (-> (.visitField (+ Opcodes/ACC_PUBLIC Opcodes/ACC_FINAL Opcodes/ACC_STATIC) &/eval-field "Ljava/lang/Object;" nil nil) (doto (.visitEnd))) (.visitSource file-name nil))] - _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "<clinit>" "()V" nil nil) + _ (&/with-writer (.visitMethod =class Opcodes/ACC_STATIC "<clinit>" "()V" nil nil) (|do [^MethodVisitor *writer* &/get-writer :let [_ (.visitCode *writer*)] _ (compile-expression nil expr) @@ -246,7 +246,7 @@ (&/fold str ""))) .visitEnd) )] - _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "<clinit>" "()V" nil nil) + _ (&/with-writer (.visitMethod =class Opcodes/ACC_STATIC "<clinit>" "()V" nil nil) (|do [^MethodVisitor **writer** &/get-writer :let [_ (.visitCode **writer**)] _ (&&/compile-meta compile-expression ==anns) diff --git a/src/lux/compiler/host.clj b/src/lux/compiler/host.clj index 211ed018c..4990fbf87 100644 --- a/src/lux/compiler/host.clj +++ b/src/lux/compiler/host.clj @@ -130,9 +130,7 @@ (defn ^:private compile-method-return [^MethodVisitor writer output] (|case output (&/$GenericClass "void" (&/$Nil)) - (doto writer - (.visitInsn Opcodes/POP) - (.visitInsn Opcodes/RETURN)) + (.visitInsn writer Opcodes/RETURN) (&/$GenericClass "boolean" (&/$Nil)) (doto writer @@ -486,22 +484,19 @@ _ (return nil)) - _ (|let [field-inits (constant-inits ?fields)] - (if (&/|empty? field-inits) - (return nil) - (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "<clinit>" "()V" nil nil) - (|do [^MethodVisitor =method &/get-writer - :let [_ (doto =method - (.visitCode))] - _ (&/map% (fn [ftriple] - (|let [[fname fgclass fvalue] ftriple] - (compile-jvm-putstatic compile (&/|list (&o/optimize fvalue)) (&/|list ?name fname fgclass)))) - field-inits) - :let [_ (doto =method - (.visitInsn Opcodes/RETURN) - (.visitMaxs 0 0) - (.visitEnd))]] - (return nil)))))] + _ (&/with-writer (.visitMethod =class Opcodes/ACC_STATIC "<clinit>" "()V" nil nil) + (|do [^MethodVisitor =method &/get-writer + :let [_ (doto =method + (.visitCode))] + _ (&/map% (fn [ftriple] + (|let [[fname fgclass fvalue] ftriple] + (compile-jvm-putstatic compile (&/|list (&o/optimize fvalue)) (&/|list ?name fname fgclass)))) + (constant-inits ?fields)) + :let [_ (doto =method + (.visitInsn Opcodes/RETURN) + (.visitMaxs 0 0) + (.visitEnd))]] + (return nil)))] (&&/save-class! ?name (.toByteArray (doto =class .visitEnd))))) (defn compile-jvm-interface [interface-decl ?supers ?anns ?methods] diff --git a/src/lux/compiler/lux.clj b/src/lux/compiler/lux.clj index f44375e97..a6b636107 100644 --- a/src/lux/compiler/lux.clj +++ b/src/lux/compiler/lux.clj @@ -266,7 +266,8 @@ (if (= 1 (&/|length ?meta)) (|do [:let [current-class (&host-generics/->class-name (str (&host/->module-class r-module) "/" (&host/def-name r-name))) def-class (&&/load-class! class-loader current-class) - def-type (-> def-class (.getField &/type-field) (.get nil)) + def-type (&a-module/def-type r-module r-name) + ;; def-type (-> def-class (.getField &/type-field) (.get nil)) def-meta ?meta def-value (-> def-class (.getField &/value-field) (.get nil))] _ (&/without-repl-closure @@ -294,23 +295,24 @@ current-class nil &&/function-class (into-array String [])) (-> (.visitField field-flags &/name-field "Ljava/lang/String;" nil ?name) (doto (.visitEnd))) - (-> (.visitField field-flags &/type-field datum-sig nil nil) - (doto (.visitEnd))) - (-> (.visitField field-flags &/anns-field datum-sig nil nil) - (doto (.visitEnd))) + ;; (-> (.visitField field-flags &/type-field datum-sig nil nil) + ;; (doto (.visitEnd))) + ;; (-> (.visitField field-flags &/anns-field datum-sig nil nil) + ;; (doto (.visitEnd))) (-> (.visitField field-flags &/value-field datum-sig nil nil) (doto (.visitEnd))) (.visitSource file-name nil))] instancer (&&lambda/compile-function compile (&/$Some =class) _arity _scope _captured ?body+) - _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "<clinit>" "()V" nil nil) + _ (&/with-writer (.visitMethod =class Opcodes/ACC_STATIC "<clinit>" "()V" nil nil) (|do [^MethodVisitor **writer** &/get-writer :let [_ (.visitCode **writer**)] - _ (compile-def-type compile ?body) - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/type-field datum-sig)] - _ (&&/compile-meta compile ?meta) - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/anns-field datum-sig)] + ;; _ (compile-def-type compile ?body) + ;; :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/type-field datum-sig)] + ;; _ (&&/compile-meta compile ?meta) + ;; :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/anns-field datum-sig)] _ instancer - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/value-field datum-sig)] + :let [_ (.visitTypeInsn **writer** Opcodes/CHECKCAST "java/lang/Object") + _ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/value-field datum-sig)] :let [_ (doto **writer** (.visitInsn Opcodes/RETURN) (.visitMaxs 0 0) @@ -320,17 +322,19 @@ :let [_ (.visitEnd =class)] _ (&&/save-class! def-name (.toByteArray =class)) :let [def-class (&&/load-class! class-loader (&host-generics/->class-name current-class)) - [def-type is-type?] (|case (&a-meta/meta-get &a-meta/type?-tag ?meta) - (&/$Some (&/$BoolM true)) - (&/T [&type/Type - true]) - - _ - (if (&type/type= &type/Type =value-type) - (&/T [&type/Type - false]) - (&/T [(-> def-class (.getField &/type-field) (.get nil)) - false]))) + def-type (&a/expr-type* ?body) + [;; def-type + is-type?] (|case (&a-meta/meta-get &a-meta/type?-tag ?meta) + (&/$Some (&/$BoolM true)) + (&/T [;; &type/Type + true]) + + _ + (if (&type/type= &type/Type =value-type) + (&/T [;; &type/Type + false]) + (&/T [;; (-> def-class (.getField &/type-field) (.get nil)) + false]))) def-meta ?meta def-value (-> def-class (.getField &/value-field) (.get nil))] _ (&/without-repl-closure @@ -377,22 +381,23 @@ current-class nil "java/lang/Object" (into-array String [])) (-> (.visitField field-flags &/name-field "Ljava/lang/String;" nil ?name) (doto (.visitEnd))) - (-> (.visitField field-flags &/type-field datum-sig nil nil) - (doto (.visitEnd))) - (-> (.visitField field-flags &/anns-field datum-sig nil nil) - (doto (.visitEnd))) + ;; (-> (.visitField field-flags &/type-field datum-sig nil nil) + ;; (doto (.visitEnd))) + ;; (-> (.visitField field-flags &/anns-field datum-sig nil nil) + ;; (doto (.visitEnd))) (-> (.visitField field-flags &/value-field datum-sig nil nil) (doto (.visitEnd))) (.visitSource file-name nil))] - _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "<clinit>" "()V" nil nil) + _ (&/with-writer (.visitMethod =class Opcodes/ACC_STATIC "<clinit>" "()V" nil nil) (|do [^MethodVisitor **writer** &/get-writer :let [_ (.visitCode **writer**)] - _ (compile-def-type compile ?body) - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/type-field datum-sig)] - _ (&&/compile-meta compile ?meta) - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/anns-field datum-sig)] + ;; _ (compile-def-type compile ?body) + ;; :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/type-field datum-sig)] + ;; _ (&&/compile-meta compile ?meta) + ;; :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/anns-field datum-sig)] _ (compile nil ?body) - :let [_ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/value-field datum-sig)] + :let [_ (.visitTypeInsn **writer** Opcodes/CHECKCAST "java/lang/Object") + _ (.visitFieldInsn **writer** Opcodes/PUTSTATIC current-class &/value-field datum-sig)] :let [_ (doto **writer** (.visitInsn Opcodes/RETURN) (.visitMaxs 0 0) @@ -402,17 +407,19 @@ :let [_ (.visitEnd =class)] _ (&&/save-class! def-name (.toByteArray =class)) :let [def-class (&&/load-class! class-loader (&host-generics/->class-name current-class)) - [def-type is-type?] (|case (&a-meta/meta-get &a-meta/type?-tag ?meta) - (&/$Some (&/$BoolM true)) - (&/T [&type/Type - true]) - - _ - (if (&type/type= &type/Type =value-type) - (&/T [&type/Type - false]) - (&/T [(-> def-class (.getField &/type-field) (.get nil)) - false]))) + def-type (&a/expr-type* ?body) + [;; def-type + is-type?] (|case (&a-meta/meta-get &a-meta/type?-tag ?meta) + (&/$Some (&/$BoolM true)) + (&/T [;; &type/Type + true]) + + _ + (if (&type/type= &type/Type =value-type) + (&/T [;; &type/Type + false]) + (&/T [;; (-> def-class (.getField &/type-field) (.get nil)) + false]))) def-meta ?meta def-value (-> def-class (.getField &/value-field) (.get nil))] _ (&/without-repl-closure |