import Foreign
import Foreign.C.Types
-import Harpy
+import Harpy hiding (fst)
import Mate.Types
import Mate.NativeSizes
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 ". ")
else return ()
return ret_nreip
where
- delTrue = (\nreip -> return (False, nreip)) -- TODO: FIXME
+ delTrue = (\nreip -> return (True, nreip))
delFalse = (\nreip -> return (False, nreip))
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
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