import qualified Data.Map as M
import qualified Data.ByteString.Lazy as B
import Control.Monad
+import Control.Applicative
import Foreign hiding (xor)
import Foreign.C.Types
import Mate.Types
import Mate.Utilities
import Mate.ClassPool
+import Mate.ClassHierarchy
import {-# SOURCE #-} Mate.MethodPool
import Mate.Strings
emit32 (0x9090ffff :: Word32); nop; nop
let patcher reip = do
let (cname, fname) = buildFieldOffset cls x
- offset <- liftIO $ getFieldOffset cname fname
- push32_rel_eax (Disp (fromIntegral offset)) -- get field
+ offset <- liftIO $ fromIntegral <$> getFieldOffset cname fname
+ push32_rel_eax (Disp offset) -- get field
return reip
return $ Just (trapaddr, ObjectField patcher)
emit' (PUTFIELD x) = do
emit32 (0x9090ffff :: Word32); nop; nop
let patcher reip = do
let (cname, fname) = buildFieldOffset cls x
- offset <- liftIO $ getFieldOffset cname fname
- mov32_rel_ebx_eax (Disp (fromIntegral offset)) -- set field
+ offset <- liftIO $ fromIntegral <$> getFieldOffset cname fname
+ mov32_rel_ebx_eax (Disp offset) -- set field
return reip
return $ Just (trapaddr, ObjectField patcher)
emit' (INSTANCEOF cpidx) = do
pop eax
- mov eax (Disp 0, eax) -- mtable of objectref
trapaddr <- getCurrentOffset
-- place something like `mov edx $mtable_of_objref' instead
- emit32 (0x9090ffff :: Word32); nop
- cmp eax edx
- sete al
- movzxb eax al
- push eax
- forceRegDump
- return $ Just (trapaddr, InstanceOf $ buildClassID cls cpidx)
+ emit32 (0x9090ffff :: Word32)
+ push (0 :: Word32)
+ let patcher reax reip = do
+ emit32 (0x9090ffff :: Word32)
+ let classname = buildClassID cls cpidx
+ check <- liftIO $ isInstanceOf (fromIntegral reax) classname
+ if check
+ then push (1 :: Word32)
+ else push (0 :: Word32)
+ return (reip + 4)
+ return $ Just (trapaddr, InstanceOf patcher)
emit' (NEW objidx) = do
let objname = buildClassID cls objidx
trapaddr <- getCurrentOffset
callMalloc
-- 0x13371337 is just a placeholder; will be replaced with mtable ptr
mov (Disp 0, eax) (0x13371337 :: Word32)
+ mov (Disp 4, eax) (0x1337babe :: Word32)
let patcher reip = do
objsize <- liftIO $ getObjectSize objname
push32 objsize
callMalloc
mtable <- liftIO $ getMethodTable objname
mov (Disp 0, eax) mtable
+ mov (Disp 4, eax) (0x1337babe :: Word32)
return reip
return $ Just (trapaddr, NewObject patcher)