diff options
Diffstat (limited to 'new-luxc/source')
-rw-r--r-- | new-luxc/source/luxc/lang/host/jvm/def.lux | 31 | ||||
-rw-r--r-- | new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux | 18 |
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] |