@if [ -f $(COMPILEF) ]; \
then $(SHELL) $(COMPILEF); \
else $(JAVAC) $<; fi
+ @echo "JAVAC $<"
ffi/native.o: ffi/native.c
ghc -Wall -O2 -c $< -o $@
methodHaveReturnValue cls idx = case ret of
ReturnsVoid -> False;
(Returns IntType) -> True;
+ (Returns (Array _ _)) -> True
(Returns (ObjectType _)) -> True;
- _ -> error "methodHaveReturnValue: todo"
+ _ -> error $ "methodHaveReturnValue: todo: " ++ show ret
where
nt = case constsPool cls M.! idx of
(CMethod _ nt') -> nt'
#include "debug.h"
module Mate.X86CodeGen where
+import Prelude hiding (and)
import Data.Binary
import Data.BinaryState
import Data.Int
add ebx (1 :: Word32)
pop ecx -- aref
mov (ecx, ebx, S4) eax
+ emit CASTORE = do
+ pop eax -- value
+ pop ebx -- offset
+ add ebx (1 :: Word32)
+ pop ecx -- aref
+ mov (ecx, ebx, S1) eax -- TODO(bernhard): char is two byte
emit AALOAD = emit IALOAD
emit IALOAD = do
pop ebx -- offset
add ebx (1 :: Word32)
pop ecx -- aref
push (ecx, ebx, S4)
+ emit CALOAD = do
+ pop ebx -- offset
+ add ebx (1 :: Word32)
+ pop ecx -- aref
+ push (ecx, ebx, S1) -- TODO(bernhard): char is two byte
emit ARRAYLENGTH = do
pop eax
push (Disp 0, eax)
emit (NEWARRAY typ) = do
let tsize = case decodeS (0 :: Integer) (B.pack [typ]) of
T_INT -> 4
+ T_CHAR -> 2
_ -> error "newarray: type not implemented yet"
-- get length from stack, but leave it there
mov eax (Disp 0, esp)
mtable <- liftIO $ getMethodTable objname
mov (Disp 0, eax) mtable
emit (CHECKCAST _) = nop -- TODO(bernhard): ...
+ emit I2C = do
+ pop eax
+ and eax (0x000000ff :: Word32)
+ push eax
emit (BIPUSH val) = push (fromIntegral val :: Word32)
emit (SIPUSH val) = push (fromIntegral (fromIntegral val :: Int16) :: Word32)
emit (ICONST_0) = push (0 :: Word32)
--- /dev/null
+package java.lang;
+
+public class Character {
+ char value;
+
+ public Character(char a) {
+ this.value = a;
+ }
+
+ public static Character valueOf(char a) {
+ return new Character(a);
+ }
+}
--- /dev/null
+package tests;
+
+public class CharArray1 {
+ static char[] foo() {
+ char[] val = new char[10];
+ for (int i = 0; i < 10; i++)
+ val[i] = (char) (i + 0x30);
+ return val;
+ }
+
+ public static void main(String []args) {
+ char [] ar = foo();
+ for (int i = 0; i < 10; i++)
+ System.out.printf("%c", ar[i]);
+ System.out.printf("\n");
+ }
+}