diff options
author | Eduardo Julian | 2015-03-12 08:23:46 -0400 |
---|---|---|
committer | Eduardo Julian | 2015-03-12 08:23:46 -0400 |
commit | 15280d41e3ba7bb305cc259c7200723d3daf326c (patch) | |
tree | 38a6992478f8b239c4c1b8b1f2b0bc0e68dc4711 /src/lux/analyser/host.clj | |
parent | aecb050cfba1c272274e9737b6c9b5b45309a900 (diff) |
- Added program creation (generates the "main" method).
- Added invokespecial & invokeinterface.
- Added putstatic & putfield.
- Corrected primitive conversions & bitwise operators to take into account (un)boxing.
Diffstat (limited to 'src/lux/analyser/host.clj')
-rw-r--r-- | src/lux/analyser/host.clj | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/src/lux/analyser/host.clj b/src/lux/analyser/host.clj index fd4244178..59022a0e0 100644 --- a/src/lux/analyser/host.clj +++ b/src/lux/analyser/host.clj @@ -107,6 +107,21 @@ =object (&&/analyse-1 analyse ?object)] (return (list [::&&/Expression [::&&/jvm-getfield =class ?field =object] =type])))) +(defn analyse-jvm-putstatic [analyse ?class ?field ?value] + (exec [=class (&host/full-class-name ?class) + ;; :let [_ (prn 'analyse-jvm-getstatic/=class =class)] + =type (&host/lookup-static-field =class ?field) + ;; :let [_ (prn 'analyse-jvm-getstatic/=type =type)] + =value (&&/analyse-1 analyse ?value)] + (return (list [::&&/Expression [::&&/jvm-putstatic =class ?field =value] =type])))) + +(defn analyse-jvm-putfield [analyse ?class ?field ?object ?value] + (exec [=class (&host/full-class-name ?class) + =type (&host/lookup-static-field =class ?field) + =object (&&/analyse-1 analyse ?object) + =value (&&/analyse-1 analyse ?value)] + (return (list [::&&/Expression [::&&/jvm-putfield =class ?field =object =value] =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) @@ -114,19 +129,25 @@ =args (mapcat-m analyse ?args)] (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) - ;; :let [_ (prn 'analyse-jvm-invokevirtual/=class =class)] - =classes (map-m &host/extract-jvm-param ?classes) - ;; :let [_ (prn 'analyse-jvm-invokevirtual/=classes =classes)] - [=method-args =return] (&host/lookup-virtual-method =class ?method =classes) - ;; :let [_ (prn 'analyse-jvm-invokevirtual/=return =return)] - =object (&&/analyse-1 analyse ?object) - ;; :let [_ (prn 'analyse-jvm-invokevirtual/=object =object)] - =args (mapcat-m analyse ?args) - ;; :let [_ (prn 'analyse-jvm-invokevirtual/=args =args)] - ] - (return (list [::&&/Expression [::&&/jvm-invokevirtual =class ?method =classes =object =args] =return])))) +(do-template [<name> <tag>] + (defn <name> [analyse ?class ?method ?classes ?object ?args] + (exec [=class (&host/full-class-name ?class) + ;; :let [_ (prn 'analyse-jvm-invokevirtual/=class =class)] + =classes (map-m &host/extract-jvm-param ?classes) + ;; :let [_ (prn 'analyse-jvm-invokevirtual/=classes =classes)] + [=method-args =return] (&host/lookup-virtual-method =class ?method =classes) + ;; :let [_ (prn 'analyse-jvm-invokevirtual/=return =return)] + =object (&&/analyse-1 analyse ?object) + ;; :let [_ (prn 'analyse-jvm-invokevirtual/=object =object)] + =args (mapcat-m analyse ?args) + ;; :let [_ (prn 'analyse-jvm-invokevirtual/=args =args)] + ] + (return (list [::&&/Expression [<tag> =class ?method =classes =object =args] =return])))) + + analyse-jvm-invokevirtual ::&&/jvm-invokevirtual + analyse-jvm-invokeinterface ::&&/jvm-invokeinterface + analyse-jvm-invokespecial ::&&/jvm-invokespecial + ) (defn analyse-jvm-null? [analyse ?object] (exec [=object (&&/analyse-1 analyse ?object)] @@ -262,3 +283,8 @@ analyse-jvm-lshr ::&&/jvm-lshr "java.lang.Long" "java.lang.Integer" analyse-jvm-lushr ::&&/jvm-lushr "java.lang.Long" "java.lang.Integer" ) + +(defn analyse-jvm-program [analyse ?args ?body] + (exec [=body (&&env/with-local ?args [::&type/Any] + (&&/analyse-1 analyse ?body))] + (return (list [::&&/Statement [::&&/jvm-program =body]])))) |