aboutsummaryrefslogtreecommitdiff
path: root/src/lux/compiler/case.clj
diff options
context:
space:
mode:
authorEduardo Julian2015-03-01 23:39:58 -0400
committerEduardo Julian2015-03-01 23:39:58 -0400
commit4908fef51307348d8469d8e95885fa9a0d8eb821 (patch)
tree4b958d840e5f80e28bc8f9305cfd12ced971c57f /src/lux/compiler/case.clj
parentae5c933a5208c51fe30d0b9dc976690ee8bc138a (diff)
Simplified the compiler by using arrays to encode tuples & variants instead of using custom classes for that.
Diffstat (limited to 'src/lux/compiler/case.clj')
-rw-r--r--src/lux/compiler/case.clj41
1 files changed, 20 insertions, 21 deletions
diff --git a/src/lux/compiler/case.clj b/src/lux/compiler/case.clj
index b0a8a8ea6..48c52123f 100644
--- a/src/lux/compiler/case.clj
+++ b/src/lux/compiler/case.clj
@@ -63,9 +63,6 @@
[mappings (reverse pms)]))
(let [+tag-sig+ (&host/->type-signature "java.lang.String")
- +variant-class+ (&host/->class &host/variant-class)
- tuple-class* (&host/->class &host/tuple-class)
- +variant-value-sig+ (&host/->type-signature "java.lang.Object")
+oclass+ (&host/->class "java.lang.Object")
+equals-sig+ (str "(" (&host/->type-signature "java.lang.Object") ")Z")]
(defn ^:private compile-match [writer ?match $target $else]
@@ -123,32 +120,34 @@
(.visitJumpInsn Opcodes/GOTO $target))
[::TupleMatch ?members]
- (let [tuple-class** (str tuple-class* (count ?members))]
- (doto writer
- (.visitTypeInsn Opcodes/CHECKCAST tuple-class**)
- (-> (doto (.visitInsn Opcodes/DUP)
- (.visitFieldInsn Opcodes/GETFIELD tuple-class** (str &&/tuple-field-prefix idx) +variant-value-sig+)
- (compile-match member $next $sub-else)
- (.visitLabel $sub-else)
- (.visitInsn Opcodes/POP)
- (.visitJumpInsn Opcodes/GOTO $else)
- (.visitLabel $next))
- (->> (doseq [[idx [_ _ member]] (map vector (range (count ?members)) ?members)
- :let [$next (new Label)
- $sub-else (new Label)]])))
- (.visitInsn Opcodes/POP)
- (.visitJumpInsn Opcodes/GOTO $target)))
+ (doto writer
+ (.visitTypeInsn Opcodes/CHECKCAST "[Ljava/lang/Object;")
+ (-> (doto (.visitInsn Opcodes/DUP)
+ (.visitLdcInsn (int idx))
+ (.visitInsn Opcodes/AALOAD)
+ (compile-match member $next $sub-else)
+ (.visitLabel $sub-else)
+ (.visitInsn Opcodes/POP)
+ (.visitJumpInsn Opcodes/GOTO $else)
+ (.visitLabel $next))
+ (->> (doseq [[idx [_ _ member]] (map vector (range (count ?members)) ?members)
+ :let [$next (new Label)
+ $sub-else (new Label)]])))
+ (.visitInsn Opcodes/POP)
+ (.visitJumpInsn Opcodes/GOTO $target))
[::VariantMatch ?tag [::Pattern _ ?value]]
(doto writer
- (.visitTypeInsn Opcodes/CHECKCAST +variant-class+)
+ (.visitTypeInsn Opcodes/CHECKCAST "[Ljava/lang/Object;")
(.visitInsn Opcodes/DUP)
- (.visitFieldInsn Opcodes/GETFIELD +variant-class+ "tag" +tag-sig+)
+ (.visitLdcInsn (int 0))
+ (.visitInsn Opcodes/AALOAD)
(.visitLdcInsn ?tag)
(.visitMethodInsn Opcodes/INVOKEVIRTUAL +oclass+ "equals" +equals-sig+)
(.visitJumpInsn Opcodes/IFEQ $else)
(.visitInsn Opcodes/DUP)
- (.visitFieldInsn Opcodes/GETFIELD +variant-class+ "value" +variant-value-sig+)
+ (.visitLdcInsn (int 1))
+ (.visitInsn Opcodes/AALOAD)
(-> (doto (compile-match ?value $value-then $value-else)
(.visitLabel $value-then)
(.visitInsn Opcodes/POP)