diff options
Diffstat (limited to '')
-rw-r--r-- | src/lux/analyser/host.clj | 19 | ||||
-rw-r--r-- | src/lux/analyser/parser.clj | 66 | ||||
-rw-r--r-- | src/lux/compiler/host.clj | 13 | ||||
-rw-r--r-- | src/lux/host.clj | 26 | ||||
-rw-r--r-- | src/lux/host/generics.clj | 2 |
5 files changed, 31 insertions, 95 deletions
diff --git a/src/lux/analyser/host.clj b/src/lux/analyser/host.clj index a119ba981..44ebc8d1d 100644 --- a/src/lux/analyser/host.clj +++ b/src/lux/analyser/host.clj @@ -528,7 +528,7 @@ (|do [:let [[?cname ?cparams] class-decl class-type (&/V &/$GenericClass (&/T ?cname &/Nil$)) [?decl ?body] method - [_ _ _ ?gvars ?exs ?inputs ?output] ?decl + [_ _ ?gvars ?exs ?inputs ?output] ?decl all-gvars (&/|++ ?cparams ?gvars)] gvar-env (&/map% (fn [gvar] (|do [ex &type/existential] @@ -554,7 +554,7 @@ (|do [abstract-methods (mandatory-methods supers) :let [methods-map (&/fold (fn [mmap mentry] (prn 'methods-map (count mentry) mentry) - (|let [[[=name =modifiers =anns =gvars =exceptions =inputs =output] _] mentry] + (|let [[[=name =anns =gvars =exceptions =inputs =output] _] mentry] (assoc mmap =name mentry))) {} methods) @@ -562,7 +562,7 @@ (|let [[am-name am-inputs] abs-meth] (or missing (if-let [meth-struct (get methods-map am-name)] - (|let [[[=name =modifiers =anns =gvars =exceptions =inputs =output] _] meth-struct] + (|let [[[=name =anns =gvars =exceptions =inputs =output] _] meth-struct] (if (and (= (&/|length =inputs) (&/|length am-inputs)) (&/fold2 (fn [prev mi ai] (|let [[iname itype] mi] @@ -604,17 +604,7 @@ [name [_ (&&/$captured _ _ source)]] source)) -(let [captured-slot-modifier {:visibility "private" - :static? false - :final? false - :abstract? false - :concurrency nil} - default-<init> (&/T "<init>" - {:visibility "public" - :static? false - :final? false - :abstract? false - :concurrency nil} +(let [default-<init> (&/T "<init>" (&/|list) (&/|list) (&/|list) @@ -645,7 +635,6 @@ =captured &&env/captured-vars :let [=fields (&/|map (fn [^objects idx+capt] (&/T (str &c!base/closure-prefix (aget idx+capt 0)) - captured-slot-modifier (&/|list) captured-slot-type)) (&/enumerate =captured))] diff --git a/src/lux/analyser/parser.clj b/src/lux/analyser/parser.clj index 3625db30c..074b032ee 100644 --- a/src/lux/analyser/parser.clj +++ b/src/lux/analyser/parser.clj @@ -85,42 +85,6 @@ _ (fail (str "[Analyser Error] Wrong syntax for exception handler: " (&/show-ast token))))) -(defn parse-modifiers [modifiers] - (&/fold% (fn [so-far modif] - (|case modif - [_ (&/$TextS "public")] - (return (assoc so-far :visibility "public")) - - [_ (&/$TextS "private")] - (return (assoc so-far :visibility "private")) - - [_ (&/$TextS "protected")] - (return (assoc so-far :visibility "protected")) - - [_ (&/$TextS "static")] - (return (assoc so-far :static? true)) - - [_ (&/$TextS "final")] - (return (assoc so-far :final? true)) - - [_ (&/$TextS "abstract")] - (return (assoc so-far :abstract? true)) - - [_ (&/$TextS "synchronized")] - (return (assoc so-far :concurrency "synchronized")) - - [_ (&/$TextS "volatile")] - (return (assoc so-far :concurrency "volatile")) - - _ - (fail (str "[Analyser Error] Unknown modifier: " (&/show-ast modif))))) - {:visibility "default" - :static? false - :final? false - :abstract? false - :concurrency nil} - modifiers)) - (let [failure (fail (str "[Analyser Error] Invalid annotation parameter."))] (defn ^:private parse-ann-param [param] (|case param @@ -162,20 +126,18 @@ (defn ^:private parse-method-decl* [asts] (|case asts (&/$Cons [_ (&/$TextS method-name)] - (&/$Cons [_ (&/$TupleS modifiers)] - (&/$Cons [_ (&/$TupleS anns)] - (&/$Cons [_ (&/$TupleS gvars)] - (&/$Cons [_ (&/$TupleS exceptions)] - (&/$Cons [_ (&/$TupleS inputs)] - (&/$Cons output - *tail*))))))) - (|do [=modifiers (parse-modifiers modifiers) - =anns (&/map% parse-ann anns) + (&/$Cons [_ (&/$TupleS anns)] + (&/$Cons [_ (&/$TupleS gvars)] + (&/$Cons [_ (&/$TupleS exceptions)] + (&/$Cons [_ (&/$TupleS inputs)] + (&/$Cons output + *tail*)))))) + (|do [=anns (&/map% parse-ann anns) =gvars (&/map% parse-text gvars) =exceptions (&/map% parse-gclass exceptions) =inputs (&/map% parse-arg-decl inputs) =output (parse-gclass output)] - (return (&/T (&/T method-name =modifiers =anns =gvars =exceptions =inputs =output) + (return (&/T (&/T method-name =anns =gvars =exceptions =inputs =output) *tail*))) _ @@ -212,14 +174,12 @@ (defn parse-field [ast] (|case ast [_ (&/$FormS (&/$Cons [_ (&/$TextS ?name)] - (&/$Cons [_ (&/$TupleS ?modifiers)] - (&/$Cons [_ (&/$TupleS ?anns)] - (&/$Cons [_ (&/$TextS ?type)] - (&/$Nil))))))] - (|do [=modifiers (parse-modifiers ?modifiers) - =anns (&/map% parse-ann ?anns) + (&/$Cons [_ (&/$TupleS ?anns)] + (&/$Cons [_ (&/$TextS ?type)] + (&/$Nil)))))] + (|do [=anns (&/map% parse-ann ?anns) =type (parse-gclass ?type)] - (return (&/T ?name =modifiers =anns =type))) + (return (&/T ?name =anns =type))) _ (fail (str "[Analyser Error] Invalid field declaration: " (&/show-ast ast))))) diff --git a/src/lux/compiler/host.clj b/src/lux/compiler/host.clj index ea12ecc96..4b76f003e 100644 --- a/src/lux/compiler/host.clj +++ b/src/lux/compiler/host.clj @@ -424,8 +424,8 @@ nil) (defn ^:private compile-field [^ClassWriter writer field] - (|let [[=name =modifiers =anns =type] field - =field (.visitField writer (&host/modifiers->int =modifiers) =name + (|let [[=name =anns =type] field + =field (.visitField writer Opcodes/ACC_PUBLIC =name (&host-generics/->type-signature =type) nil nil)] (do (&/|map (partial compile-annotation =field) =anns) (.visitEnd =field) @@ -463,9 +463,10 @@ (defn ^:private compile-method-def [compile ^ClassWriter class-writer method-def] (|let [[=method-decl =body] method-def - [=name =modifiers =anns =gvars =exceptions =inputs =output] =method-decl + [=name =anns =gvars =exceptions =inputs =output] =method-decl [simple-signature generic-signature] (&host-generics/method-signatures =method-decl)] - (&/with-writer (.visitMethod class-writer (&host/modifiers->int =modifiers) + (&/with-writer (.visitMethod class-writer + Opcodes/ACC_PUBLIC =name simple-signature generic-signature @@ -481,10 +482,10 @@ (return nil))))) (defn ^:private compile-method-decl [^ClassWriter class-writer =method-decl] - (|let [[=name =modifiers =anns =gvars =exceptions =inputs =output] =method-decl + (|let [[=name =anns =gvars =exceptions =inputs =output] =method-decl [simple-signature generic-signature] (&host-generics/method-signatures =method-decl) =method (.visitMethod class-writer - (&host/modifiers->int =modifiers) + (+ Opcodes/ACC_PUBLIC Opcodes/ACC_ABSTRACT) =name simple-signature generic-signature diff --git a/src/lux/host.clj b/src/lux/host.clj index 5807d711a..2f0a1829c 100644 --- a/src/lux/host.clj +++ b/src/lux/host.clj @@ -12,7 +12,8 @@ [type :as &type]) [lux.type.host :as &host-type] [lux.host.generics :as &host-generics]) - (:import (java.lang.reflect Field Method Constructor Modifier Type) + (:import (java.lang.reflect Field Method Constructor Modifier Type + GenericArrayType ParameterizedType TypeVariable) (org.objectweb.asm Opcodes Label ClassWriter @@ -155,21 +156,6 @@ (defn location [scope] (->> scope (&/|map &/normalize-name) (&/|interpose "$") (&/fold str ""))) -(defn modifiers->int [mods] - (+ (case (:visibility mods) - "default" 0 - "public" Opcodes/ACC_PUBLIC - "private" Opcodes/ACC_PRIVATE - "protected" Opcodes/ACC_PROTECTED) - (if (:static? mods) Opcodes/ACC_STATIC 0) - (if (:final? mods) Opcodes/ACC_FINAL 0) - (if (:abstract? mods) Opcodes/ACC_ABSTRACT 0) - (case (:concurrency mods) - "synchronized" Opcodes/ACC_SYNCHRONIZED - "volatile" Opcodes/ACC_VOLATILE - ;; else - 0))) - (defn primitive-jvm-type? [type] (case type ("boolean" "byte" "short" "int" "long" "float" "double" "char") @@ -256,16 +242,16 @@ (&host-generics/->bytecode-class-name (&host-generics/super-class-name super-class)) (->> interfaces (&/|map (comp &host-generics/->bytecode-class-name &host-generics/super-class-name)) &/->seq (into-array String)))) _ (&/|map (fn [field] - (|let [[=name =modifiers =anns =type] field] - (doto (.visitField =class (modifiers->int =modifiers) =name + (|let [[=name =anns =type] field] + (doto (.visitField =class Opcodes/ACC_PUBLIC =name (&host-generics/->type-signature =type) nil nil) (.visitEnd)))) fields) _ (&/|map (fn [method-decl] (prn 'use-dummy-class (count method-decl) method-decl) - (|let [[=name =modifiers =anns =gvars =exceptions =inputs =output] method-decl + (|let [[=name =anns =gvars =exceptions =inputs =output] method-decl [simple-signature generic-signature] (&host-generics/method-signatures method-decl)] - (doto (.visitMethod =class (modifiers->int =modifiers) + (doto (.visitMethod =class Opcodes/ACC_PUBLIC =name simple-signature generic-signature diff --git a/src/lux/host/generics.clj b/src/lux/host/generics.clj index 4fd2c3269..79b28b2ef 100644 --- a/src/lux/host/generics.clj +++ b/src/lux/host/generics.clj @@ -102,7 +102,7 @@ (assert false "gclass->bytecode-class-name doesn't work on arrays.")))) (defn method-signatures [method-decl] - (|let [[=name =modifiers =anns =gvars =exceptions =inputs =output] method-decl + (|let [[=name =anns =gvars =exceptions =inputs =output] method-decl simple-signature (str "(" (&/fold str "" (&/|map (comp gclass->simple-signature &/|second) =inputs)) ")" (gclass->simple-signature =output)) generic-signature (str "<" (->> =gvars (&/|interpose " ") (&/fold str "")) ">" "(" (&/fold str "" (&/|map (comp gclass->signature &/|second) =inputs)) ")" |