codegen: eliminate code duplication
[mate.git] / Mate / ClassPool.hs
index 816c73b98ef4b7b5e1e9922838dae4776d3e915f..8d88ad325e31f02e5835aa6923d91888f9b71b23 100644 (file)
@@ -1,6 +1,5 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ForeignFunctionInterface #-}
 #include "debug.h"
 module Mate.ClassPool (
   getClassInfo,
@@ -97,9 +96,10 @@ getStaticFieldAddr from = do
   trapmap <- getTrapMap
   let w32_from = fromIntegral from
   let sfi = trapmap M.! w32_from
+  setTrapMap $ M.delete w32_from trapmap
   case sfi of
-    (SFI (StaticFieldInfo cls field)) -> getStaticFieldOffset cls field
-    _ -> error "getFieldAddr: no trapInfo. abort"
+    (StaticField (StaticFieldInfo cls field)) -> getStaticFieldOffset cls field
+    _ -> error "getFieldAddr: no TrapCause found. abort"
 
 -- interface + method + signature plz!
 getInterfaceMethodOffset :: B.ByteString -> B.ByteString -> B.ByteString -> IO Word32
@@ -197,7 +197,14 @@ calculateFields :: Class Direct -> Maybe ClassInfo -> IO (FieldMap, FieldMap)
 calculateFields cf superclass = do
     -- TODO(bernhard): correct sizes. int only atm
 
-    let (sfields, ifields) = span (S.member ACC_STATIC . fieldAccessFlags) (classFields cf)
+    -- TODO(bernhard): nicer replacement for `myspan'
+    let (sfields, ifields) = myspan (S.member ACC_STATIC . fieldAccessFlags) (classFields cf)
+        myspan :: (a -> Bool) -> [a] -> ([a], [a])
+        myspan _ [] = ([],[])
+        myspan p (x:xs)
+          | p x = (x:ns, ni)
+          | otherwise = (ns, x:ni)
+          where (ns,ni) = myspan p xs
 
     staticbase <- mallocClassData $ fromIntegral (length sfields) * 4
     let i_sb = fromIntegral $ ptrToIntPtr staticbase
@@ -253,7 +260,7 @@ loadAndInitClass path = do
   -- execute class initializer
   case lookupMethod "<clinit>" (ciFile ci) of
     Just m -> do
-      hmap <- parseMethod (ciFile ci) "<clinit>"
+      hmap <- parseMethod (ciFile ci) "<clinit>" $ MethodSignature [] ReturnsVoid
       case hmap of
         Just hmap' -> do
           let mi = MethodInfo "<clinit>" path (methodSignature m)
@@ -276,15 +283,15 @@ readClassFile path' = readIORef classPaths >>= rcf
   where
   path = replace "." "/" path'
   rcf :: [MClassPath] -> IO (Class Direct)
-  rcf [] = error $ "readClassFile: Class \"" ++ (show path) ++ "\" not found."
-  rcf ((Directory pre):xs) = do
+  rcf [] = error $ "readClassFile: Class \"" ++ show path ++ "\" not found."
+  rcf (Directory pre:xs) = do
     let cf = pre ++ path ++ ".class"
     printfCp "rcf: searching @ %s for %s\n" (show pre) (show path)
     b <- doesFileExist cf
     if b
       then parseClassFile cf
       else rcf xs
-  rcf ((JAR p):xs) = do
+  rcf (JAR p:xs) = do
     printfCp "rcf: searching %s in JAR\n" (show path)
     entry <- getEntry p path
     case entry of