aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--new-luxc/source/luxc/generator/host/jvm/inst.lux17
-rw-r--r--new-luxc/source/luxc/generator/procedure/host.jvm.lux72
2 files changed, 84 insertions, 5 deletions
diff --git a/new-luxc/source/luxc/generator/host/jvm/inst.lux b/new-luxc/source/luxc/generator/host/jvm/inst.lux
index efc66f130..d5df6a9f7 100644
--- a/new-luxc/source/luxc/generator/host/jvm/inst.lux
+++ b/new-luxc/source/luxc/generator/host/jvm/inst.lux
@@ -28,6 +28,7 @@
L2D L2F L2I)
<primitive> (declare T_BOOLEAN T_CHAR T_FLOAT T_DOUBLE
T_BYTE T_SHORT T_INT T_LONG)
+ <class> (declare CHECKCAST NEW INSTANCEOF)
<stack> (declare DUP DUP2 DUP2_X1 DUP2_X2
POP POP2
SWAP)
@@ -51,6 +52,7 @@
FALOAD FASTORE
DALOAD DASTORE
CALOAD CASTORE)
+ <concurrency> (declare MONITORENTER MONITOREXIT)
<return> (declare RETURN IRETURN LRETURN DRETURN ARETURN)]
(host;import org.objectweb.asm.Opcodes
(#static NOP int)
@@ -58,8 +60,7 @@
<conversion>
<primitive>
- (#static CHECKCAST int)
- (#static NEW int)
+ <class>
<stack>
<jump>
@@ -84,6 +85,8 @@
(#static ATHROW int)
+ <concurrency>
+
<return>
))
@@ -196,6 +199,9 @@
## Exceptions
[ATHROW]
+ ## Concurrency
+ [MONITORENTER] [MONITOREXIT]
+
## Return
[RETURN] [IRETURN] [LRETURN] [DRETURN] [ARETURN]
)
@@ -232,9 +238,10 @@
(do-to visitor
(MethodVisitor.visitTypeInsn [<inst> ($t;binary-name class)]))))]
- [CHECKCAST Opcodes.CHECKCAST]
- [NEW Opcodes.NEW]
- [ANEWARRAY Opcodes.ANEWARRAY]
+ [CHECKCAST Opcodes.CHECKCAST]
+ [NEW Opcodes.NEW]
+ [INSTANCEOF Opcodes.INSTANCEOF]
+ [ANEWARRAY Opcodes.ANEWARRAY]
)
(def: #export (NEWARRAY type)
diff --git a/new-luxc/source/luxc/generator/procedure/host.jvm.lux b/new-luxc/source/luxc/generator/procedure/host.jvm.lux
index 128e8b517..a6e14659d 100644
--- a/new-luxc/source/luxc/generator/procedure/host.jvm.lux
+++ b/new-luxc/source/luxc/generator/procedure/host.jvm.lux
@@ -357,6 +357,77 @@
(@;install "write" array//write)
)))
+(def: (object//null _)
+ @;Nullary
+ $i;NULL)
+
+(def: (object//null? objectI)
+ @;Unary
+ (<| $i;with-label (function [@then])
+ $i;with-label (function [@end])
+ (|>. objectI
+ ($i;IFNULL @then)
+ ($i;GETSTATIC "java.lang.Boolean" "FALSE" ($t;class "java.lang.Boolean" (list)))
+ ($i;GOTO @end)
+ ($i;label @then)
+ ($i;GETSTATIC "java.lang.Boolean" "TRUE" ($t;class "java.lang.Boolean" (list)))
+ ($i;label @end))))
+
+(def: (object//synchronized [monitorI exprI])
+ @;Binary
+ (|>. monitorI
+ $i;DUP
+ $i;MONITORENTER
+ exprI
+ $i;SWAP
+ $i;MONITOREXIT))
+
+(def: (object//throw exceptionI)
+ @;Unary
+ (|>. exceptionI
+ $i;ATHROW))
+
+(def: (object//class proc generate inputs)
+ (-> Text @;Proc)
+ (case inputs
+ (^ (list (#ls;Text class)))
+ (do macro;Monad<Lux>
+ []
+ (wrap (|>. ($i;string class)
+ ($i;INVOKESTATIC "java.lang.Class" "forName"
+ ($t;method (list ($t;class "java.lang.String" (list)))
+ (#;Some ($t;class "java.lang.Class" (list)))
+ (list))
+ false))))
+
+ _
+ (&;fail (format "Wrong syntax for '" proc "'."))))
+
+(def: (object//instance? proc generate inputs)
+ (-> Text @;Proc)
+ (case inputs
+ (^ (list (#ls;Text class) objectS))
+ (do macro;Monad<Lux>
+ [objectI (generate objectS)]
+ (wrap (|>. objectI
+ ($i;INSTANCEOF class)
+ ($i;wrap #$;Boolean))))
+
+ _
+ (&;fail (format "Wrong syntax for '" proc "'."))))
+
+(def: object-procs
+ @;Bundle
+ (<| (@;prefix "object")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "null" (@;nullary object//null))
+ (@;install "null?" (@;unary object//null?))
+ (@;install "synchronized" (@;binary object//synchronized))
+ (@;install "throw" (@;unary object//throw))
+ (@;install "class" object//class)
+ (@;install "instance?" object//instance?)
+ )))
+
(def: #export procedures
@;Bundle
(<| (@;prefix "jvm")
@@ -368,4 +439,5 @@
(dict;merge double-procs)
(dict;merge char-procs)
(dict;merge array-procs)
+ (dict;merge object-procs)
)))