X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FStrings.hs;h=e5f0fd99f21de81003b2f91b5bd43368f11e4f19;hb=3573020fca0413c6d7823e2a1d70108f25766db0;hp=2ebda14e4861da078d754c6730999c6fc8e8e56e;hpb=032ac1857d0d33607a638684584da6079f0c74c1;p=mate.git diff --git a/Mate/Strings.hs b/Mate/Strings.hs index 2ebda14..e5f0fd9 100644 --- a/Mate/Strings.hs +++ b/Mate/Strings.hs @@ -19,12 +19,13 @@ import Foreign 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 @@ -34,7 +35,7 @@ getUniqueStringAddr str = do 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 - @@ -56,30 +57,30 @@ allocateJavaString str = do -- 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