instanceOf: make decision at runtime
[mate.git] / Mate / X86TrapHandling.hs
index ecf346a2771e7249525ffadfd9d36a1ecd528efb..0df63b866479fac4d2a8d0bcedc508c067dc8d76 100644 (file)
@@ -12,7 +12,7 @@ import qualified Data.ByteString.Lazy as B
 import Foreign
 import Foreign.C.Types
 
-import Harpy
+import Harpy hiding (fst)
 
 import Mate.Types
 import Mate.NativeSizes
@@ -33,21 +33,21 @@ mateHandler reip reax rebx resi = do
   let reipw32 = fromIntegral reip
   (deleteMe, ret_nreip) <- case M.lookup reipw32 tmap of
     (Just (StaticMethod patcher)) ->
-        patchWithHarpy patcher reip >>= delTrue
+        patchWithHarpy patcher reip >>= delFalse
     (Just (StaticField _))  ->
         staticFieldHandler reip >>= delTrue
     (Just (ObjectField patcher)) ->
         patchWithHarpy patcher reip >>= delTrue
-    (Just (InstanceOf cn))  ->
-        patchWithHarpy (`patchInstanceOf` cn) reip >>= delFalse
+    (Just (InstanceOf patcher))  ->
+        patchWithHarpy (patcher reax) reip >>= delFalse
     (Just (NewObject patcher))   ->
         patchWithHarpy patcher reip >>= delTrue
     (Just (VirtualCall False mi io_offset)) ->
         patchWithHarpy (patchInvoke mi reax reax io_offset) reip
-        >>= delTrue
+        >>= delFalse
     (Just (VirtualCall True  mi io_offset)) ->
         patchWithHarpy (patchInvoke mi rebx reax io_offset) reip
-        >>= delTrue
+        >>= delFalse
     Nothing -> case resi of
         0x13371234 -> return (-1) >>= delFalse
         _ -> error $ "getTrapType: abort :-( " ++ (showHex reip ". ")
@@ -57,7 +57,7 @@ mateHandler reip reax rebx resi = do
     else return ()
   return ret_nreip
   where
-    delTrue = (\nreip -> return (False, nreip)) -- TODO: FIXME
+    delTrue = (\nreip -> return (True, nreip))
     delFalse = (\nreip -> return (False, nreip))
 
 
@@ -72,7 +72,7 @@ patchWithHarpy patcher reip = do
   if mateDEBUG
     then mapM_ (printfJit . printf "patched: %s\n" . showAtt) $ snd right
     else return ()
-  return reip
+  return $ fst right
 
 withDisasm :: CodeGen e s CPtrdiff -> CodeGen e s (CPtrdiff, [Instruction])
 withDisasm patcher = do
@@ -91,12 +91,6 @@ staticFieldHandler reip = do
       return reip
     else error "staticFieldHandler: something is wrong here. abort.\n"
 
-patchInstanceOf :: CPtrdiff -> B.ByteString -> CodeGen e s CPtrdiff
-patchInstanceOf reip classname = do
-  mtable <- liftIO $ getMethodTable classname
-  mov edx mtable
-  return reip
-
 patchInvoke :: MethodInfo -> CPtrdiff -> CPtrdiff -> IO NativeWord -> CPtrdiff -> CodeGen e s CPtrdiff
 patchInvoke (MethodInfo methname _ msig)  method_table table2patch io_offset reip = do
   vmap <- liftIO $ getVirtualMap