From 46149b99f901461c71412c1f82b6be20fce45404 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 20 May 2012 21:42:48 +0200 Subject: [PATCH] classpool: cache class file access it was designed for that, so do it... *sigh* sometimes I'm so dumb most things are intend stuff --- Mate/ClassPool.hs | 72 ++++++++++++++++++++++++---------------------- Mate/MethodPool.hs | 6 ++-- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/Mate/ClassPool.hs b/Mate/ClassPool.hs index d9e965c..816c73b 100644 --- a/Mate/ClassPool.hs +++ b/Mate/ClassPool.hs @@ -114,43 +114,47 @@ getInterfaceMethodOffset ifname meth sig = do readClass :: B.ByteString -> IO ClassInfo readClass path = do - cfile <- readClassFile $ toString path + class_map' <- getClassMap + case M.lookup path class_map' of + Just cm -> return cm + Nothing -> do + cfile <- readClassFile $ toString path #ifdef DBG_CLASS - dumpClass cfile + dumpClass cfile #endif - -- load all interfaces, which are implemented by this class - sequence_ [ loadInterface i | i <- interfaces cfile ] - superclass <- if path /= "java/lang/Object" - then do - sc <- readClass $ superClass cfile - return $ Just sc - else return Nothing - - (staticmap, fieldmap) <- calculateFields cfile superclass - (methodmap, mbase) <- calculateMethodMap cfile superclass - immap <- getInterfaceMethodMap - - -- allocate interface offset table for this class - -- TODO(bernhard): we have some duplicates in immap (i.e. some - -- entries have the same offset), so we could - -- save some memory here. - iftable <- mallocClassData ((4*) $ M.size immap) - let w32_iftable = fromIntegral $ ptrToIntPtr iftable :: Word32 - -- store interface-table at offset 0 in method-table - pokeElemOff (intPtrToPtr $ fromIntegral mbase) 0 w32_iftable - printfCp "staticmap: %s @ %s\n" (show staticmap) (toString path) - printfCp "fieldmap: %s @ %s\n" (show fieldmap) (toString path) - printfCp "methodmap: %s @ %s\n" (show methodmap) (toString path) - printfCp "mbase: 0x%08x\n" mbase - printfCp "interfacemethod: %s @ %s\n" (show immap) (toString path) - printfCp "iftable: 0x%08x\n" w32_iftable - virtual_map <- getVirtualMap - setVirtualMap $ M.insert mbase path virtual_map + -- load all interfaces, which are implemented by this class + sequence_ [ loadInterface i | i <- interfaces cfile ] + superclass <- if path /= "java/lang/Object" + then do + sc <- readClass $ superClass cfile + return $ Just sc + else return Nothing + + (staticmap, fieldmap) <- calculateFields cfile superclass + (methodmap, mbase) <- calculateMethodMap cfile superclass + immap <- getInterfaceMethodMap - class_map <- getClassMap - let new_ci = ClassInfo path cfile staticmap fieldmap methodmap mbase False - setClassMap $ M.insert path new_ci class_map - return new_ci + -- allocate interface offset table for this class + -- TODO(bernhard): we have some duplicates in immap (i.e. some + -- entries have the same offset), so we could + -- save some memory here. + iftable <- mallocClassData ((4*) $ M.size immap) + let w32_iftable = fromIntegral $ ptrToIntPtr iftable :: Word32 + -- store interface-table at offset 0 in method-table + pokeElemOff (intPtrToPtr $ fromIntegral mbase) 0 w32_iftable + printfCp "staticmap: %s @ %s\n" (show staticmap) (toString path) + printfCp "fieldmap: %s @ %s\n" (show fieldmap) (toString path) + printfCp "methodmap: %s @ %s\n" (show methodmap) (toString path) + printfCp "mbase: 0x%08x\n" mbase + printfCp "interfacemethod: %s @ %s\n" (show immap) (toString path) + printfCp "iftable: 0x%08x\n" w32_iftable + virtual_map <- getVirtualMap + setVirtualMap $ M.insert mbase path virtual_map + + class_map <- getClassMap + let new_ci = ClassInfo path cfile staticmap fieldmap methodmap mbase False + setClassMap $ M.insert path new_ci class_map + return new_ci loadInterface :: B.ByteString -> IO () diff --git a/Mate/MethodPool.hs b/Mate/MethodPool.hs index c243d11..2f29b40 100644 --- a/Mate/MethodPool.hs +++ b/Mate/MethodPool.hs @@ -141,8 +141,10 @@ compileBB hmap methodinfo = do printfJit "generated code of \"%s\":\n" (toString $ methName methodinfo) mapM_ (printfJit "%s\n" . showAtt) (snd right) printfJit "\n\n" - -- UNCOMMENT NEXT LINE FOR GDB FUN - -- _ <- getLine + -- UNCOMMENT NEXT LINES FOR GDB FUN + --if (toString $ methName methodinfo) == "thejavamethodIwant2debug" + -- then getLine + -- else return "foo" -- (1) start it with `gdb ./mate' and then `run ' -- (2) on getLine, press ctrl+c -- (3) `br *0x'; obtain the address from the disasm above -- 2.25.1