classpool: copy field members refs from superclass
authorBernhard Urban <lewurm@gmail.com>
Mon, 23 Apr 2012 20:38:00 +0000 (22:38 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 23 Apr 2012 20:38:00 +0000 (22:38 +0200)
Makefile
Mate/ClassPool.hs
Mate/Types.hs
tests/Static1.java
tests/Static2.java
tests/Static3.java [new file with mode: 0644]

index 82ff90a2e5834a41d6ed93363be044defcb84fba..4346835679378aea58ccd1819c072d1fba3a858a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,8 @@ test: mate $(CLASS_FILES)
        @printf "should be:  0x%08x\n" 0x33
        ./$< tests/Static2 | grep mainresult
        @printf "should be:  0x%08x\n" 0x55
+       ./$< tests/Static3 | grep mainresult
+       @printf "should be:  0x%08x\n" 0x6dd
 
 %.class: %.java
        $(JAVAC) $<
index eb97e211c9f4c54859353e327df7cef654b58570..b1618edda9c3dac1ff955ba91d790626de3b4cdb 100644 (file)
@@ -30,6 +30,8 @@ getClassFile path = do
   (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
@@ -48,24 +50,29 @@ getFieldAddr from ptr_trapmap = do
   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
index 69180847de5bc8f16f6e8c894a42d24bf5c5afd9..130c2932d5b70548c4b3eca5a593965cd2cffe36 100644 (file)
@@ -49,7 +49,7 @@ type FieldMap = M.Map B.ByteString Int32
 data ClassInfo = ClassInfo {
   clName :: B.ByteString,
   clFile :: Class Resolved,
-  clField :: Ptr Int32,
+  clFieldBase :: Ptr Int32,
   clFieldMap :: FieldMap }
 
 data MethodInfo = MethodInfo {
index 726da7dfad3d251bc87fb2749ca189b3b4145966..74ca4fdd90f15b0772dc6f9a9b7b0967ea4bc330 100644 (file)
@@ -5,12 +5,16 @@ public class Static1 {
        public static int y;
 
        public static void main(String []args) {
+               setNumbers();
+               addNumbers(); // 0x33
+       }
+
+       public static void setNumbers() {
                Static1.x = 0x11;
                Static1.y = 0x22;
-               addnumbers();
        }
 
-       public static int addnumbers() {
+       public static int addNumbers() {
                return Static1.x + Static1.y;
        }
 }
index 874360dc4a023557f1949b72fa019763a25e7386..cfc85dc902ec8d19e73bd84a444cbd9977b1c90b 100644 (file)
@@ -11,6 +11,6 @@ public class Static2 {
                // in Static2 as in Static1
                Static1.x = 0x33;
                Static1.y = 0x22;
-               Static1.addnumbers();
+               Static1.addNumbers();
        }
 }
diff --git a/tests/Static3.java b/tests/Static3.java
new file mode 100644 (file)
index 0000000..a5a732c
--- /dev/null
@@ -0,0 +1,26 @@
+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;
+       }
+}