(ClassInfo _ cfile _ _) <- getClassInfo path
return cfile
+-- TODO(bernhard): I think we don't need that anymore. also remove fieldbase
+-- entry in ClassInfo
getFieldBase :: B.ByteString -> IO (CUInt)
getFieldBase path = do
(ClassInfo _ _ fs _) <- getClassInfo path
let sfi = trapmap M.! w32_from
case sfi of
(SFI (StaticFieldInfo cls field)) -> do
- off <- getFieldOffset cls field
- base <- getFieldBase cls
- return $ base + off
+ getFieldOffset cls field
_ -> error $ "getFieldAddr: no trapInfo. abort"
loadClass :: B.ByteString -> IO ClassInfo
loadClass path = do
- ptr_classmap <- get_classmap
- class_map <- ptr2classmap ptr_classmap
+ printf "loadClass: \"%s\"\n" $ toString path
let rpath = toString $ path `B.append` ".class"
cfile <- parseClassFile rpath
- printf "class fieldlength: %d\n" $ classFieldsCount cfile
+ superclass <- case (path /= "java/lang/Object") of
+ True -> do
+ sc <- loadClass $ superClass cfile
+ return $ Just $ sc
+ False -> return $ Nothing
+ class_map <- get_classmap >>= ptr2classmap
-- TODO(bernhard): correct sizes. int only atm
let filteredfields = filter (S.member ACC_STATIC . fieldAccessFlags) (classFields cfile)
- let fm = zipWith (\x y -> (fieldName y, x)) [0,4..] filteredfields
- let fieldmap = M.fromList fm
- fieldbase <- mallocBytes ((fromIntegral $ M.size fieldmap) * 4)
- putStrLn $ "fieldmap: " ++ (show fieldmap)
+ fieldbase <- mallocBytes ((fromIntegral $ length filteredfields) * 4)
+ let i_fb = fromIntegral $ ptrToIntPtr $ fieldbase
+ let fm = zipWith (\x y -> (fieldName y, x + i_fb)) [0,4..] filteredfields
+ let sc_fm = case superclass of Just x -> clFieldMap x; Nothing -> M.empty
+ -- new fields "overwrite" old ones, if they have the same name
+ let fieldmap = (M.fromList fm) `M.union` sc_fm
+ printf "fieldmap: %s @ %s\n" (show fieldmap) (toString path)
let new_ci = ClassInfo path cfile fieldbase fieldmap
let class_map' = M.insert path new_ci class_map
classmap2ptr class_map' >>= set_classmap
--- /dev/null
+package tests;
+
+public class Static3 extends Static1 {
+ public static int z;
+ public static int sum;
+ public static void main(String []args) {
+ sum = 0;
+ Static3.x = 0x111;
+ Static3.y = 0x555;
+ sum += Static1.addNumbers(); // 0x666
+ Static1.setNumbers();
+ sum += Static1.addNumbers(); // 0x33
+ Static3.z = 0x11;
+ sum += Static3.addNumbers(); // 0x44
+ getSum(); // 0x666 + 0x33 + 0x44 = 0x6dd
+ // System.out.printf("%x\n", getSum());
+ }
+
+ public static int getSum() {
+ return sum;
+ }
+
+ public static int addNumbers() {
+ return x + y + z;
+ }
+}