aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2016-11-03 17:37:47 -0400
committerEduardo Julian2016-11-03 17:37:47 -0400
commit7092911a2a213ea49b51af2d641c369bb09d1918 (patch)
tree0dbf2dfa3daa1ce9c4847e88f966cf1c57de2c1f
parent969cfa5f52085de2b92fc47387a9550a07a34452 (diff)
- 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.
-rw-r--r--src/lux/compiler.clj25
-rw-r--r--src/lux/compiler/host.clj33
-rw-r--r--src/lux/host.clj4
3 files changed, 36 insertions, 26 deletions
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 "<clinit>" "()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 "<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)))]
+ _ (|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)))))]
(&&/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 [<name> <static?> <method-type>]
(defn <name> [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 <static?> (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)