aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc/lang/translation/jvm/procedure
diff options
context:
space:
mode:
authorEduardo Julian2019-08-20 22:00:59 -0400
committerEduardo Julian2019-08-20 22:00:59 -0400
commit59ededb795732e04ac8e1eaceb2b1509a1c1cc23 (patch)
treec0498fbae7cd18fa9434c972a6f7e35d0e02b456 /new-luxc/source/luxc/lang/translation/jvm/procedure
parentcdfda2f80b2abd8ec7d8021aab910ccc82271ade (diff)
WIP: Make new-luxc instructions rely on the Descriptor type.
Diffstat (limited to 'new-luxc/source/luxc/lang/translation/jvm/procedure')
-rw-r--r--new-luxc/source/luxc/lang/translation/jvm/procedure/common.lux186
-rw-r--r--new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux348
2 files changed, 276 insertions, 258 deletions
diff --git a/new-luxc/source/luxc/lang/translation/jvm/procedure/common.lux b/new-luxc/source/luxc/lang/translation/jvm/procedure/common.lux
index 93d4b6c0b..dbf3a13be 100644
--- a/new-luxc/source/luxc/lang/translation/jvm/procedure/common.lux
+++ b/new-luxc/source/luxc/lang/translation/jvm/procedure/common.lux
@@ -3,12 +3,12 @@
[abstract
["." monad (#+ do)]]
[control
+ ["." try]
["<>" parser
["<s>" synthesis (#+ Parser)]]
["ex" exception (#+ exception:)]]
[data
["." product]
- ["." error]
[number
["f" frac]]
[collection
@@ -16,7 +16,7 @@
["." dictionary]]]
[target
[jvm
- ["_t" type (#+ Type Method)]]]
+ ["." descriptor]]]
[tool
[compiler
["." synthesis (#+ Synthesis %synthesis)]
@@ -42,36 +42,38 @@
Handler))
(function (_ extension-name phase input)
(case (<s>.run input parser)
- (#error.Success input')
+ (#try.Success input')
(handler extension-name phase input')
- (#error.Failure error)
+ (#try.Failure error)
(phase.throw extension.invalid-syntax [extension-name %synthesis input]))))
(import: java/lang/Double
(#static MIN_VALUE Double)
(#static MAX_VALUE Double))
-(def: $Object-Array Type (_t.array 1 ///.$Object))
-(def: $String Type (_t.class "java.lang.String" (list)))
-(def: $CharSequence Type (_t.class "java.lang.CharSequence" (list)))
+(def: $String (descriptor.class "java.lang.String"))
+(def: $CharSequence (descriptor.class "java.lang.CharSequence"))
+(def: $System (descriptor.class "java.lang.System"))
+(def: $Object (descriptor.class "java.lang.Object"))
-(def: lux-intI Inst (|>> _.I2L (_.wrap #_t.Long)))
-(def: jvm-intI Inst (|>> (_.unwrap #_t.Long) _.L2I))
-(def: check-stringI Inst (_.CHECKCAST "java.lang.String"))
+(def: lux-intI Inst (|>> _.I2L (_.wrap descriptor.long)))
+(def: jvm-intI Inst (|>> (_.unwrap descriptor.long) _.L2I))
+(def: check-stringI Inst (_.CHECKCAST $String))
(def: (predicateI tester)
(-> (-> Label Inst)
Inst)
- (<| _.with-label (function (_ @then))
- _.with-label (function (_ @end))
- (|>> (tester @then)
- (_.GETSTATIC "java.lang.Boolean" "FALSE" (_t.class "java.lang.Boolean" (list)))
- (_.GOTO @end)
- (_.label @then)
- (_.GETSTATIC "java.lang.Boolean" "TRUE" (_t.class "java.lang.Boolean" (list)))
- (_.label @end)
- )))
+ (let [$Boolean (descriptor.class "java.lang.Boolean")]
+ (<| _.with-label (function (_ @then))
+ _.with-label (function (_ @end))
+ (|>> (tester @then)
+ (_.GETSTATIC $Boolean "FALSE" $Boolean)
+ (_.GOTO @end)
+ (_.label @then)
+ (_.GETSTATIC $Boolean "TRUE" $Boolean)
+ (_.label @end)
+ ))))
(def: unitI Inst (_.string synthesis.unit))
@@ -108,7 +110,7 @@
conditionalsG (|> conditionalsG+
(list@map product.right)
_.fuse)]]
- (wrap (|>> inputG (_.unwrap #_t.Long) _.L2I
+ (wrap (|>> inputG (_.unwrap descriptor.long) _.L2I
(_.LOOKUPSWITCH @else table)
conditionalsG
(_.label @else)
@@ -125,17 +127,17 @@
(def: (lux::try riskyI)
(Unary Inst)
(|>> riskyI
- (_.CHECKCAST ///.function-class)
- (_.INVOKESTATIC ///.runtime-class "try"
- (_t.method (list ///.$Function) (#.Some $Object-Array) (list))
+ (_.CHECKCAST ///.$Function)
+ (_.INVOKESTATIC runtime.$Runtime "try"
+ (descriptor.method [(list ///.$Function) ///.$Variant])
#0)))
(template [<name> <op>]
[(def: (<name> [maskI inputI])
(Binary Inst)
- (|>> inputI (_.unwrap #_t.Long)
- maskI (_.unwrap #_t.Long)
- <op> (_.wrap #_t.Long)))]
+ (|>> inputI (_.unwrap descriptor.long)
+ maskI (_.unwrap descriptor.long)
+ <op> (_.wrap descriptor.long)))]
[i64::and _.LAND]
[i64::or _.LOR]
@@ -145,10 +147,10 @@
(template [<name> <op>]
[(def: (<name> [shiftI inputI])
(Binary Inst)
- (|>> inputI (_.unwrap #_t.Long)
+ (|>> inputI (_.unwrap descriptor.long)
shiftI jvm-intI
<op>
- (_.wrap #_t.Long)))]
+ (_.wrap descriptor.long)))]
[i64::left-shift _.LSHL]
[i64::arithmetic-right-shift _.LSHR]
@@ -160,9 +162,9 @@
(Nullary Inst)
(|>> <const> (_.wrap <type>)))]
- [frac::smallest (_.double (Double::MIN_VALUE)) #_t.Double]
- [frac::min (_.double (f.* -1.0 (Double::MAX_VALUE))) #_t.Double]
- [frac::max (_.double (Double::MAX_VALUE)) #_t.Double]
+ [f64::smallest (_.double (Double::MIN_VALUE)) descriptor.double]
+ [f64::min (_.double (f.* -1.0 (Double::MAX_VALUE))) descriptor.double]
+ [f64::max (_.double (Double::MAX_VALUE)) descriptor.double]
)
(template [<name> <type> <op>]
@@ -173,25 +175,25 @@
<op>
(_.wrap <type>)))]
- [i64::+ #_t.Long _.LADD]
- [i64::- #_t.Long _.LSUB]
- [i64::* #_t.Long _.LMUL]
- [i64::/ #_t.Long _.LDIV]
- [i64::% #_t.Long _.LREM]
+ [i64::+ descriptor.long _.LADD]
+ [i64::- descriptor.long _.LSUB]
+ [i64::* descriptor.long _.LMUL]
+ [i64::/ descriptor.long _.LDIV]
+ [i64::% descriptor.long _.LREM]
- [frac::+ #_t.Double _.DADD]
- [frac::- #_t.Double _.DSUB]
- [frac::* #_t.Double _.DMUL]
- [frac::/ #_t.Double _.DDIV]
- [frac::% #_t.Double _.DREM]
+ [f64::+ descriptor.double _.DADD]
+ [f64::- descriptor.double _.DSUB]
+ [f64::* descriptor.double _.DMUL]
+ [f64::/ descriptor.double _.DDIV]
+ [f64::% descriptor.double _.DREM]
)
-(template [<eq> <lt> <unwrap> <cmp>]
+(template [<eq> <lt> <descriptor> <cmp>]
[(template [<name> <reference>]
[(def: (<name> [paramI subjectI])
(Binary Inst)
- (|>> subjectI <unwrap>
- paramI <unwrap>
+ (|>> subjectI (_.unwrap <descriptor>)
+ paramI (_.unwrap <descriptor>)
<cmp>
(_.int <reference>)
(predicateI _.IF_ICMPEQ)))]
@@ -199,8 +201,8 @@
[<eq> +0]
[<lt> -1])]
- [i64::= i64::< (_.unwrap #_t.Long) _.LCMP]
- [frac::= frac::< (_.unwrap #_t.Double) _.DCMPG]
+ [i64::= i64::< descriptor.long _.LCMP]
+ [f64::= f64::< descriptor.double _.DCMPG]
)
(template [<name> <prepare> <transform>]
@@ -208,22 +210,22 @@
(Unary Inst)
(|>> inputI <prepare> <transform>))]
- [i64::f64 (_.unwrap #_t.Long) (<| (_.wrap #_t.Double) _.L2D)]
- [i64::char (_.unwrap #_t.Long)
- ((|>> _.L2I _.I2C (_.INVOKESTATIC "java.lang.Character" "toString" (_t.method (list _t.char) (#.Some $String) (list)) #0)))]
+ [i64::f64 (_.unwrap descriptor.long) (<| (_.wrap descriptor.double) _.L2D)]
+ [i64::char (_.unwrap descriptor.long)
+ ((|>> _.L2I _.I2C (_.INVOKESTATIC (descriptor.class "java.lang.Character") "toString" (descriptor.method [(list descriptor.char) $String]) #0)))]
- [frac::i64 (_.unwrap #_t.Double) (<| (_.wrap #_t.Long) _.D2L)]
- [frac::encode (_.unwrap #_t.Double)
- (_.INVOKESTATIC "java.lang.Double" "toString" (_t.method (list _t.double) (#.Some $String) (list)) #0)]
- [frac::decode ..check-stringI
- (_.INVOKESTATIC ///.runtime-class "decode_frac" (_t.method (list $String) (#.Some $Object-Array) (list)) #0)]
+ [f64::i64 (_.unwrap descriptor.double) (<| (_.wrap descriptor.long) _.D2L)]
+ [f64::encode (_.unwrap descriptor.double)
+ (_.INVOKESTATIC (descriptor.class "java.lang.Double") "toString" (descriptor.method [(list descriptor.double) $String]) #0)]
+ [f64::decode ..check-stringI
+ (_.INVOKESTATIC runtime.$Runtime "decode_frac" (descriptor.method [(list $String) ///.$Variant]) #0)]
)
(def: (text::size inputI)
(Unary Inst)
(|>> inputI
..check-stringI
- (_.INVOKEVIRTUAL "java.lang.String" "length" (_t.method (list) (#.Some _t.int) (list)) #0)
+ (_.INVOKEVIRTUAL $String "length" (descriptor.method [(list) descriptor.int]) #0)
lux-intI))
(template [<name> <pre-subject> <pre-param> <op> <post>]
@@ -234,13 +236,13 @@
<op> <post>))]
[text::= (<|) (<|)
- (_.INVOKEVIRTUAL "java.lang.Object" "equals" (_t.method (list ///.$Object) (#.Some _t.boolean) (list)) #0)
- (_.wrap #_t.Boolean)]
+ (_.INVOKEVIRTUAL $Object "equals" (descriptor.method [(list $Object) descriptor.boolean]) #0)
+ (_.wrap descriptor.boolean)]
[text::< ..check-stringI ..check-stringI
- (_.INVOKEVIRTUAL "java.lang.String" "compareTo" (_t.method (list $String) (#.Some _t.int) (list)) #0)
+ (_.INVOKEVIRTUAL $String "compareTo" (descriptor.method [(list $String) descriptor.int]) #0)
(predicateI _.IFLT)]
[text::char ..check-stringI jvm-intI
- (_.INVOKEVIRTUAL "java.lang.String" "charAt" (_t.method (list _t.int) (#.Some _t.char) (list)) #0)
+ (_.INVOKEVIRTUAL $String "charAt" (descriptor.method [(list descriptor.int) descriptor.char]) #0)
lux-intI]
)
@@ -248,16 +250,16 @@
(Binary Inst)
(|>> leftI ..check-stringI
rightI ..check-stringI
- (_.INVOKEVIRTUAL "java.lang.String" "concat" (_t.method (list $String) (#.Some $String) (list)) #0)))
+ (_.INVOKEVIRTUAL $String "concat" (descriptor.method [(list $String) $String]) #0)))
(def: (text::clip [startI endI subjectI])
(Trinary Inst)
(|>> subjectI ..check-stringI
startI jvm-intI
endI jvm-intI
- (_.INVOKEVIRTUAL "java.lang.String" "substring" (_t.method (list _t.int _t.int) (#.Some $String) (list)) #0)))
+ (_.INVOKEVIRTUAL $String "substring" (descriptor.method [(list descriptor.int descriptor.int) $String]) #0)))
-(def: index-method Method (_t.method (list $String _t.int) (#.Some _t.int) (list)))
+(def: index-method (descriptor.method [(list $String descriptor.int) descriptor.int]))
(def: (text::index [startI partI textI])
(Trinary Inst)
(<| _.with-label (function (_ @not-found))
@@ -265,7 +267,7 @@
(|>> textI ..check-stringI
partI ..check-stringI
startI jvm-intI
- (_.INVOKEVIRTUAL "java.lang.String" "indexOf" index-method #0)
+ (_.INVOKEVIRTUAL $String "indexOf" index-method #0)
_.DUP
(_.int -1)
(_.IF_ICMPEQ @not-found)
@@ -277,34 +279,36 @@
runtime.noneI
(_.label @end))))
-(def: string-method Method (_t.method (list $String) #.None (list)))
+(def: string-method (descriptor.method [(list $String) descriptor.void]))
(def: (io::log messageI)
(Unary Inst)
- (|>> (_.GETSTATIC "java.lang.System" "out" (_t.class "java.io.PrintStream" (list)))
- messageI
- ..check-stringI
- (_.INVOKEVIRTUAL "java.io.PrintStream" "println" string-method #0)
- unitI))
+ (let [$PrintStream (descriptor.class "java.io.PrintStream")]
+ (|>> (_.GETSTATIC $System "out" $PrintStream)
+ messageI
+ ..check-stringI
+ (_.INVOKEVIRTUAL $PrintStream "println" string-method #0)
+ unitI)))
(def: (io::error messageI)
(Unary Inst)
- (|>> (_.NEW "java.lang.Error")
- _.DUP
- messageI
- ..check-stringI
- (_.INVOKESPECIAL "java.lang.Error" "<init>" string-method #0)
- _.ATHROW))
+ (let [$Error (descriptor.class "java.lang.Error")]
+ (|>> (_.NEW $Error)
+ _.DUP
+ messageI
+ ..check-stringI
+ (_.INVOKESPECIAL $Error "<init>" string-method #0)
+ _.ATHROW)))
(def: (io::exit codeI)
(Unary Inst)
(|>> codeI jvm-intI
- (_.INVOKESTATIC "java.lang.System" "exit" (_t.method (list _t.int) #.None (list)) #0)
+ (_.INVOKESTATIC $System "exit" (descriptor.method [(list descriptor.int) descriptor.void]) #0)
_.NULL))
(def: (io::current-time _)
(Nullary Inst)
- (|>> (_.INVOKESTATIC "java.lang.System" "currentTimeMillis" (_t.method (list) (#.Some _t.long) (list)) #0)
- (_.wrap #_t.Long)))
+ (|>> (_.INVOKESTATIC $System "currentTimeMillis" (descriptor.method [(list) descriptor.long]) #0)
+ (_.wrap descriptor.long)))
(def: bundle::lux
Bundle
@@ -337,19 +341,19 @@
Bundle
(<| (bundle.prefix "f64")
(|> (: Bundle bundle.empty)
- (bundle.install "+" (binary frac::+))
- (bundle.install "-" (binary frac::-))
- (bundle.install "*" (binary frac::*))
- (bundle.install "/" (binary frac::/))
- (bundle.install "%" (binary frac::%))
- (bundle.install "=" (binary frac::=))
- (bundle.install "<" (binary frac::<))
- (bundle.install "smallest" (nullary frac::smallest))
- (bundle.install "min" (nullary frac::min))
- (bundle.install "max" (nullary frac::max))
- (bundle.install "i64" (unary frac::i64))
- (bundle.install "encode" (unary frac::encode))
- (bundle.install "decode" (unary frac::decode)))))
+ (bundle.install "+" (binary f64::+))
+ (bundle.install "-" (binary f64::-))
+ (bundle.install "*" (binary f64::*))
+ (bundle.install "/" (binary f64::/))
+ (bundle.install "%" (binary f64::%))
+ (bundle.install "=" (binary f64::=))
+ (bundle.install "<" (binary f64::<))
+ (bundle.install "smallest" (nullary f64::smallest))
+ (bundle.install "min" (nullary f64::min))
+ (bundle.install "max" (nullary f64::max))
+ (bundle.install "i64" (unary f64::i64))
+ (bundle.install "encode" (unary f64::encode))
+ (bundle.install "decode" (unary f64::decode)))))
(def: bundle::text
Bundle
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 1b3d3c345..62fd37fdb 100644
--- a/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux
+++ b/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux
@@ -1,5 +1,5 @@
(.module:
- [lux (#- Type primitive int char)
+ [lux (#- primitive int char)
[abstract
["." monad (#+ do)]]
[control
@@ -11,7 +11,6 @@
[data
["." product]
["." maybe]
- ["." error]
[number
["." nat]]
["." text]
@@ -21,7 +20,8 @@
["." set]]]
[target
["." jvm #_
- ["#" type (#+ Primitive Bound Generic Class Type Method Var Typed Argument Return)
+ ["." descriptor (#+ Descriptor Value Primitive Object Method)]
+ ["#" type (#+ Bound Generic Class Var Typed Argument Return)
["." box]
["." reflection]]]]
[tool
@@ -64,7 +64,7 @@
[L2C (|>> _.L2I _.I2C)]
)
-(template [<name> <unwrap> <conversion> <wrap>]
+(template [<conversion> <name>]
[(def: (<name> inputI)
(Unary Inst)
(if (is? _.NOP <conversion>)
@@ -72,30 +72,30 @@
(|>> inputI
<conversion>)))]
- [conversion::double-to-float #jvm.Double _.D2F #jvm.Float]
- [conversion::double-to-int #jvm.Double _.D2I #jvm.Int]
- [conversion::double-to-long #jvm.Double _.D2L #jvm.Long]
- [conversion::float-to-double #jvm.Float _.F2D #jvm.Double]
- [conversion::float-to-int #jvm.Float _.F2I #jvm.Int]
- [conversion::float-to-long #jvm.Float _.F2L #jvm.Long]
- [conversion::int-to-byte #jvm.Int _.I2B #jvm.Byte]
- [conversion::int-to-char #jvm.Int _.I2C #jvm.Char]
- [conversion::int-to-double #jvm.Int _.I2D #jvm.Double]
- [conversion::int-to-float #jvm.Int _.I2F #jvm.Float]
- [conversion::int-to-long #jvm.Int _.I2L #jvm.Long]
- [conversion::int-to-short #jvm.Int _.I2S #jvm.Short]
- [conversion::long-to-double #jvm.Long _.L2D #jvm.Double]
- [conversion::long-to-float #jvm.Long _.L2F #jvm.Float]
- [conversion::long-to-int #jvm.Long _.L2I #jvm.Int]
- [conversion::long-to-short #jvm.Long L2S #jvm.Short]
- [conversion::long-to-byte #jvm.Long L2B #jvm.Byte]
- [conversion::long-to-char #jvm.Long L2C #jvm.Char]
- [conversion::char-to-byte #jvm.Char _.I2B #jvm.Byte]
- [conversion::char-to-short #jvm.Char _.I2S #jvm.Short]
- [conversion::char-to-int #jvm.Char _.NOP #jvm.Int]
- [conversion::char-to-long #jvm.Char _.I2L #jvm.Long]
- [conversion::byte-to-long #jvm.Byte _.I2L #jvm.Long]
- [conversion::short-to-long #jvm.Short _.I2L #jvm.Long]
+ [_.D2F conversion::double-to-float]
+ [_.D2I conversion::double-to-int]
+ [_.D2L conversion::double-to-long]
+ [_.F2D conversion::float-to-double]
+ [_.F2I conversion::float-to-int]
+ [_.F2L conversion::float-to-long]
+ [_.I2B conversion::int-to-byte]
+ [_.I2C conversion::int-to-char]
+ [_.I2D conversion::int-to-double]
+ [_.I2F conversion::int-to-float]
+ [_.I2L conversion::int-to-long]
+ [_.I2S conversion::int-to-short]
+ [_.L2D conversion::long-to-double]
+ [_.L2F conversion::long-to-float]
+ [_.L2I conversion::long-to-int]
+ [..L2S conversion::long-to-short]
+ [..L2B conversion::long-to-byte]
+ [..L2C conversion::long-to-char]
+ [_.I2B conversion::char-to-byte]
+ [_.I2S conversion::char-to-short]
+ [_.NOP conversion::char-to-int]
+ [_.I2L conversion::char-to-long]
+ [_.I2L conversion::byte-to-long]
+ [_.I2L conversion::short-to-long]
)
(def: conversion
@@ -172,9 +172,9 @@
[double::% _.DREM]
)
-(def: boolean-class (jvm.class box.boolean (list)))
-(def: falseI (_.GETSTATIC "java.lang.Boolean" "FALSE" boolean-class))
-(def: trueI (_.GETSTATIC "java.lang.Boolean" "TRUE" boolean-class))
+(def: $Boolean (descriptor.class box.boolean))
+(def: falseI (_.GETSTATIC $Boolean "FALSE" $Boolean))
+(def: trueI (_.GETSTATIC $Boolean "TRUE" $Boolean))
(template [<name> <op>]
[(def: (<name> [xI yI])
@@ -296,28 +296,29 @@
)))
(def: (array-java-type nesting elem-class)
- (-> Nat Text Type)
- (jvm.array nesting
- (case elem-class
- (^ (static reflection.boolean)) jvm.boolean
- (^ (static reflection.byte)) jvm.byte
- (^ (static reflection.short)) jvm.short
- (^ (static reflection.int)) jvm.int
- (^ (static reflection.long)) jvm.long
- (^ (static reflection.float)) jvm.float
- (^ (static reflection.double)) jvm.double
- (^ (static reflection.char)) jvm.char
- _ (jvm.class elem-class (list)))))
+ (-> Nat Text (Descriptor Object))
+ (descriptor.array (case nesting
+ 1 (case elem-class
+ (^ (static reflection.boolean)) descriptor.boolean
+ (^ (static reflection.byte)) descriptor.byte
+ (^ (static reflection.short)) descriptor.short
+ (^ (static reflection.int)) descriptor.int
+ (^ (static reflection.long)) descriptor.long
+ (^ (static reflection.float)) descriptor.float
+ (^ (static reflection.double)) descriptor.double
+ (^ (static reflection.char)) descriptor.char
+ _ (descriptor.class elem-class))
+ _ (array-java-type (dec nesting) elem-class))))
(def: (primitive-array-length-handler jvm-primitive)
- (-> Type Handler)
+ (-> (Descriptor Primitive) Handler)
(..custom
[<s>.any
(function (_ extension-name generate arrayS)
(do phase.monad
[arrayI (generate arrayS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (jvm.array 1 jvm-primitive)))
+ (_.CHECKCAST (descriptor.array jvm-primitive))
_.ARRAYLENGTH))))]))
(def: (array::length::object extension-name generate inputs)
@@ -329,14 +330,14 @@
(do phase.monad
[arrayI (generate arrayS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class)))
+ (_.CHECKCAST (array-java-type (.nat nesting) elem-class))
_.ARRAYLENGTH)))
_
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
(def: (new-primitive-array-handler jvm-primitive)
- (-> Type Handler)
+ (-> (Descriptor Primitive) Handler)
(function (_ extension-name generate inputs)
(case inputs
(^ (list lengthS))
@@ -363,7 +364,7 @@
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
(def: (read-primitive-array-handler jvm-primitive loadI)
- (-> Type Inst Handler)
+ (-> (Descriptor Primitive) Inst Handler)
(function (_ extension-name generate inputs)
(case inputs
(^ (list idxS arrayS))
@@ -371,7 +372,7 @@
[arrayI (generate arrayS)
idxI (generate idxS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (jvm.array 1 jvm-primitive)))
+ (_.CHECKCAST (descriptor.array jvm-primitive))
idxI
loadI)))
@@ -389,7 +390,7 @@
[arrayI (generate arrayS)
idxI (generate idxS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class)))
+ (_.CHECKCAST (array-java-type (.nat nesting) elem-class))
idxI
_.AALOAD)))
@@ -397,7 +398,7 @@
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
(def: (write-primitive-array-handler jvm-primitive storeI)
- (-> Type Inst Handler)
+ (-> (Descriptor Primitive) Inst Handler)
(function (_ extension-name generate inputs)
(case inputs
(^ (list idxS valueS arrayS))
@@ -406,7 +407,7 @@
idxI (generate idxS)
valueI (generate valueS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (jvm.array 1 jvm-primitive)))
+ (_.CHECKCAST (descriptor.array jvm-primitive))
_.DUP
idxI
valueI
@@ -428,7 +429,7 @@
idxI (generate idxS)
valueI (generate valueS)]
(wrap (|>> arrayI
- (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class)))
+ (_.CHECKCAST (array-java-type (.nat nesting) elem-class))
_.DUP
idxI
valueI
@@ -443,47 +444,47 @@
(|> bundle.empty
(dictionary.merge (<| (bundle.prefix "length")
(|> bundle.empty
- (bundle.install reflection.boolean (primitive-array-length-handler jvm.boolean))
- (bundle.install reflection.byte (primitive-array-length-handler jvm.byte))
- (bundle.install reflection.short (primitive-array-length-handler jvm.short))
- (bundle.install reflection.int (primitive-array-length-handler jvm.int))
- (bundle.install reflection.long (primitive-array-length-handler jvm.long))
- (bundle.install reflection.float (primitive-array-length-handler jvm.float))
- (bundle.install reflection.double (primitive-array-length-handler jvm.double))
- (bundle.install reflection.char (primitive-array-length-handler jvm.char))
+ (bundle.install reflection.boolean (primitive-array-length-handler descriptor.boolean))
+ (bundle.install reflection.byte (primitive-array-length-handler descriptor.byte))
+ (bundle.install reflection.short (primitive-array-length-handler descriptor.short))
+ (bundle.install reflection.int (primitive-array-length-handler descriptor.int))
+ (bundle.install reflection.long (primitive-array-length-handler descriptor.long))
+ (bundle.install reflection.float (primitive-array-length-handler descriptor.float))
+ (bundle.install reflection.double (primitive-array-length-handler descriptor.double))
+ (bundle.install reflection.char (primitive-array-length-handler descriptor.char))
(bundle.install "object" array::length::object))))
(dictionary.merge (<| (bundle.prefix "new")
(|> bundle.empty
- (bundle.install reflection.boolean (new-primitive-array-handler jvm.boolean))
- (bundle.install reflection.byte (new-primitive-array-handler jvm.byte))
- (bundle.install reflection.short (new-primitive-array-handler jvm.short))
- (bundle.install reflection.int (new-primitive-array-handler jvm.int))
- (bundle.install reflection.long (new-primitive-array-handler jvm.long))
- (bundle.install reflection.float (new-primitive-array-handler jvm.float))
- (bundle.install reflection.double (new-primitive-array-handler jvm.double))
- (bundle.install reflection.char (new-primitive-array-handler jvm.char))
+ (bundle.install reflection.boolean (new-primitive-array-handler descriptor.boolean))
+ (bundle.install reflection.byte (new-primitive-array-handler descriptor.byte))
+ (bundle.install reflection.short (new-primitive-array-handler descriptor.short))
+ (bundle.install reflection.int (new-primitive-array-handler descriptor.int))
+ (bundle.install reflection.long (new-primitive-array-handler descriptor.long))
+ (bundle.install reflection.float (new-primitive-array-handler descriptor.float))
+ (bundle.install reflection.double (new-primitive-array-handler descriptor.double))
+ (bundle.install reflection.char (new-primitive-array-handler descriptor.char))
(bundle.install "object" array::new::object))))
(dictionary.merge (<| (bundle.prefix "read")
(|> bundle.empty
- (bundle.install reflection.boolean (read-primitive-array-handler jvm.boolean _.BALOAD))
- (bundle.install reflection.byte (read-primitive-array-handler jvm.byte _.BALOAD))
- (bundle.install reflection.short (read-primitive-array-handler jvm.short _.SALOAD))
- (bundle.install reflection.int (read-primitive-array-handler jvm.int _.IALOAD))
- (bundle.install reflection.long (read-primitive-array-handler jvm.long _.LALOAD))
- (bundle.install reflection.float (read-primitive-array-handler jvm.float _.FALOAD))
- (bundle.install reflection.double (read-primitive-array-handler jvm.double _.DALOAD))
- (bundle.install reflection.char (read-primitive-array-handler jvm.char _.CALOAD))
+ (bundle.install reflection.boolean (read-primitive-array-handler descriptor.boolean _.BALOAD))
+ (bundle.install reflection.byte (read-primitive-array-handler descriptor.byte _.BALOAD))
+ (bundle.install reflection.short (read-primitive-array-handler descriptor.short _.SALOAD))
+ (bundle.install reflection.int (read-primitive-array-handler descriptor.int _.IALOAD))
+ (bundle.install reflection.long (read-primitive-array-handler descriptor.long _.LALOAD))
+ (bundle.install reflection.float (read-primitive-array-handler descriptor.float _.FALOAD))
+ (bundle.install reflection.double (read-primitive-array-handler descriptor.double _.DALOAD))
+ (bundle.install reflection.char (read-primitive-array-handler descriptor.char _.CALOAD))
(bundle.install "object" array::read::object))))
(dictionary.merge (<| (bundle.prefix "write")
(|> bundle.empty
- (bundle.install reflection.boolean (write-primitive-array-handler jvm.boolean _.BASTORE))
- (bundle.install reflection.byte (write-primitive-array-handler jvm.byte _.BASTORE))
- (bundle.install reflection.short (write-primitive-array-handler jvm.short _.SASTORE))
- (bundle.install reflection.int (write-primitive-array-handler jvm.int _.IASTORE))
- (bundle.install reflection.long (write-primitive-array-handler jvm.long _.LASTORE))
- (bundle.install reflection.float (write-primitive-array-handler jvm.float _.FASTORE))
- (bundle.install reflection.double (write-primitive-array-handler jvm.double _.DASTORE))
- (bundle.install reflection.char (write-primitive-array-handler jvm.char _.CASTORE))
+ (bundle.install reflection.boolean (write-primitive-array-handler descriptor.boolean _.BASTORE))
+ (bundle.install reflection.byte (write-primitive-array-handler descriptor.byte _.BASTORE))
+ (bundle.install reflection.short (write-primitive-array-handler descriptor.short _.SASTORE))
+ (bundle.install reflection.int (write-primitive-array-handler descriptor.int _.IASTORE))
+ (bundle.install reflection.long (write-primitive-array-handler descriptor.long _.LASTORE))
+ (bundle.install reflection.float (write-primitive-array-handler descriptor.float _.FASTORE))
+ (bundle.install reflection.double (write-primitive-array-handler descriptor.double _.DASTORE))
+ (bundle.install reflection.char (write-primitive-array-handler descriptor.char _.CASTORE))
(bundle.install "object" array::write::object))))
)))
@@ -517,6 +518,8 @@
(|>> exceptionI
_.ATHROW))
+(def: $Class (descriptor.class "java.lang.Class"))
+
(def: (object::class extension-name generate inputs)
Handler
(case inputs
@@ -524,10 +527,9 @@
(do phase.monad
[]
(wrap (|>> (_.string class)
- (_.INVOKESTATIC "java.lang.Class" "forName"
- (jvm.method (list (jvm.class "java.lang.String" (list)))
- (#.Some (jvm.class "java.lang.Class" (list)))
- (list))
+ (_.INVOKESTATIC $Class "forName"
+ (descriptor.method [(list (descriptor.class "java.lang.String"))
+ $Class])
false))))
_
@@ -541,8 +543,8 @@
(do phase.monad
[objectI (generate objectS)]
(wrap (|>> objectI
- (_.INSTANCEOF class)
- (_.wrap #jvm.Boolean)))))]))
+ (_.INSTANCEOF (descriptor.class class))
+ (_.wrap descriptor.boolean)))))]))
(def: (object::cast extension-name generate inputs)
Handler
@@ -558,14 +560,14 @@
(^ [(static <object>) (static <primitive>)])
(wrap (|>> valueI (_.unwrap <type>))))
- ([reflection.boolean box.boolean #jvm.Boolean]
- [reflection.byte box.byte #jvm.Byte]
- [reflection.short box.short #jvm.Short]
- [reflection.int box.int #jvm.Int]
- [reflection.long box.long #jvm.Long]
- [reflection.float box.float #jvm.Float]
- [reflection.double box.double #jvm.Double]
- [reflection.char box.char #jvm.Char])
+ ([reflection.boolean box.boolean descriptor.boolean]
+ [reflection.byte box.byte descriptor.byte]
+ [reflection.short box.short descriptor.short]
+ [reflection.int box.int descriptor.int]
+ [reflection.long box.long descriptor.long]
+ [reflection.float box.float descriptor.float]
+ [reflection.double box.double descriptor.double]
+ [reflection.char box.char descriptor.char])
_
(wrap valueI)))
@@ -587,15 +589,15 @@
)))
(def: primitives
- (Dictionary Text Primitive)
- (|> (list [reflection.boolean #jvm.Boolean]
- [reflection.byte #jvm.Byte]
- [reflection.short #jvm.Short]
- [reflection.int #jvm.Int]
- [reflection.long #jvm.Long]
- [reflection.float #jvm.Float]
- [reflection.double #jvm.Double]
- [reflection.char #jvm.Char])
+ (Dictionary Text (Descriptor Primitive))
+ (|> (list [reflection.boolean descriptor.boolean]
+ [reflection.byte descriptor.byte]
+ [reflection.short descriptor.short]
+ [reflection.int descriptor.int]
+ [reflection.long descriptor.long]
+ [reflection.float descriptor.float]
+ [reflection.double descriptor.double]
+ [reflection.char descriptor.char])
(dictionary.from-list text.hash)))
(def: (static::get extension-name generate inputs)
@@ -606,12 +608,12 @@
(synthesis.text unboxed)))
(do phase.monad
[]
- (case (dictionary.get unboxed primitives)
+ (case (dictionary.get unboxed ..primitives)
(#.Some primitive)
- (wrap (_.GETSTATIC class field (#jvm.Primitive primitive)))
+ (wrap (_.GETSTATIC (descriptor.class class) field primitive))
#.None
- (wrap (_.GETSTATIC class field (jvm.class unboxed (list))))))
+ (wrap (_.GETSTATIC (descriptor.class class) field (descriptor.class unboxed)))))
_
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
@@ -624,17 +626,18 @@
(synthesis.text unboxed)
valueS))
(do phase.monad
- [valueI (generate valueS)]
- (case (dictionary.get unboxed primitives)
+ [valueI (generate valueS)
+ #let [$class (descriptor.class class)]]
+ (case (dictionary.get unboxed ..primitives)
(#.Some primitive)
(wrap (|>> valueI
- (_.PUTSTATIC class field (#jvm.Primitive primitive))
+ (_.PUTSTATIC $class field primitive)
(_.string synthesis.unit)))
#.None
(wrap (|>> valueI
- (_.CHECKCAST class)
- (_.PUTSTATIC class field (jvm.class class (list)))
+ (_.CHECKCAST $class)
+ (_.PUTSTATIC $class field $class)
(_.string synthesis.unit)))))
_
@@ -648,17 +651,17 @@
(synthesis.text unboxed)
objectS))
(do phase.monad
- [objectI (generate objectS)]
- (case (dictionary.get unboxed primitives)
- (#.Some primitive)
- (wrap (|>> objectI
- (_.CHECKCAST class)
- (_.GETFIELD class field (#jvm.Primitive primitive))))
-
- #.None
- (wrap (|>> objectI
- (_.CHECKCAST class)
- (_.GETFIELD class field (jvm.class unboxed (list)))))))
+ [objectI (generate objectS)
+ #let [$class (descriptor.class class)
+ getI (case (dictionary.get unboxed ..primitives)
+ (#.Some primitive)
+ (_.GETFIELD $class field primitive)
+
+ #.None
+ (_.GETFIELD $class field (descriptor.class unboxed)))]]
+ (wrap (|>> objectI
+ (_.CHECKCAST $class)
+ getI)))
_
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
@@ -673,22 +676,21 @@
objectS))
(do phase.monad
[valueI (generate valueS)
- objectI (generate objectS)]
- (case (dictionary.get unboxed primitives)
- (#.Some primitive)
- (wrap (|>> objectI
- (_.CHECKCAST class)
- _.DUP
- valueI
- (_.PUTFIELD class field (#jvm.Primitive primitive))))
-
- #.None
- (wrap (|>> objectI
- (_.CHECKCAST class)
- _.DUP
- valueI
- (_.CHECKCAST unboxed)
- (_.PUTFIELD class field (jvm.class unboxed (list)))))))
+ objectI (generate objectS)
+ #let [$class (descriptor.class class)
+ putI (case (dictionary.get unboxed ..primitives)
+ (#.Some primitive)
+ (_.PUTFIELD $class field primitive)
+
+ #.None
+ (let [$unboxed (descriptor.class unboxed)]
+ (|>> (_.CHECKCAST $unboxed)
+ (_.PUTFIELD $class field $unboxed))))]]
+ (wrap (|>> objectI
+ (_.CHECKCAST $class)
+ _.DUP
+ valueI
+ putI)))
_
(phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))
@@ -709,7 +711,7 @@
(def: (method-return-type description)
(-> Text (Operation Return))
(case description
- (^ (static jvm.void-descriptor))
+ (^ (static descriptor.void))
(phase@wrap #.None)
_
@@ -747,7 +749,8 @@
returnT (method-return-type unboxed)]
(wrap (|>> (_.fuse (list@map ..prepare-argI argsTI))
(_.INVOKESTATIC class method
- (jvm.method (list@map product.left argsTI) returnT (list))
+ (descriptor.method [(list@map product.left argsTI)
+ returnT])
false)
(prepare-returnI returnT)))))]))
@@ -765,7 +768,8 @@
(_.CHECKCAST class)
(_.fuse (list@map ..prepare-argI argsTI))
(<invoke> class method
- (jvm.method (list@map product.left argsTI) returnT (list))
+ (descriptor.method [(list@map product.left argsTI)
+ returnT])
<interface?>)
(prepare-returnI returnT)))))]))]
@@ -784,7 +788,8 @@
_.DUP
(_.fuse (list@map ..prepare-argI argsTI))
(_.INVOKESPECIAL class "<init>"
- (jvm.method (list@map product.left argsTI) #.None (list))
+ (descriptor.method [(list@map product.left argsTI)
+ descriptor.void])
false))))
_
@@ -840,16 +845,24 @@
(class' ..generic))
(def: primitive
- (Parser Primitive)
+ (Parser (Descriptor Primitive))
($_ <>.or
- (<s>.constant! ["" reflection.boolean])
- (<s>.constant! ["" reflection.byte])
- (<s>.constant! ["" reflection.short])
- (<s>.constant! ["" reflection.int])
- (<s>.constant! ["" reflection.long])
- (<s>.constant! ["" reflection.float])
- (<s>.constant! ["" reflection.double])
- (<s>.constant! ["" reflection.char])
+ (<>.after (<s>.constant! ["" reflection.boolean])
+ (<>@wrap descriptor.boolean))
+ (<>.after (<s>.constant! ["" reflection.byte])
+ (<>@wrap descriptor.byte))
+ (<>.after (<s>.constant! ["" reflection.short])
+ (<>@wrap descriptor.short))
+ (<>.after (<s>.constant! ["" reflection.int])
+ (<>@wrap descriptor.int))
+ (<>.after (<s>.constant! ["" reflection.long])
+ (<>@wrap descriptor.long))
+ (<>.after (<s>.constant! ["" reflection.float])
+ (<>@wrap descriptor.float))
+ (<>.after (<s>.constant! ["" reflection.double])
+ (<>@wrap descriptor.double))
+ (<>.after (<s>.constant! ["" reflection.char])
+ (<>@wrap descriptor.char))
))
(def: jvm-type
@@ -879,7 +892,7 @@
(def: return
(Parser Return)
- (<>.or (<s>.constant! ["" jvm.void-descriptor])
+ (<>.or (<s>.constant! ["" (descriptor.descriptor descriptor.void)])
..jvm-type))
(def: overriden-method-definition
@@ -976,13 +989,12 @@
(#synthesis.Extension [name inputsS+])
(#synthesis.Extension [name (list@map recur inputsS+)]))))
-(def: $Object (jvm.class jvm.object-class (list)))
+(def: $Object (descriptor.class "java.lang.Object"))
(def: (anonymous-init-method env)
- (-> Environment Method)
- (jvm.method (list.repeat (list.size env) $Object)
- #.None
- (list)))
+ (-> Environment (Descriptor Method))
+ (descriptor.method [(list.repeat (list.size env) $Object)
+ descriptor.void]))
(def: (with-anonymous-init class env super-class constructor-argsI)
(-> Text Environment Class (List (Typed Inst)) Def)
@@ -999,7 +1011,8 @@
((_.fuse (list@map product.right constructor-argsI)))
(_.INVOKESPECIAL (product.left super-class)
"<init>"
- (jvm.method (list@map product.left constructor-argsI) #.None (list))
+ (descriptor.method [(list@map product.left constructor-argsI)
+ descriptor.void])
#0)
store-capturedI
_.RETURN))))
@@ -1077,10 +1090,11 @@
($_ $.++M $.finalM $.strictM)
$.finalM)
name
- (jvm.method (list@map product.right arguments)
- returnT
- (list@map (|>> #jvm.Class)
- exceptionsT))
+ (descriptor.method [(list@map product.right arguments)
+ returnT]
+ ## (list@map (|>> #jvm.Class)
+ ## exceptionsT)
+ )
(let [returnI (case returnT
(#.Some returnT)
(case returnT