From 7092911a2a213ea49b51af2d641c369bb09d1918 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Thu, 3 Nov 2016 17:37:47 -0400 Subject: - Made some tentative changes to the compilation process, since not all bytecode that works on the JVM also works properly on Android. Further testing and tweaking is needed. --- src/lux/compiler.clj | 25 +++++++++++++++---------- src/lux/compiler/host.clj | 33 +++++++++++++++++++-------------- src/lux/host.clj | 4 ++-- 3 files changed, 36 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/lux/compiler.clj b/src/lux/compiler.clj index 030df1dd6..0f019bcb1 100644 --- a/src/lux/compiler.clj +++ b/src/lux/compiler.clj @@ -213,16 +213,20 @@ defs &a-module/defs imports &a-module/imports tag-groups &&module/tag-groups - :let [_ (doto =class + :let [^String defs-value (->> defs + (&/|filter (fn [_def] + (|let [[?name ?alias] _def] + (= "" ?alias)))) + (&/|map (fn [_def] + (|let [[?name ?alias] _def] + (str ?name + &&/exported-separator + ?alias)))) + (&/|interpose &&/def-separator) + (&/fold str "")) + _ (doto =class (-> (.visitField (+ Opcodes/ACC_PUBLIC Opcodes/ACC_FINAL Opcodes/ACC_STATIC) &/defs-field "Ljava/lang/String;" nil - (->> defs - (&/|map (fn [_def] - (|let [[?name ?alias] _def] - (str ?name - &&/exported-separator - ?alias)))) - (&/|interpose &&/def-separator) - (&/fold str ""))) + defs-value) .visitEnd) (-> (.visitField (+ Opcodes/ACC_PUBLIC Opcodes/ACC_FINAL Opcodes/ACC_STATIC) &/imports-field "Ljava/lang/String;" nil (->> imports @@ -240,7 +244,8 @@ (str type &&/type-separator))))) (&/|interpose &&/tag-group-separator) (&/fold str ""))) - .visitEnd))] + .visitEnd) + )] _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "" "()V" nil nil) (|do [^MethodVisitor **writer** &/get-writer :let [_ (.visitCode **writer**)] diff --git a/src/lux/compiler/host.clj b/src/lux/compiler/host.clj index 6c1646933..211ed018c 100644 --- a/src/lux/compiler/host.clj +++ b/src/lux/compiler/host.clj @@ -130,7 +130,9 @@ (defn ^:private compile-method-return [^MethodVisitor writer output] (|case output (&/$GenericClass "void" (&/$Nil)) - (.visitInsn writer Opcodes/RETURN) + (doto writer + (.visitInsn Opcodes/POP) + (.visitInsn Opcodes/RETURN)) (&/$GenericClass "boolean" (&/$Nil)) (doto writer @@ -484,19 +486,22 @@ _ (return nil)) - _ (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "" "()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)))] + _ (|let [field-inits (constant-inits ?fields)] + (if (&/|empty? field-inits) + (return nil) + (&/with-writer (.visitMethod =class Opcodes/ACC_PUBLIC "" "()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)))))] (&&/save-class! ?name (.toByteArray (doto =class .visitEnd))))) (defn compile-jvm-interface [interface-decl ?supers ?anns ?methods] diff --git a/src/lux/host.clj b/src/lux/host.clj index 26176b840..3c8cef536 100644 --- a/src/lux/host.clj +++ b/src/lux/host.clj @@ -104,7 +104,7 @@ (do-template [ ] (defn [class-loader target method-name args] (|let [target-class (Class/forName target true class-loader)] - (if-let [[^Method method ^Class declarer] (first (for [^Method =method (.getMethods target-class) + (if-let [[^Method method ^Class declarer] (first (for [^Method =method (.getDeclaredMethods target-class) :when (and (.equals ^Object method-name (.getName =method)) (.equals ^Object (Modifier/isStatic (.getModifiers =method))) (let [param-types (&/->list (seq (.getParameterTypes =method)))] @@ -394,7 +394,7 @@ (defn use-dummy-class [class-decl super-class interfaces ctor-args fields methods] (|do [module &/get-module-name :let [[?name ?params] class-decl - dummy-name (str ?name "__DUMMY__") + dummy-name ?name;; (str ?name "__DUMMY__") dummy-full-name (str module "/" dummy-name) real-name (str (&host-generics/->class-name module) "." ?name) store-name (str (&host-generics/->class-name module) "." dummy-name) -- cgit v1.2.3