X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FClassPool.hs;h=ae6ce4450def203be66630d80ec23e7aa3b07aff;hb=da245b03d80644c22b011acba31acacb880d8327;hp=cb38b28fbd22d89b4237c0735e9d395089e7e85e;hpb=7e3cda1c8cfe2f1e91816277969391c6d91bfb6a;p=mate.git diff --git a/Mate/ClassPool.hs b/Mate/ClassPool.hs index cb38b28..ae6ce44 100644 --- a/Mate/ClassPool.hs +++ b/Mate/ClassPool.hs @@ -19,6 +19,7 @@ import Data.Word import Data.Binary import qualified Data.Map as M import qualified Data.Set as S +import Data.List import qualified Data.ByteString.Lazy as B import Data.String.Utils import Control.Monad @@ -98,8 +99,8 @@ getStaticFieldAddr from = do 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,32 +198,25 @@ calculateFields :: Class Direct -> Maybe ClassInfo -> IO (FieldMap, FieldMap) calculateFields cf superclass = do -- TODO(bernhard): correct sizes. int only atm - -- 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 + let (sfields, ifields) = partition (S.member ACC_STATIC . fieldAccessFlags) (classFields cf) - staticbase <- mallocClassData $ fromIntegral (length sfields) * 4 - let i_sb = fromIntegral $ ptrToIntPtr staticbase - let sm = zipbase i_sb sfields let sc_sm = getsupermap superclass ciStaticMap + staticbase <- mallocClassData $ fromIntegral (length sfields) * 4 + let sm = zipbase (fromIntegral $ ptrToIntPtr staticbase) sfields -- new fields "overwrite" old ones, if they have the same name - let staticmap = M.fromList sm `M.union` sc_sm + let staticmap = sm `M.union` sc_sm let sc_im = getsupermap superclass ciFieldMap -- "+ 4" for the method table pointer let max_off = (4+) $ fromIntegral $ M.size sc_im * 4 let im = zipbase max_off ifields -- new fields "overwrite" old ones, if they have the same name - let fieldmap = M.fromList im `M.union` sc_im + let fieldmap = im `M.union` sc_im return (staticmap, fieldmap) where - zipbase base = zipWith (\x y -> (fieldName y, x + base)) [0,4..] + zipbase :: Int32 -> [Field Direct] -> FieldMap + zipbase base = foldr (\(x,y) -> M.insert (fieldName y) (x + base)) M.empty . zip [0,4..] -- helper getsupermap :: Maybe ClassInfo -> (ClassInfo -> FieldMap) -> FieldMap @@ -260,11 +254,11 @@ loadAndInitClass path = do -- execute class initializer case lookupMethod "" (ciFile ci) of Just m -> do - hmap <- parseMethod (ciFile ci) "" $ MethodSignature [] ReturnsVoid - case hmap of - Just hmap' -> do + method <- parseMethod (ciFile ci) "" $ MethodSignature [] ReturnsVoid + case method of + Just rawmethod -> do let mi = MethodInfo "" path (methodSignature m) - entry <- compileBB hmap' mi + entry <- compileBB rawmethod mi addMethodRef entry mi [path] printfCp "executing static initializer from %s now\n" (toString path) executeFuncPtr entry