diff options
author | Eduardo Julian | 2015-03-01 23:39:58 -0400 |
---|---|---|
committer | Eduardo Julian | 2015-03-01 23:39:58 -0400 |
commit | 4908fef51307348d8469d8e95885fa9a0d8eb821 (patch) | |
tree | 4b958d840e5f80e28bc8f9305cfd12ced971c57f /src/lux/compiler/case.clj | |
parent | ae5c933a5208c51fe30d0b9dc976690ee8bc138a (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.clj | 41 |
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) |