1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE ForeignFunctionInterface #-}
8 import qualified Data.Map as M
9 import qualified Data.ByteString.Lazy as B
10 import qualified Data.ByteString.Internal as BI
14 import Foreign.ForeignPtr
15 import Foreign.Marshal.Array
20 getUniqueStringAddr :: B.ByteString -> IO Word32
21 getUniqueStringAddr str = do
22 smap <- get_stringsmap >>= ptr2stringsmap
23 case M.lookup str smap of
25 addr <- allocateJavaString str
26 let smap' = M.insert str addr smap
27 stringsmap2ptr smap' >>= set_stringsmap
29 Just addr -> return addr
31 -- TOOD(bernhard): quite hackish
32 allocateJavaString :: B.ByteString -> IO Word32
33 allocateJavaString str = do
34 let strlen = fromIntegral $ B.length str
35 let str_unpacked = (map fromIntegral $ B.unpack str) :: [Word8]
36 arr <- newArray str_unpacked
37 newstr <- BI.create strlen (\x -> BI.memcpy x arr (fromIntegral strlen))
38 let (newstrptr, _, _) = BI.toForeignPtr newstr
39 let w32_ptr = fromIntegral $ ptrToIntPtr $ unsafeForeignPtrToPtr newstrptr
40 printf "new str ptr: 0x%08x\n" w32_ptr