import Foreign.C.Types
import Mate.Types
+import Mate.NativeSizes
import Mate.ClassPool
import Mate.Debug
import Mate.GarbageAlloc
-getUniqueStringAddr :: B.ByteString -> IO Word32
+getUniqueStringAddr :: B.ByteString -> IO NativeWord
getUniqueStringAddr str = do
smap <- getStringMap
case M.lookup str smap of
return addr
Just addr -> return addr
-allocateJavaString :: B.ByteString -> IO Word32
+allocateJavaString :: B.ByteString -> IO NativeWord
allocateJavaString str = do
{- we have to build a java object layout here, where String object looks like
-
-- build object layout
fsize <- getObjectSize "java/lang/String"
printfStr "string: fsize: %d (should be 4 * 5)\n" fsize
- tblptr <- mallocObject $ fromIntegral fsize
- let ptr = intPtrToPtr (fromIntegral tblptr) :: Ptr CUInt
+ tblptr <- mallocObjectVM $ fromIntegral fsize
+ let ptr = intPtrToPtr (fromIntegral tblptr) :: Ptr CPtrdiff
mtbl <- getMethodTable "java/lang/String"
poke ptr $ fromIntegral mtbl
-- build array layout
- let strlen = (fromIntegral $ B.length str)
+ let strlen = fromIntegral $ B.length str
-- (+1) for \0, (+4) for length
- newstr <- mallocString (strlen + 5)
+ newstr <- mallocStringVM (strlen + 5)
BI.memset newstr 0 (fromIntegral $ strlen + 5)
arr <- newArray ((map fromIntegral $ B.unpack str) :: [Word8])
copyBytes (plusPtr newstr 4) arr strlen
printfStr "new str ptr: (%s)@%d\n" (toString str) strlen
- let newstr_length = castPtr newstr :: Ptr CUInt
+ let newstr_length = castPtr newstr :: Ptr CPtrdiff
poke newstr_length $ fromIntegral strlen
-- set value pointer
- poke (plusPtr ptr 4) (fromIntegral (ptrToIntPtr newstr) :: CUInt)
+ poke (plusPtr ptr 4) (fromIntegral (ptrToIntPtr newstr) :: CPtrdiff)
-- set count field
- poke (plusPtr ptr 8) (fromIntegral strlen :: CUInt)
+ poke (plusPtr ptr 8) (fromIntegral strlen :: CPtrdiff)
-- set hash code (TODO)
- poke (plusPtr ptr 12) (0 :: CUInt)
+ poke (plusPtr ptr 12) (0 :: CPtrdiff)
-- set offset
- poke (plusPtr ptr 16) (0 :: CUInt)
+ poke (plusPtr ptr 16) (0 :: CPtrdiff)
return $ fromIntegral tblptr