2 {-# LANGUAGE OverloadedStrings #-}
9 import qualified Data.Map as M
10 import qualified Data.ByteString.Lazy as B
11 import qualified Data.ByteString.Internal as BI
17 import Foreign.Marshal.Utils
18 import Foreign.Marshal.Array
22 import Mate.GarbageAlloc
25 getUniqueStringAddr :: B.ByteString -> IO Word32
26 getUniqueStringAddr str = do
28 case M.lookup str smap of
30 addr <- allocateJavaString str
31 setStringMap $ M.insert str addr smap
33 Just addr -> return addr
35 allocateJavaString :: B.ByteString -> IO Word32
36 allocateJavaString str = do
37 -- TODO(bernhard): is this also true for UTF8 stuff?
38 let strlen = fromIntegral $ B.length str
39 arr <- newArray ((map fromIntegral $ B.unpack str) :: [Word8])
41 newstr <- mallocString (strlen + 1)
42 BI.memset newstr 0 (fromIntegral $ strlen + 1)
43 copyBytes newstr arr strlen
44 let w32_ptr = fromIntegral $ ptrToIntPtr newstr
45 printfStr "new str ptr: 0x%08x (%s)@%d\n" w32_ptr (toString str) strlen