aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc
diff options
context:
space:
mode:
Diffstat (limited to 'new-luxc/source/luxc')
-rw-r--r--new-luxc/source/luxc/lang/host/jvm/def.lux31
-rw-r--r--new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux18
2 files changed, 44 insertions, 5 deletions
diff --git a/new-luxc/source/luxc/lang/host/jvm/def.lux b/new-luxc/source/luxc/lang/host/jvm/def.lux
index bf4abc8ed..4d1b99da0 100644
--- a/new-luxc/source/luxc/lang/host/jvm/def.lux
+++ b/new-luxc/source/luxc/lang/host/jvm/def.lux
@@ -12,7 +12,8 @@
["." list ("#/." functor)]]]
[target
[jvm
- ["$t" type (#+ Method Class Type Parameter)]]]]
+ ["$t" type (#+ Method Class Type Parameter)
+ ["." reflection]]]]]
["." //])
(import: #long java/lang/Object)
@@ -71,10 +72,36 @@
(list.enumerate values))
output)))
+(def: (exception-class-name type)
+ (-> Type Text)
+ (case type
+ (#$t.Primitive prim)
+ (case prim
+ #$t.Boolean reflection.boolean
+ #$t.Byte reflection.byte
+ #$t.Short reflection.short
+ #$t.Int reflection.int
+ #$t.Long reflection.long
+ #$t.Float reflection.float
+ #$t.Double reflection.double
+ #$t.Char reflection.char)
+
+ (#$t.Array sub)
+ (format $t.array-prefix (exception-class-name sub))
+
+ (#$t.Generic generic)
+ (case generic
+ (#$t.Class class params)
+ ($t.binary-name class)
+
+ (^or (#$t.Var _) (#$t.Wildcard _))
+ ($t.binary-name $t.object-class))
+ ))
+
(def: exceptions-array
(-> Method (Array Text))
(|>> (get@ #$t.exceptions)
- (list/map (|>> #$t.Generic $t.descriptor))
+ (list/map (|>> #$t.Generic ..exception-class-name))
string-array))
(def: (version-flag version)
diff --git a/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux b/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux
index 83cbd017b..4239a89aa 100644
--- a/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux
+++ b/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux
@@ -4,6 +4,7 @@
["." monad (#+ do)]]
[control
["." exception (#+ exception:)]
+ ["." function]
["<>" parser ("#@." monad)
["<t>" text]
["<s>" synthesis (#+ Parser)]]]
@@ -343,7 +344,7 @@
(do phase.monad
[lengthI (generate lengthS)]
(wrap (|>> lengthI
- (_.array (jvm.array 1 jvm-primitive)))))
+ (_.array jvm-primitive))))
_
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs]))))
@@ -728,6 +729,15 @@
#.None
argI))
+(def: (prepare-returnI return)
+ (-> Return Inst)
+ (case return
+ (#.Some _)
+ function.identity
+
+ #.None
+ (_.string synthesis.unit)))
+
(def: invoke::static
Handler
(..custom
@@ -739,7 +749,8 @@
(wrap (|>> (_.fuse (list@map ..prepare-argI argsTI))
(_.INVOKESTATIC class method
(jvm.method (list@map product.left argsTI) returnT (list))
- false)))))]))
+ false)
+ (prepare-returnI returnT)))))]))
(template [<name> <invoke> <interface?>]
[(def: <name>
@@ -756,7 +767,8 @@
(_.fuse (list@map ..prepare-argI argsTI))
(<invoke> class method
(jvm.method (list@map product.left argsTI) returnT (list))
- <interface?>)))))]))]
+ <interface?>)
+ (prepare-returnI returnT)))))]))]
[invoke::virtual _.INVOKEVIRTUAL false]
[invoke::special _.INVOKESPECIAL false]