diff options
Diffstat (limited to 'src/lux/compiler')
-rw-r--r-- | src/lux/compiler/host.clj | 12 | ||||
-rw-r--r-- | src/lux/compiler/lambda.clj | 2 | ||||
-rw-r--r-- | src/lux/compiler/lux.clj | 93 |
3 files changed, 7 insertions, 100 deletions
diff --git a/src/lux/compiler/host.clj b/src/lux/compiler/host.clj index c46684622..40ad7bb6d 100644 --- a/src/lux/compiler/host.clj +++ b/src/lux/compiler/host.clj @@ -40,22 +40,22 @@ char-class "java.lang.Character"] (defn prepare-return! [*writer* *type*] (matchv ::M/objects [*type*] - [["lux;TNothing" nil]] + [["lux;NothingT" nil]] (.visitInsn *writer* Opcodes/ACONST_NULL) - [["lux;TData" ["char" _]]] + [["lux;DataT" ["char" _]]] (.visitMethodInsn *writer* Opcodes/INVOKESTATIC (&host/->class char-class) "valueOf" (str "(C)" (&host/->type-signature char-class))) - [["lux;TData" ["int" _]]] + [["lux;DataT" ["int" _]]] (.visitMethodInsn *writer* Opcodes/INVOKESTATIC (&host/->class integer-class) "valueOf" (str "(I)" (&host/->type-signature integer-class))) - [["lux;TData" ["long" _]]] + [["lux;DataT" ["long" _]]] (.visitMethodInsn *writer* Opcodes/INVOKESTATIC (&host/->class long-class) "valueOf" (str "(J)" (&host/->type-signature long-class))) - [["lux;TData" ["boolean" _]]] + [["lux;DataT" ["boolean" _]]] (.visitMethodInsn *writer* Opcodes/INVOKESTATIC (&host/->class boolean-class) "valueOf" (str "(Z)" (&host/->type-signature boolean-class))) - [["lux;TData" [_ _]]] + [["lux;DataT" [_ _]]] nil) *writer*)) diff --git a/src/lux/compiler/lambda.clj b/src/lux/compiler/lambda.clj index 7d53fa739..cce87e978 100644 --- a/src/lux/compiler/lambda.clj +++ b/src/lux/compiler/lambda.clj @@ -65,7 +65,7 @@ $start (new Label) $end (new Label) _ (doto *writer* - (-> (.visitLocalVariable (str &&/local-prefix idx) (&host/->java-sig (&/V "lux;TAny" nil)) nil $start $end (+ 2 idx)) + (-> (.visitLocalVariable (str &&/local-prefix idx) (&host/->java-sig (&/V "lux;AnyT" nil)) nil $start $end (+ 2 idx)) (->> (dotimes [idx num-locals]))) (.visitLabel $start))] ret (compile impl-body) diff --git a/src/lux/compiler/lux.clj b/src/lux/compiler/lux.clj index 412055956..a761f431a 100644 --- a/src/lux/compiler/lux.clj +++ b/src/lux/compiler/lux.clj @@ -132,99 +132,6 @@ :let [_ (.visitMethodInsn *writer* Opcodes/INVOKEINTERFACE (&host/->class &host/function-class) "apply" &&/apply-signature)]] (return nil))) -(defn compile-get [compile *type* ?slot ?record] - (exec [*writer* &/get-writer - _ (compile ?record) - :let [$then (new Label) - $test-else (new Label) - $end (new Label) - $start (new Label) - _ (doto *writer* ;; record - (.visitInsn Opcodes/DUP) ;; record, record - (.visitInsn Opcodes/ARRAYLENGTH) ;; record, length - (.visitInsn Opcodes/ICONST_2) ;; record, length, 2 - (.visitInsn Opcodes/ISUB) ;; record, length-- - - (.visitLabel $start) - (.visitInsn Opcodes/DUP) ;; record, length, length - (.visitLdcInsn (int -2)) ;; record, length, length, -2 - (.visitJumpInsn Opcodes/IF_ICMPEQ $then) ;; record, length - ;;; - (.visitInsn Opcodes/DUP2) ;; record, length, record, length - (.visitInsn Opcodes/AALOAD) ;; record, length, aslot - (.visitLdcInsn ?slot) ;; record, length, aslot, eslot - (.visitMethodInsn Opcodes/INVOKEVIRTUAL (&host/->class "java.lang.Object") "equals" (str "(" (&host/->type-signature "java.lang.Object") ")Z")) ;; record, length, Z - (.visitJumpInsn Opcodes/IFEQ $test-else) ;; record, length - (.visitInsn Opcodes/ICONST_1) ;; record, length, 1 - (.visitInsn Opcodes/IADD) ;; record, length+ - (.visitInsn Opcodes/AALOAD) ;; value - (.visitJumpInsn Opcodes/GOTO $end) - (.visitLabel $test-else) - (.visitInsn Opcodes/ICONST_2) ;; record, length, 2 - (.visitInsn Opcodes/ISUB) ;; record, length-- - (.visitJumpInsn Opcodes/GOTO $start) - ;;; - (.visitLabel $then) - (.visitInsn Opcodes/POP) ;; record - (.visitInsn Opcodes/POP) ;; - (.visitInsn Opcodes/ACONST_NULL) ;; null - (.visitLabel $end))]] - (return nil))) - -(let [o-sig (&host/->type-signature "java.lang.Object")] - (defn compile-set [compile *type* ?slot ?value ?record] - (exec [*writer* &/get-writer - _ (compile ?record) - :let [$then (new Label) - $test-else (new Label) - $end (new Label) - $start (new Label) - _ (doto *writer* ;; record1 - ;;; - (.visitInsn Opcodes/DUP) ;; record1, record1 - (.visitInsn Opcodes/ARRAYLENGTH) ;; record1, length1 - (.visitTypeInsn Opcodes/ANEWARRAY (&host/->class "java.lang.Object")) ;; record1, record2 - (.visitInsn Opcodes/DUP_X1) ;; record2, record1, record2 - (.visitInsn Opcodes/ICONST_0) ;; record2, record1, record2, 0 - (.visitInsn Opcodes/SWAP) ;; record2, record1, 0, record2 - (.visitInsn Opcodes/DUP) ;; record2, record1, 0, record2, record2 - (.visitInsn Opcodes/ARRAYLENGTH) ;; record2, record1, 0, record2, length2 - (.visitInsn Opcodes/ICONST_0) ;; record2, record1, 0, record2, length2, 0 - (.visitInsn Opcodes/SWAP) ;; record2, record1, 0, record2, 0, length2 - (.visitMethodInsn Opcodes/INVOKESTATIC (&host/->class "java.lang.System") "arraycopy" (str "(" o-sig "I" o-sig "I" "I" ")V")) ;; record2 - ;;; - (.visitInsn Opcodes/DUP) ;; record, record - (.visitInsn Opcodes/ARRAYLENGTH) ;; record, length - (.visitInsn Opcodes/ICONST_2) ;; record, length, 2 - (.visitInsn Opcodes/ISUB) ;; record, length-- - - (.visitLabel $start) - (.visitInsn Opcodes/DUP) ;; record, length, length - (.visitLdcInsn (int -2)) ;; record, length, length, -2 - (.visitJumpInsn Opcodes/IF_ICMPEQ $then) ;; record, length - ;;; - (.visitInsn Opcodes/DUP2) ;; record, length, record, length - (.visitInsn Opcodes/AALOAD) ;; record, length, aslot - (.visitLdcInsn ?slot) ;; record, length, aslot, eslot - (.visitMethodInsn Opcodes/INVOKEVIRTUAL (&host/->class "java.lang.Object") "equals" (str "(" (&host/->type-signature "java.lang.Object") ")Z")) ;; record, length, Z - (.visitJumpInsn Opcodes/IFEQ $test-else) ;; record, length - (.visitInsn Opcodes/DUP2) ;; record, length, record, length - (.visitInsn Opcodes/ICONST_1) ;; record, length, record, length, 1 - (.visitInsn Opcodes/IADD) ;; record, length, record, length+ - (do (compile ?value)) ;; record, length, record, length+, value - (.visitInsn Opcodes/AASTORE) ;; record, length - (.visitInsn Opcodes/POP) ;; record - (.visitJumpInsn Opcodes/GOTO $end) - (.visitLabel $test-else) - (.visitInsn Opcodes/ICONST_2) ;; record, length, 2 - (.visitInsn Opcodes/ISUB) ;; record, length-- - (.visitJumpInsn Opcodes/GOTO $start) - ;;; - (.visitLabel $then) - (.visitInsn Opcodes/POP) ;; record - (.visitLabel $end))]] - (return nil)))) - (defn compile-def [compile ?name ?body] (exec [*writer* &/get-writer module-name &/get-module-name |