classpool: cache class file access
authorBernhard Urban <lewurm@gmail.com>
Sun, 20 May 2012 19:42:48 +0000 (21:42 +0200)
committerBernhard Urban <lewurm@gmail.com>
Sun, 20 May 2012 19:42:48 +0000 (21:42 +0200)
it was designed for that, so do it... *sigh*
sometimes I'm so dumb

most things are intend stuff

Mate/ClassPool.hs
Mate/MethodPool.hs

index d9e965c3cacc7085d9ec44d47404f0ecb49def86..816c73b98ef4b7b5e1e9922838dae4776d3e915f 100644 (file)
@@ -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 ()
index c243d113950084fa56652f7b4950a64765c50797..2f29b400583dcb2291d2aa8318518f1bfb46a1e4 100644 (file)
@@ -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 <classfile>'
   -- (2) on getLine, press ctrl+c
   -- (3) `br *0x<addr>'; obtain the address from the disasm above