From 9b59f66c8d8115a67d6eee1e7a38aa39823db222 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Thu, 16 May 2019 23:17:07 -0400 Subject: Some type casting/coercion automation. --- stdlib/source/lux/host.jvm.lux | 122 +++++++++------------ stdlib/source/lux/target/jvm/type.lux | 13 +++ .../tool/compiler/phase/extension/analysis/jvm.lux | 59 +++++----- 3 files changed, 96 insertions(+), 98 deletions(-) (limited to 'stdlib/source') diff --git a/stdlib/source/lux/host.jvm.lux b/stdlib/source/lux/host.jvm.lux index 495d8a7ce..c8d413421 100644 --- a/stdlib/source/lux/host.jvm.lux +++ b/stdlib/source/lux/host.jvm.lux @@ -22,8 +22,9 @@ ["." list ("#@." monad fold monoid)] ["." dictionary (#+ Dictionary)]]] ["." macro (#+ with-gensyms) + [syntax (#+ syntax:)] ["." code] - [syntax (#+ syntax:)]] + ["." template]] [target ["." jvm #_ ["#" type (#+ Primitive Var Bound Class Generic Type Argument Return Typed)]]]]) @@ -1490,80 +1491,64 @@ (-> Var Code) code.local-identifier) -(template [ - - - - ] +(template [ ] [(def: ( mode [unboxed raw]) (-> Primitive-Mode [Text Code] Code) - (let [[unboxed refined] (case mode - #ManualPrM - [unboxed raw] - - #AutoPrM - (case unboxed - (^ (static jvm.byte-descriptor)) - [ (` ( (~ raw)))] - - (^ (static jvm.short-descriptor)) - [ (` ( (~ raw)))] - - (^ (static jvm.int-descriptor)) - [ (` ( (~ raw)))] - - (^ (static jvm.float-descriptor)) - [ (` ( (~ raw)))] - - _ - [unboxed raw]))] - (case (dictionary.get unboxed boxes) - (#.Some boxed) - ( unboxed boxed refined) - - #.None - refined)))] - - [auto-convert-input ..unbox - jvm.byte-descriptor ..long-to-byte - jvm.short-descriptor ..long-to-short - jvm.int-descriptor ..long-to-int - jvm.float-descriptor ..double-to-float] - [auto-convert-output ..box - jvm.long-descriptor "jvm conversion byte-to-long" - jvm.long-descriptor "jvm conversion short-to-long" - jvm.long-descriptor "jvm conversion int-to-long" - jvm.double-descriptor "jvm conversion float-to-double"] + (let [[unboxed refined post] (: [Text Code (List Code)] + (case mode + #ManualPrM + [unboxed raw (list)] + + #AutoPrM + (`` (case unboxed + (^template [
 ]
+                                               (^ (static ))
+                                               (with-expansions [' (template.splice )]
+                                                 [
+                                                  (` (.|> (~ raw) (~+ 
)))
+                                                  (list ')]))
+                                             ((~~ (template.splice )))
+                                             
+                                             _
+                                             [unboxed
+                                              (if 
+                                                (` ("jvm object cast" (~ raw)))
+                                                raw)
+                                              (list)]))))
+           unboxed/boxed (case (dictionary.get unboxed boxes)
+                           (#.Some boxed)
+                           ( unboxed boxed refined)
+                           
+                           #.None
+                           refined)
+           post-processed (case post
+                            #.Nil
+                            unboxed/boxed
+
+                            _
+                            (` (.|> (~ unboxed/boxed) (~+ post))))]
+       post-processed))]
+
+  [#1 auto-convert-input ..unbox
+   [[jvm.byte-descriptor jvm.byte-descriptor (list (` (.: .Int)) (` (.:coerce (.primitive "java.lang.Long"))) (` ..long-to-byte)) []]
+    [jvm.short-descriptor jvm.short-descriptor (list (` (.: .Int)) (` (.:coerce (.primitive "java.lang.Long"))) (` ..long-to-short)) []]
+    [jvm.int-descriptor jvm.int-descriptor (list (` (.: .Int)) (` (.:coerce (.primitive "java.lang.Long"))) (` ..long-to-int)) []]
+    [jvm.long-descriptor jvm.long-descriptor (list (` (.: .Int)) (` (.:coerce (.primitive "java.lang.Long")))) []]
+    [jvm.float-descriptor jvm.float-descriptor (list (` (.: .Frac)) (` (.:coerce (.primitive "java.lang.Double"))) (` ..double-to-float)) []]
+    [jvm.double-descriptor jvm.double-descriptor (list (` (.: .Frac)) (` (.:coerce (.primitive "java.lang.Double")))) []]]]
+  [#0 auto-convert-output ..box
+   [[jvm.byte-descriptor jvm.long-descriptor (list (` "jvm conversion byte-to-long")) [(` (.: (.primitive "java.lang.Long"))) (` (.:coerce .Int))]]
+    [jvm.short-descriptor jvm.long-descriptor (list (` "jvm conversion short-to-long")) [(` (.: (.primitive "java.lang.Long"))) (` (.:coerce .Int))]]
+    [jvm.int-descriptor jvm.long-descriptor (list (` "jvm conversion int-to-long")) [(` (.: (.primitive "java.lang.Long"))) (` (.:coerce .Int))]]
+    [jvm.long-descriptor jvm.long-descriptor (list) [(` (.: (.primitive "java.lang.Long"))) (` (.:coerce .Int))]]
+    [jvm.float-descriptor jvm.double-descriptor (list (` "jvm conversion float-to-double")) [(` (.: (.primitive "java.lang.Double"))) (` (.:coerce .Frac))]]
+    [jvm.double-descriptor jvm.double-descriptor (list) [(` (.: (.primitive "java.lang.Double"))) (` (.:coerce .Frac))]]]]
   )
 
 (def: (un-quote quoted)
   (-> Code Code)
   (` ((~' ~) (~ quoted))))
 
-(def: (jvm-input [unboxed raw])
-  (-> [Text Code] [Text Code])
-  [unboxed (case unboxed
-             (^ (static jvm.byte-descriptor))
-             (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw))))
-             
-             (^ (static jvm.short-descriptor))
-             (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw))))
-             
-             (^ (static jvm.int-descriptor))
-             (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw))))
-             
-             (^ (static jvm.long-descriptor))
-             (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw))))
-             
-             (^ (static jvm.float-descriptor))
-             (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw))))
-             
-             (^ (static jvm.double-descriptor))
-             (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw))))
-             
-             _
-             (` ("jvm object cast" (~ raw))))])
-
 (def: (jvm-invoke-inputs mode classes inputs)
   (-> Primitive-Mode (List Text) (List [Bit Code]) (List Code))
   (|> inputs
@@ -1572,7 +1557,7 @@
                     (` ((~! !!!) (~ (un-quote input))))
                     (un-quote input))))
       (list.zip2 classes)
-      (list@map (|>> jvm-input (auto-convert-input mode)))))
+      (list@map (auto-convert-input mode))))
 
 (def: (with-class-type class expression)
   (-> Text Code Code)
@@ -1695,7 +1680,6 @@
                                                    (` ((~ setter-name) (~ g!value)))
                                                    (` ((~ setter-name) (~ g!value) (~ g!obj))))
                                      setter-value (|> [(jvm.signature import-field-type) (un-quote g!value)]
-                                                      ..jvm-input
                                                       (auto-convert-input import-field-mode))
                                      setter-value (if import-field-maybe?
                                                     (` ((~! !!!) (~ setter-value)))
diff --git a/stdlib/source/lux/target/jvm/type.lux b/stdlib/source/lux/target/jvm/type.lux
index d8851d978..6e3269df5 100644
--- a/stdlib/source/lux/target/jvm/type.lux
+++ b/stdlib/source/lux/target/jvm/type.lux
@@ -39,6 +39,19 @@
   [char-reflection "char"]
   )
 
+(template [ ]
+  [(def: #export  )]
+
+  [boolean-box "java.lang.Boolean"]
+  [byte-box    "java.lang.Byte"]
+  [short-box   "java.lang.Short"]
+  [int-box     "java.lang.Integer"]
+  [long-box    "java.lang.Long"]
+  [float-box   "java.lang.Float"]
+  [double-box  "java.lang.Double"]
+  [char-box    "java.lang.Character"]
+  )
+
 (def: #export array-prefix "[")
 (def: object-prefix "L")
 (def: var-prefix "T")
diff --git a/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux b/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux
index 947bbc69f..358c666c7 100644
--- a/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux
+++ b/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux
@@ -60,14 +60,14 @@
   [(def: #export  .Type (#.Primitive  #.Nil))]
 
   ## Boxes
-  [Boolean   "java.lang.Boolean"]
-  [Byte      "java.lang.Byte"]
-  [Short     "java.lang.Short"]
-  [Integer   "java.lang.Integer"]
-  [Long      "java.lang.Long"]
-  [Float     "java.lang.Float"]
-  [Double    "java.lang.Double"]
-  [Character "java.lang.Character"]
+  [Boolean   jvm.boolean-box]
+  [Byte      jvm.byte-box]
+  [Short     jvm.short-box]
+  [Integer   jvm.int-box]
+  [Long      jvm.long-box]
+  [Float     jvm.float-box]
+  [Double    jvm.double-box]
+  [Character jvm.char-box]
   [String    "java.lang.String"]
 
   ## Primitives
@@ -354,14 +354,14 @@
 
 (def: #export boxes
   (Dictionary Text Text)
-  (|> (list [jvm.boolean-reflection "java.lang.Boolean"]
-            [jvm.byte-reflection    "java.lang.Byte"]
-            [jvm.short-reflection   "java.lang.Short"]
-            [jvm.int-reflection     "java.lang.Integer"]
-            [jvm.long-reflection    "java.lang.Long"]
-            [jvm.float-reflection   "java.lang.Float"]
-            [jvm.double-reflection  "java.lang.Double"]
-            [jvm.char-reflection    "java.lang.Character"])
+  (|> (list [jvm.boolean-reflection jvm.boolean-box]
+            [jvm.byte-reflection    jvm.byte-box]
+            [jvm.short-reflection   jvm.short-box]
+            [jvm.int-reflection     jvm.int-box]
+            [jvm.long-reflection    jvm.long-box]
+            [jvm.float-reflection   jvm.float-box]
+            [jvm.double-reflection  jvm.double-box]
+            [jvm.char-reflection    jvm.char-box])
       (dictionary.from-list text.hash)))
 
 (def: (array-type-info allow-primitives? arrayT)
@@ -518,10 +518,10 @@
       (check-jvm outputT)
 
       #.None
-      (/////analysis.throw non-object objectT))
+      (/////analysis.throw ..non-object objectT))
 
     _
-    (/////analysis.throw non-object objectT)))
+    (/////analysis.throw ..non-object objectT)))
 
 (def: (check-object objectT)
   (-> .Type (Operation Text))
@@ -1032,17 +1032,18 @@
          can-cast? (: (Operation Bit)
                       (case [from-name to-name]
                         (^template [ ]
-                          (^or (^ [(static ) ])
-                               (^ [ (static )]))
+                          (^or (^ [(static ) (static )])
+                               (^ [(static ) (static )])
+                               (^ [(static ) (static )]))
                           (wrap #1))
-                        ([jvm.boolean-reflection "java.lang.Boolean"]
-                         [jvm.byte-reflection    "java.lang.Byte"]
-                         [jvm.short-reflection   "java.lang.Short"]
-                         [jvm.int-reflection     "java.lang.Integer"]
-                         [jvm.long-reflection    "java.lang.Long"]
-                         [jvm.float-reflection   "java.lang.Float"]
-                         [jvm.double-reflection  "java.lang.Double"]
-                         [jvm.char-reflection    "java.lang.Character"])
+                        ([jvm.boolean-reflection jvm.boolean-box]
+                         [jvm.byte-reflection    jvm.byte-box]
+                         [jvm.short-reflection   jvm.short-box]
+                         [jvm.int-reflection     jvm.int-box]
+                         [jvm.long-reflection    jvm.long-box]
+                         [jvm.float-reflection   jvm.float-box]
+                         [jvm.double-reflection  jvm.double-box]
+                         [jvm.char-reflection    jvm.char-box])
 
                         _
                         (do @
@@ -1188,7 +1189,7 @@
                                   (dictionary.from-list text.hash))))
 
                       _
-                      (/////analysis.throw non-object objectT)))
+                      (/////analysis.throw ..non-object objectT)))
          fieldT (java-type-to-lux-type mapping fieldJT)]
         (wrap [fieldT (Modifier::isFinal modifiers)]))
       (/////analysis.throw not-a-virtual-field [class-name field-name]))))
-- 
cgit v1.2.3