aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2015-09-28 22:25:32 -0400
committerEduardo Julian2015-09-28 22:25:32 -0400
commitf5c046279de3c28e3d83dda116f2b3742766a93b (patch)
treeb95cf9fdea61c0716906078edc4232d720c356cd
parent968eb87adef6d62803543adf2ec51049527ccb33 (diff)
- Removed reflection warnings.
- Made some improvements to working with object arrays.
Diffstat (limited to '')
-rw-r--r--source/lux/host/jvm.lux2
-rw-r--r--src/lux/analyser.clj10
-rw-r--r--src/lux/analyser/host.clj130
-rw-r--r--src/lux/analyser/module.clj2
-rw-r--r--src/lux/compiler.clj8
-rw-r--r--src/lux/compiler/cache.clj2
-rw-r--r--src/lux/compiler/host.clj27
-rw-r--r--src/lux/host.clj8
-rw-r--r--src/lux/packager/lib.clj15
-rw-r--r--src/lux/type/host.clj16
10 files changed, 116 insertions, 104 deletions
diff --git a/source/lux/host/jvm.lux b/source/lux/host/jvm.lux
index cb818eb2b..573e181b5 100644
--- a/source/lux/host/jvm.lux
+++ b/source/lux/host/jvm.lux
@@ -246,7 +246,7 @@
(|> idxs
(map (: (-> Int Text)
(lambda [idx]
- (_jvm_invokevirtual "java.lang.Object" "toString" [] (_jvm_aaload "java.lang.StackTraceElement" trace idx) []))))
+ (_jvm_invokevirtual "java.lang.Object" "toString" [] (_jvm_aaload trace idx) []))))
(interpose "\n")
(foldL text:++ "")
)))
diff --git a/src/lux/analyser.clj b/src/lux/analyser.clj
index c02ba03d0..0b911f9ed 100644
--- a/src/lux/analyser.clj
+++ b/src/lux/analyser.clj
@@ -117,7 +117,7 @@
(&&host/analyse-jvm-laload analyse exo-type ?array ?idx)
_
- (assert false (str "Unknown syntax: " (prn-str (&/show-ast (&&/|meta (&/T "" -1 -1) token)))))))
+ (assert false (str "Unknown syntax: " (prn-str (&/show-ast (&/T (&/T "" -1 -1) token)))))))
(defn ^:private aba9 [analyse eval! compile-module compile-token exo-type token]
(|case token
@@ -158,11 +158,11 @@
(&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_anewarray")] (&/$Cons [_ (&/$TextS ?class)] (&/$Cons ?length (&/$Nil)))))
(&&host/analyse-jvm-anewarray analyse exo-type ?class ?length)
- (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_aastore")] (&/$Cons [_ (&/$TextS ?class)] (&/$Cons ?array (&/$Cons ?idx (&/$Cons ?elem (&/$Nil)))))))
- (&&host/analyse-jvm-aastore analyse exo-type ?class ?array ?idx ?elem)
+ (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_aastore")] (&/$Cons ?array (&/$Cons ?idx (&/$Cons ?elem (&/$Nil))))))
+ (&&host/analyse-jvm-aastore analyse exo-type ?array ?idx ?elem)
- (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_aaload")] (&/$Cons [_ (&/$TextS ?class)] (&/$Cons ?array (&/$Cons ?idx (&/$Nil))))))
- (&&host/analyse-jvm-aaload analyse exo-type ?class ?array ?idx)
+ (&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_aaload")] (&/$Cons ?array (&/$Cons ?idx (&/$Nil)))))
+ (&&host/analyse-jvm-aaload analyse exo-type ?array ?idx)
(&/$FormS (&/$Cons [_ (&/$SymbolS _ "_jvm_arraylength")] (&/$Cons ?array (&/$Nil))))
(&&host/analyse-jvm-arraylength analyse exo-type ?array)
diff --git a/src/lux/analyser/host.clj b/src/lux/analyser/host.clj
index cf361da22..9a38022d8 100644
--- a/src/lux/analyser/host.clj
+++ b/src/lux/analyser/host.clj
@@ -34,9 +34,9 @@
(let [exceptions (&/|map #(Class/forName % true class-loader) exceptions)
catching (->> state (&/get$ &/$host) (&/get$ &/$catching)
(&/|map #(Class/forName % true class-loader)))]
- (if-let [missing-ex (&/fold (fn [prev now]
+ (if-let [missing-ex (&/fold (fn [prev ^Class now]
(or prev
- (if (&/fold (fn [found? ex-catch]
+ (if (&/fold (fn [found? ^Class ex-catch]
(or found?
(.isAssignableFrom ex-catch now)))
false
@@ -206,7 +206,7 @@
(|case obj-type
(&/$DataT class targs)
(if (= (&/|length targs) (&/|length gvars))
- (|let [gtype-env (&/fold2 (fn [m g t] (&/Cons$ (&/T (.getName g) t) m))
+ (|let [gtype-env (&/fold2 (fn [m ^TypeVariable g t] (&/Cons$ (&/T (.getName g) t) m))
(&/|table)
gvars
targs)]
@@ -382,58 +382,58 @@
(return (&/|list (&&/|meta exo-type _cursor
(&/V &&/$jvm-new (&/T class classes =args)))))))
-(do-template [<class> <new-name> <new-tag> <load-name> <load-tag> <store-name> <store-tag>]
- (let [elem-type (&type/Data$ <class> &/Nil$)
- array-type (&type/Data$ &host-type/array-data-tag (&/|list elem-type))
- length-type &type/Int
- idx-type &type/Int]
- (defn <new-name> [analyse exo-type length]
- (|do [=length (&&/analyse-1 analyse length-type length)
- _ (&type/check exo-type array-type)
- _cursor &/cursor]
- (return (&/|list (&&/|meta exo-type _cursor
- (&/V <new-tag> =length))))))
-
- (defn <load-name> [analyse exo-type array idx]
- (|do [=array (&&/analyse-1 analyse array-type array)
- =idx (&&/analyse-1 analyse idx-type idx)
- _ (&type/check exo-type elem-type)
- _cursor &/cursor]
- (return (&/|list (&&/|meta exo-type _cursor
- (&/V <load-tag> (&/T =array =idx)))))))
-
- (defn <store-name> [analyse exo-type array idx elem]
- (|do [=array (&&/analyse-1 analyse array-type array)
- =idx (&&/analyse-1 analyse idx-type idx)
- =elem (&&/analyse-1 analyse elem-type elem)
- _ (&type/check exo-type array-type)
- _cursor &/cursor]
- (return (&/|list (&&/|meta exo-type _cursor
- (&/V <store-tag> (&/T =array =idx =elem)))))))
- )
-
- "java.lang.Boolean" analyse-jvm-znewarray &&/$jvm-znewarray analyse-jvm-zaload &&/$jvm-zaload analyse-jvm-zastore &&/$jvm-zastore
- "java.lang.Byte" analyse-jvm-bnewarray &&/$jvm-bnewarray analyse-jvm-baload &&/$jvm-baload analyse-jvm-bastore &&/$jvm-bastore
- "java.lang.Short" analyse-jvm-snewarray &&/$jvm-snewarray analyse-jvm-saload &&/$jvm-saload analyse-jvm-sastore &&/$jvm-sastore
- "java.lang.Integer" analyse-jvm-inewarray &&/$jvm-inewarray analyse-jvm-iaload &&/$jvm-iaload analyse-jvm-iastore &&/$jvm-iastore
- "java.lang.Long" analyse-jvm-lnewarray &&/$jvm-lnewarray analyse-jvm-laload &&/$jvm-laload analyse-jvm-lastore &&/$jvm-lastore
- "java.lang.Float" analyse-jvm-fnewarray &&/$jvm-fnewarray analyse-jvm-faload &&/$jvm-faload analyse-jvm-fastore &&/$jvm-fastore
- "java.lang.Double" analyse-jvm-dnewarray &&/$jvm-dnewarray analyse-jvm-daload &&/$jvm-daload analyse-jvm-dastore &&/$jvm-dastore
- "java.lang.Character" analyse-jvm-cnewarray &&/$jvm-cnewarray analyse-jvm-caload &&/$jvm-caload analyse-jvm-castore &&/$jvm-castore
- )
+(let [length-type &type/Int
+ idx-type &type/Int]
+ (do-template [<class> <new-name> <new-tag> <load-name> <load-tag> <store-name> <store-tag>]
+ (let [elem-type (&type/Data$ <class> &/Nil$)
+ array-type (&type/Data$ &host-type/array-data-tag (&/|list elem-type))]
+ (defn <new-name> [analyse exo-type length]
+ (|do [=length (&&/analyse-1 analyse length-type length)
+ _ (&type/check exo-type array-type)
+ _cursor &/cursor]
+ (return (&/|list (&&/|meta exo-type _cursor
+ (&/V <new-tag> =length))))))
+
+ (defn <load-name> [analyse exo-type array idx]
+ (|do [=array (&&/analyse-1 analyse array-type array)
+ =idx (&&/analyse-1 analyse idx-type idx)
+ _ (&type/check exo-type elem-type)
+ _cursor &/cursor]
+ (return (&/|list (&&/|meta exo-type _cursor
+ (&/V <load-tag> (&/T =array =idx)))))))
+
+ (defn <store-name> [analyse exo-type array idx elem]
+ (|do [=array (&&/analyse-1 analyse array-type array)
+ =idx (&&/analyse-1 analyse idx-type idx)
+ =elem (&&/analyse-1 analyse elem-type elem)
+ _ (&type/check exo-type array-type)
+ _cursor &/cursor]
+ (return (&/|list (&&/|meta exo-type _cursor
+ (&/V <store-tag> (&/T =array =idx =elem)))))))
+ )
+
+ "java.lang.Boolean" analyse-jvm-znewarray &&/$jvm-znewarray analyse-jvm-zaload &&/$jvm-zaload analyse-jvm-zastore &&/$jvm-zastore
+ "java.lang.Byte" analyse-jvm-bnewarray &&/$jvm-bnewarray analyse-jvm-baload &&/$jvm-baload analyse-jvm-bastore &&/$jvm-bastore
+ "java.lang.Short" analyse-jvm-snewarray &&/$jvm-snewarray analyse-jvm-saload &&/$jvm-saload analyse-jvm-sastore &&/$jvm-sastore
+ "java.lang.Integer" analyse-jvm-inewarray &&/$jvm-inewarray analyse-jvm-iaload &&/$jvm-iaload analyse-jvm-iastore &&/$jvm-iastore
+ "java.lang.Long" analyse-jvm-lnewarray &&/$jvm-lnewarray analyse-jvm-laload &&/$jvm-laload analyse-jvm-lastore &&/$jvm-lastore
+ "java.lang.Float" analyse-jvm-fnewarray &&/$jvm-fnewarray analyse-jvm-faload &&/$jvm-faload analyse-jvm-fastore &&/$jvm-fastore
+ "java.lang.Double" analyse-jvm-dnewarray &&/$jvm-dnewarray analyse-jvm-daload &&/$jvm-daload analyse-jvm-dastore &&/$jvm-dastore
+ "java.lang.Character" analyse-jvm-cnewarray &&/$jvm-cnewarray analyse-jvm-caload &&/$jvm-caload analyse-jvm-castore &&/$jvm-castore
+ ))
(let [length-type &type/Int
idx-type &type/Int]
(defn analyse-jvm-anewarray [analyse exo-type class length]
- (let [elem-type (&type/Data$ class &/Nil$)
- array-type (&type/Data$ &host-type/array-data-tag (&/|list elem-type))]
- (|do [=length (&&/analyse-1 analyse length-type length)
- _ (&type/check exo-type array-type)
- _cursor &/cursor]
- (return (&/|list (&&/|meta exo-type _cursor
- (&/V &&/$jvm-anewarray (&/T class =length))))))))
+ (|do [elem-type (&host-type/dummy-gtype class)
+ :let [array-type (&type/Data$ &host-type/array-data-tag (&/|list elem-type))]
+ =length (&&/analyse-1 analyse length-type length)
+ _ (&type/check exo-type array-type)
+ _cursor &/cursor]
+ (return (&/|list (&&/|meta exo-type _cursor
+ (&/V &&/$jvm-anewarray (&/T class =length)))))))
- (defn analyse-jvm-aaload [analyse exo-type class array idx]
+ (defn analyse-jvm-aaload [analyse exo-type array idx]
(|do [=array (&&/analyse-1+ analyse array)
[arr-class arr-params] (ensure-object (&&/expr-type* =array))
_ (&/assert! (= &host-type/array-data-tag arr-class) (str "[Analyser Error] Expected array. Instead got: " arr-class))
@@ -442,18 +442,20 @@
_ (&type/check exo-type inner-arr-type)
_cursor &/cursor]
(return (&/|list (&&/|meta exo-type _cursor
- (&/V &&/$jvm-aaload (&/T class =array =idx)))))))
+ (&/V &&/$jvm-aaload (&/T =array =idx)))))))
- (defn analyse-jvm-aastore [analyse exo-type class array idx elem]
- (let [elem-type (&type/Data$ class &/Nil$)
- array-type (&type/Data$ &host-type/array-data-tag (&/|list elem-type))]
- (|do [=array (&&/analyse-1 analyse array-type array)
- =idx (&&/analyse-1 analyse idx-type idx)
- =elem (&&/analyse-1 analyse elem-type elem)
- _ (&type/check exo-type array-type)
- _cursor &/cursor]
- (return (&/|list (&&/|meta exo-type _cursor
- (&/V &&/$jvm-aastore (&/T class =array =idx =elem)))))))))
+ (defn analyse-jvm-aastore [analyse exo-type array idx elem]
+ (|do [=array (&&/analyse-1+ analyse array)
+ :let [array-type (&&/expr-type* =array)]
+ [arr-class arr-params] (ensure-object array-type)
+ _ (&/assert! (= &host-type/array-data-tag arr-class) (str "[Analyser Error] Expected array. Instead got: " arr-class))
+ :let [(&/$Cons inner-arr-type (&/$Nil)) arr-params]
+ =idx (&&/analyse-1 analyse idx-type idx)
+ =elem (&&/analyse-1 analyse inner-arr-type elem)
+ _ (&type/check exo-type array-type)
+ _cursor &/cursor]
+ (return (&/|list (&&/|meta exo-type _cursor
+ (&/V &&/$jvm-aastore (&/T =array =idx =elem))))))))
(defn analyse-jvm-arraylength [analyse exo-type array]
(|do [=array (&&/analyse-1+ analyse array)
@@ -725,7 +727,7 @@
_ (check-method-completion (&/Cons$ super-class interfaces) =methods)
;; :let [_ (prn 'analyse-jvm-anon-class/_4 name anon-class)]
=captured &&env/captured-vars
- :let [=fields (&/|map (fn [idx+capt]
+ :let [=fields (&/|map (fn [^objects idx+capt]
{:name (str &c!base/closure-prefix (aget idx+capt 0))
:modifiers captured-slot-modifier
:anns (&/|list)
@@ -738,7 +740,7 @@
;; :let [_ (prn 'analyse-jvm-anon-class/_5 name anon-class)]
;; _ (compile-token (&/T (&/V &&/$jvm-anon-class (&/T name super-class interfaces =captured =methods)) exo-type))
_ (compile-token (&/V &&/$jvm-class (&/T name super-class interfaces (&/|list) =fields =methods =captured)))
- :let [_ (println 'DEF anon-class)]
+ ;; :let [_ (println 'DEF anon-class)]
_cursor &/cursor]
(return (&/|list (&&/|meta (&type/Data$ anon-class (&/|list)) _cursor
(&/V &&/$jvm-new (&/T anon-class (&/|repeat (&/|length sources) captured-slot-type) sources))
@@ -754,7 +756,7 @@
idx &&env/next-local-idx]
(return (&/T ?ex-class idx =catch-body))))
?catches)
- :let [catched-exceptions (&/|map #(aget % 0) =catches)]
+ :let [catched-exceptions (&/|map #(aget ^objects % 0) =catches)]
=body (with-catches catched-exceptions
(&&/analyse-1 analyse exo-type ?body))
=finally (|case ?finally
diff --git a/src/lux/analyser/module.clj b/src/lux/analyser/module.clj
index 63ba9b741..c645a9566 100644
--- a/src/lux/analyser/module.clj
+++ b/src/lux/analyser/module.clj
@@ -59,7 +59,7 @@
state)
nil))))
-(defn define [module name def-data type]
+(defn define [module name ^objects def-data type]
;; (prn 'define module name (aget def-data 0) (&type/show-type type))
(fn [state]
(when (and (= "Macro" name) (= "lux" module))
diff --git a/src/lux/compiler.clj b/src/lux/compiler.clj
index 9e399205f..76d3a1eb2 100644
--- a/src/lux/compiler.clj
+++ b/src/lux/compiler.clj
@@ -309,11 +309,11 @@
(&a/$jvm-anewarray ?class ?length)
(&&host/compile-jvm-anewarray compile-expression ?class ?length)
- (&a/$jvm-aastore ?class ?array ?idx ?elem)
- (&&host/compile-jvm-aastore compile-expression ?class ?array ?idx ?elem)
+ (&a/$jvm-aastore ?array ?idx ?elem)
+ (&&host/compile-jvm-aastore compile-expression ?array ?idx ?elem)
- (&a/$jvm-aaload ?class ?array ?idx)
- (&&host/compile-jvm-aaload compile-expression ?class ?array ?idx)
+ (&a/$jvm-aaload ?array ?idx)
+ (&&host/compile-jvm-aaload compile-expression ?array ?idx)
(&a/$jvm-arraylength ?array)
(&&host/compile-jvm-arraylength compile-expression ?array)
diff --git a/src/lux/compiler/cache.clj b/src/lux/compiler/cache.clj
index 4f37e8b62..f1b21f6fd 100644
--- a/src/lux/compiler/cache.clj
+++ b/src/lux/compiler/cache.clj
@@ -32,7 +32,7 @@
(defn ^:private clean-file [^File file]
"(-> File (,))"
- (doseq [f (seq (.listFiles file))
+ (doseq [^File f (seq (.listFiles file))
:when (not (.isDirectory f))]
(.delete f)))
diff --git a/src/lux/compiler/host.clj b/src/lux/compiler/host.clj
index 7f7509998..6d926e6da 100644
--- a/src/lux/compiler/host.clj
+++ b/src/lux/compiler/host.clj
@@ -22,7 +22,8 @@
(:import (org.objectweb.asm Opcodes
Label
ClassWriter
- MethodVisitor)))
+ MethodVisitor
+ AnnotationVisitor)))
;; [Utils]
(let [class+method+sig {"boolean" [(&host/->class "java.lang.Boolean") "booleanValue" "()Z"]
@@ -342,7 +343,7 @@
:let [_ (.visitTypeInsn *writer* Opcodes/ANEWARRAY (&host/->class ?class))]]
(return nil)))
-(defn compile-jvm-aaload [compile ?class ?array ?idx]
+(defn compile-jvm-aaload [compile ?array ?idx]
(|do [^MethodVisitor *writer* &/get-writer
_ (compile ?array)
:let [_ (.visitTypeInsn *writer* Opcodes/CHECKCAST "[Ljava/lang/Object;")]
@@ -353,7 +354,7 @@
:let [_ (.visitInsn *writer* Opcodes/AALOAD)]]
(return nil)))
-(defn compile-jvm-aastore [compile ?class ?array ?idx ?elem]
+(defn compile-jvm-aastore [compile ?array ?idx ?elem]
(|do [^MethodVisitor *writer* &/get-writer
_ (compile ?array)
:let [_ (.visitTypeInsn *writer* Opcodes/CHECKCAST "[Ljava/lang/Object;")]
@@ -420,25 +421,21 @@
(return nil)))
(defn ^:private compile-annotation [writer ann]
- (doto (.visitAnnotation writer (&host/->class (:name ann)) true)
+ (doto ^AnnotationVisitor (.visitAnnotation writer (&host/->class (:name ann)) true)
(-> (.visit param-name param-value)
(->> (|let [[param-name param-value] param])
(doseq [param (&/->seq (:params ann))])))
(.visitEnd))
nil)
-(defn ^:private compile-field [writer field]
+(defn ^:private compile-field [^ClassWriter writer field]
(let [=field (.visitField writer (&host/modifiers->int (:modifiers field)) (:name field)
(&host/->type-signature (:type field)) nil nil)]
(&/|map (partial compile-annotation =field) (:anns field))
(.visitEnd =field)
- nil)
- ;; (doto (.visitField writer (&host/modifiers->int (:modifiers field)) (:name field)
- ;; (&host/->type-signature (:type field)) nil nil)
- ;; (.visitEnd))
- )
+ nil))
-(defn ^:private compile-method-return [writer output]
+(defn ^:private compile-method-return [^MethodVisitor writer output]
(case output
"void" (.visitInsn writer Opcodes/RETURN)
"boolean" (doto writer
@@ -468,7 +465,7 @@
;; else
(.visitInsn writer Opcodes/ARETURN)))
-(defn ^:private compile-method [compile class-writer method]
+(defn ^:private compile-method [compile ^ClassWriter class-writer method]
;; (prn 'compile-method/_0 (dissoc method :inputs :output :body))
;; (prn 'compile-method/_1 (&/adt->text (:inputs method)))
;; (prn 'compile-method/_2 (&/adt->text (:output method)))
@@ -490,7 +487,7 @@
(.visitEnd))]]
(return nil)))))
-(defn ^:private compile-method-decl [class-writer method]
+(defn ^:private compile-method-decl [^ClassWriter class-writer method]
(|let [signature (str "(" (&/fold str "" (&/|map &host/->type-signature (:inputs method))) ")"
(&host/->type-signature (:output method)))]
(let [=method (.visitMethod class-writer (&host/modifiers->int (:modifiers method)) (:name method) signature nil (->> (:exceptions method) (&/|map &host/->class) &/->seq (into-array java.lang.String)))]
@@ -503,8 +500,8 @@
(str "(" (&/fold str "" (&/|repeat (&/|length env) clo-field-sig)) ")"
<init>-return))
- (defn ^:private add-anon-class-<init> [class-writer class-name env]
- (doto (.visitMethod ^ClassWriter class-writer Opcodes/ACC_PUBLIC "<init>" (anon-class-<init>-signature env) nil nil)
+ (defn ^:private add-anon-class-<init> [^ClassWriter class-writer class-name env]
+ (doto (.visitMethod class-writer Opcodes/ACC_PUBLIC "<init>" (anon-class-<init>-signature env) nil nil)
(.visitCode)
(.visitVarInsn Opcodes/ALOAD 0)
(.visitMethodInsn Opcodes/INVOKESPECIAL "java/lang/Object" "<init>" "()V")
diff --git a/src/lux/host.clj b/src/lux/host.clj
index 00f1307ad..133c50e9b 100644
--- a/src/lux/host.clj
+++ b/src/lux/host.clj
@@ -129,7 +129,7 @@
gvars (->> method .getTypeParameters seq &/->list)
gargs (->> method .getGenericParameterTypes seq &/->list)]
(return (&/T (.getGenericReturnType method)
- (->> method .getExceptionTypes &/->list (&/|map #(.getName %)))
+ (->> method .getExceptionTypes &/->list (&/|map #(.getName ^Class %)))
parent-gvars
gvars
gargs)))
@@ -152,13 +152,13 @@
=method))]
(|let [gvars (->> target-class .getTypeParameters seq &/->list)
gargs (->> ctor .getGenericParameterTypes seq &/->list)
- exs (->> ctor .getExceptionTypes &/->list (&/|map #(.getName %)))]
+ exs (->> ctor .getExceptionTypes &/->list (&/|map #(.getName ^Class %)))]
(return (&/T exs gvars gargs)))
(fail (str "[Host Error] Constructor does not exist: " target)))))
(defn abstract-methods [class-loader class]
(return (&/->list (for [^Method =method (.getDeclaredMethods (Class/forName (&host-type/as-obj class) true class-loader))
- :when (.equals true (Modifier/isAbstract (.getModifiers =method)))]
+ :when (Modifier/isAbstract (.getModifiers =method))]
(&/T (.getName =method) (&/|map #(.getName ^Class %) (&/->list (seq (.getParameterTypes =method)))))))))
(defn location [scope]
@@ -180,7 +180,7 @@
0)))
(let [object-real-class (->class "java.lang.Object")]
- (defn ^:private dummy-return [writer name output]
+ (defn ^:private dummy-return [^MethodVisitor writer name output]
(case output
"void" (if (= "<init>" name)
(doto writer
diff --git a/src/lux/packager/lib.clj b/src/lux/packager/lib.clj
index 41f3143a0..af48e31eb 100644
--- a/src/lux/packager/lib.clj
+++ b/src/lux/packager/lib.clj
@@ -13,23 +13,24 @@
))
;; [Utils]
-(defn ^:private read-file [file]
+(defn ^:private read-file ^objects [^File file]
(with-open [is (java.io.FileInputStream. file)]
(let [data (byte-array (.length file))]
(.read is data)
data)))
-(defn ^:private add-to-tar! [prefix ^File file os]
+(defn ^:private add-to-tar! [prefix ^File file ^TarArchiveOutputStream os]
"(-> Text File TarArchiveOutputStream Unit)"
(let [file-name (str prefix "/" (.getName file))]
(if (.isDirectory file)
(doseq [file (seq (.listFiles file))]
(add-to-tar! file-name file os))
- (doto os
- (.putArchiveEntry (doto (new TarArchiveEntry file-name)
- (.setSize (.length file))))
- (.write (read-file file))
- (.closeArchiveEntry)))))
+ (let [data (read-file file)]
+ (doto os
+ (.putArchiveEntry (doto (new TarArchiveEntry file-name)
+ (.setSize (.length file))))
+ (.write data 0 (alength data))
+ (.closeArchiveEntry))))))
;; [Exports]
(defn package [output-lib-name ^File source-dir]
diff --git a/src/lux/type/host.clj b/src/lux/type/host.clj
index 3121a2213..e121cee86 100644
--- a/src/lux/type/host.clj
+++ b/src/lux/type/host.clj
@@ -115,14 +115,16 @@
(|let [matchings (match-params sub-type-params params)]
(&/map% (partial instance-param existential matchings) super-type-params)))
-(defn ^:private raise* [existential sub+params super]
+(defn ^:private raise* [existential sub+params ^Class super]
"(-> (, Class (List Type)) Class (Lux (, Class (List Type))))"
(|let [[^Class sub params] sub+params]
(if (.isInterface super)
(|do [:let [super-params (->> sub
.getGenericInterfaces
(some #(if (= super (if (instance? Class %) % (.getRawType ^ParameterizedType %)))
- (if (instance? Class %) (&/|list) (->> % .getActualTypeArguments seq &/->list))
+ (if (instance? Class %)
+ (&/|list)
+ (->> ^ParameterizedType % .getActualTypeArguments seq &/->list))
nil)))]
params* (translate-params existential
super-params
@@ -209,3 +211,13 @@
:else
(fail (str "[Type Error] Names don't match: " e!name " =/= " a!name)))))))
+
+(let [Void$ (&/V &/$VariantT (&/|list))
+ gen-type (constantly Void$)]
+ (defn dummy-gtype [class]
+ (|do [class-loader &/loader]
+ (try (|let [=class (Class/forName class true class-loader)
+ params (->> =class .getTypeParameters seq &/->list (&/|map gen-type))]
+ (return (&/V &/$DataT (&/T class params))))
+ (catch Exception e
+ (fail (str "[Type Error] Unknown type: " class)))))))