+ (ClassInfo _ cfile _ _) <- getClassInfo path
+ return cfile
+
+getFieldBase :: B.ByteString -> IO (CUInt)
+getFieldBase path = do
+ (ClassInfo _ _ fs _) <- getClassInfo path
+ return $ fromIntegral $ ptrToIntPtr fs
+
+getFieldOffset :: B.ByteString -> B.ByteString -> IO (CUInt)
+getFieldOffset path field = do
+ (ClassInfo _ _ _ fieldmap) <- getClassInfo path
+ return $ fromIntegral $ fieldmap M.! field
+
+foreign export ccall getFieldAddr :: CUInt -> Ptr () -> IO CUInt
+getFieldAddr :: CUInt -> Ptr () -> IO CUInt
+getFieldAddr from ptr_trapmap = do
+ trapmap <- ptr2tmap ptr_trapmap
+ let w32_from = fromIntegral from
+ let sfi = trapmap M.! w32_from
+ case sfi of
+ (SFI (StaticFieldInfo cls field)) -> do
+ off <- getFieldOffset cls field
+ base <- getFieldBase cls
+ return $ base + off
+ _ -> error $ "getFieldAddr: no trapInfo. abort"
+
+loadClass :: B.ByteString -> IO ClassInfo
+loadClass path = do