aboutsummaryrefslogtreecommitdiff
path: root/src/lux/analyser/host.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/lux/analyser/host.clj')
-rw-r--r--src/lux/analyser/host.clj118
1 files changed, 60 insertions, 58 deletions
diff --git a/src/lux/analyser/host.clj b/src/lux/analyser/host.clj
index d9804f9e8..5a7585226 100644
--- a/src/lux/analyser/host.clj
+++ b/src/lux/analyser/host.clj
@@ -7,12 +7,12 @@
[parser :as &parser]
[type :as &type]
[host :as &host])
- (lux.analyser [base :as &])))
+ (lux.analyser [base :as &&])))
;; [Utils]
(defn ^:private extract-ident [ident]
(match ident
- [::&parser/ident ?ident]
+ [::&parser/Ident ?ident]
(return ?ident)
_
@@ -22,88 +22,88 @@
(do-template [<name> <ident> <output-tag> <wrapper-class>]
(defn <name> [analyse ?x ?y]
(exec [:let [=type [::&type/Data <wrapper-class>]]
- [=x =y] (&/analyse-2 analyse ?x ?y)
- =x-type (&/expr-type =x)
- =y-type (&/expr-type =y)
+ [=x =y] (&&/analyse-2 analyse ?x ?y)
+ =x-type (&&/expr-type =x)
+ =y-type (&&/expr-type =y)
_ (&type/solve =type =x-type)
_ (&type/solve =type =y-type)]
- (return (list [::&/Expression [<output-tag> =x =y] =type]))))
-
- analyse-jvm-iadd "jvm;iadd" ::jvm-iadd "java.lang.Integer"
- analyse-jvm-isub "jvm;isub" ::jvm-isub "java.lang.Integer"
- analyse-jvm-imul "jvm;imul" ::jvm-imul "java.lang.Integer"
- analyse-jvm-idiv "jvm;idiv" ::jvm-idiv "java.lang.Integer"
- analyse-jvm-irem "jvm;irem" ::jvm-irem "java.lang.Integer"
-
- analyse-jvm-ladd "jvm;ladd" ::jvm-ladd "java.lang.Long"
- analyse-jvm-lsub "jvm;lsub" ::jvm-lsub "java.lang.Long"
- analyse-jvm-lmul "jvm;lmul" ::jvm-lmul "java.lang.Long"
- analyse-jvm-ldiv "jvm;ldiv" ::jvm-ldiv "java.lang.Long"
- analyse-jvm-lrem "jvm;lrem" ::jvm-lrem "java.lang.Long"
-
- analyse-jvm-fadd "jvm;fadd" ::jvm-fadd "java.lang.Float"
- analyse-jvm-fsub "jvm;fsub" ::jvm-fsub "java.lang.Float"
- analyse-jvm-fmul "jvm;fmul" ::jvm-fmul "java.lang.Float"
- analyse-jvm-fdiv "jvm;fdiv" ::jvm-fdiv "java.lang.Float"
- analyse-jvm-frem "jvm;frem" ::jvm-frem "java.lang.Float"
-
- analyse-jvm-dadd "jvm;dadd" ::jvm-dadd "java.lang.Double"
- analyse-jvm-dsub "jvm;dsub" ::jvm-dsub "java.lang.Double"
- analyse-jvm-dmul "jvm;dmul" ::jvm-dmul "java.lang.Double"
- analyse-jvm-ddiv "jvm;ddiv" ::jvm-ddiv "java.lang.Double"
- analyse-jvm-drem "jvm;drem" ::jvm-drem "java.lang.Double"
+ (return (list [::&&/Expression [<output-tag> =x =y] =type]))))
+
+ analyse-jvm-iadd "jvm;iadd" ::&&/jvm-iadd "java.lang.Integer"
+ analyse-jvm-isub "jvm;isub" ::&&/jvm-isub "java.lang.Integer"
+ analyse-jvm-imul "jvm;imul" ::&&/jvm-imul "java.lang.Integer"
+ analyse-jvm-idiv "jvm;idiv" ::&&/jvm-idiv "java.lang.Integer"
+ analyse-jvm-irem "jvm;irem" ::&&/jvm-irem "java.lang.Integer"
+
+ analyse-jvm-ladd "jvm;ladd" ::&&/jvm-ladd "java.lang.Long"
+ analyse-jvm-lsub "jvm;lsub" ::&&/jvm-lsub "java.lang.Long"
+ analyse-jvm-lmul "jvm;lmul" ::&&/jvm-lmul "java.lang.Long"
+ analyse-jvm-ldiv "jvm;ldiv" ::&&/jvm-ldiv "java.lang.Long"
+ analyse-jvm-lrem "jvm;lrem" ::&&/jvm-lrem "java.lang.Long"
+
+ analyse-jvm-fadd "jvm;fadd" ::&&/jvm-fadd "java.lang.Float"
+ analyse-jvm-fsub "jvm;fsub" ::&&/jvm-fsub "java.lang.Float"
+ analyse-jvm-fmul "jvm;fmul" ::&&/jvm-fmul "java.lang.Float"
+ analyse-jvm-fdiv "jvm;fdiv" ::&&/jvm-fdiv "java.lang.Float"
+ analyse-jvm-frem "jvm;frem" ::&&/jvm-frem "java.lang.Float"
+
+ analyse-jvm-dadd "jvm;dadd" ::&&/jvm-dadd "java.lang.Double"
+ analyse-jvm-dsub "jvm;dsub" ::&&/jvm-dsub "java.lang.Double"
+ analyse-jvm-dmul "jvm;dmul" ::&&/jvm-dmul "java.lang.Double"
+ analyse-jvm-ddiv "jvm;ddiv" ::&&/jvm-ddiv "java.lang.Double"
+ analyse-jvm-drem "jvm;drem" ::&&/jvm-drem "java.lang.Double"
)
(defn analyse-jvm-getstatic [analyse ?class ?field]
(exec [=class (&host/full-class-name ?class)
=type (&host/lookup-static-field =class ?field)]
- (return (list [::&/Expression [::jvm-getstatic =class ?field] =type]))))
+ (return (list [::&&/Expression [::&&/jvm-getstatic =class ?field] =type]))))
(defn analyse-jvm-getfield [analyse ?class ?field ?object]
(exec [=class (&host/full-class-name ?class)
=type (&host/lookup-static-field =class ?field)
- =object (&/analyse-1 ?object)]
- (return (list [::&/Expression [::jvm-getfield =class ?field =object] =type]))))
+ =object (&&/analyse-1 ?object)]
+ (return (list [::&&/Expression [::&&/jvm-getfield =class ?field =object] =type]))))
(defn analyse-jvm-invokestatic [analyse ?class ?method ?classes ?args]
(exec [=class (&host/full-class-name ?class)
=classes (map-m &host/extract-jvm-param ?classes)
=return (&host/lookup-virtual-method =class ?method =classes)
=args (mapcat-m analyse ?args)]
- (return (list [::&/Expression [::jvm-invokestatic =class ?method =classes =args] =return]))))
+ (return (list [::&&/Expression [::&&/jvm-invokestatic =class ?method =classes =args] =return]))))
(defn analyse-jvm-invokevirtual [analyse ?class ?method ?classes ?object ?args]
(exec [=class (&host/full-class-name ?class)
=classes (map-m &host/extract-jvm-param ?classes)
=return (&host/lookup-virtual-method =class ?method =classes)
- =object (&/analyse-1 ?object)
+ =object (&&/analyse-1 ?object)
=args (mapcat-m analyse ?args)]
- (return (list [::&/Expression [::jvm-invokevirtual =class ?method =classes =object =args] =return]))))
+ (return (list [::&&/Expression [::&&/jvm-invokevirtual =class ?method =classes =object =args] =return]))))
(defn analyse-jvm-new [analyse ?class ?classes ?args]
(exec [=class (&host/full-class-name ?class)
=classes (map-m &host/extract-jvm-param ?classes)
=args (mapcat-m analyse ?args)]
- (return (list [::&/Expression [::jvm-new =class =classes =args] [::&type/Data =class]]))))
+ (return (list [::&&/Expression [::&&/jvm-new =class =classes =args] [::&type/Data =class]]))))
(defn analyse-jvm-new-array [analyse ?class ?length]
(exec [=class (&host/full-class-name ?class)]
- (return (list [::&/Expression [::jvm-new-array =class ?length] [::&type/Array [::&type/Data =class]]]))))
+ (return (list [::&&/Expression [::&&/jvm-new-array =class ?length] [::&type/Array [::&type/Data =class]]]))))
(defn analyse-jvm-aastore [analyse ?array ?idx ?elem]
- (exec [[=array =elem] (&/analyse-2 ?array ?elem)
- =array-type (&/expr-type =array)]
- (return (list [::&/Expression [::jvm-aastore =array ?idx =elem] =array-type]))))
+ (exec [[=array =elem] (&&/analyse-2 ?array ?elem)
+ =array-type (&&/expr-type =array)]
+ (return (list [::&&/Expression [::&&/jvm-aastore =array ?idx =elem] =array-type]))))
(defn analyse-jvm-aaload [analyse ?array ?idx]
- (exec [=array (&/analyse-1 ?array)
- =array-type (&/expr-type =array)]
- (return (list [::&/Expression [::jvm-aaload =array ?idx] =array-type]))))
+ (exec [=array (&&/analyse-1 ?array)
+ =array-type (&&/expr-type =array)]
+ (return (list [::&&/Expression [::&&/jvm-aaload =array ?idx] =array-type]))))
(defn analyse-jvm-class [analyse ?name ?super-class ?fields]
(exec [?fields (map-m (fn [?field]
(match ?field
- [::&parser/tuple ([[::&parser/ident ?class] [::&parser/ident ?field-name]] :seq)]
+ [::&parser/Tuple ([[::&parser/Ident ?class] [::&parser/Ident ?field-name]] :seq)]
(return [?class ?field-name])
_
@@ -113,27 +113,29 @@
[field {:access :public
:type class}]))]
$module &util/get-module-name]
- (return (list [::&/Statement [::jvm-class [$module ?name] ?super-class =fields {}]]))))
+ (return (list [::&&/Statement [::&&/jvm-class $module ?name ?super-class =fields {}]]))))
(defn analyse-jvm-interface [analyse ?name ?members]
- (exec [?members (map-m #(match %
- [::&parser/form ([[::&parser/ident ":"] [::&parser/ident ?member-name]
- [::&parser/form ([[::&parser/ident "->"] [::&parser/tuple ?inputs] [::&parser/ident ?output]] :seq)]]
- :seq)]
- (exec [?inputs (map-m extract-ident ?inputs)]
- (return [?member-name [?inputs ?output]]))
-
- _
- (fail ""))
+ (prn 'analyse-jvm-interface ?name ?members)
+ (exec [?members (map-m (fn [member]
+ (match member
+ [::&parser/Form ([[::&parser/Ident ":"] [::&parser/Ident ?member-name]
+ [::&parser/Form ([[::&parser/Ident "->"] [::&parser/Tuple ?inputs] [::&parser/Ident ?output]] :seq)]]
+ :seq)]
+ (exec [?inputs (map-m extract-ident ?inputs)]
+ (return [?member-name [?inputs ?output]]))
+
+ _
+ (fail "")))
?members)
:let [=methods (into {} (for [[method [inputs output]] ?members]
[method {:access :public
:type [inputs output]}]))]
$module &util/get-module-name]
- (return (list [::&/Statement [::jvm-interface [$module ?name] {} =methods]]))))
+ (return (list [::&&/Statement [::&&/jvm-interface $module ?name =methods]]))))
(defn analyse-exec [analyse ?exprs]
(exec [_ (assert! (count ?exprs) "\"exec\" expressions can't have empty bodies.")
=exprs (mapcat-m analyse ?exprs)
- =exprs-types (map-m &/expr-type =exprs)]
- (return (list [::&/Expression [::do =exprs] (last =exprs-types)]))))
+ =exprs-types (map-m &&/expr-type =exprs)]
+ (return (list [::&&/Expression [::&&/exec =exprs] (last =exprs-types)]))))