+instanceOfMissHandler :: CPtrdiff -> B.ByteString -> IO CPtrdiff
+instanceOfMissHandler eip classname = do
+ -- first byte is going to be the opcode
+ let insn_ptr = intPtrToPtr (fromIntegral eip) :: Ptr CUChar
+ -- the next four bytes are the immediate
+ let imm_ptr = intPtrToPtr (fromIntegral (eip + 1)) :: Ptr CPtrdiff
+ checkMe <- peek imm_ptr
+ if checkMe == 0x909090ff then -- safety check...
+ do
+ mtable <- getMethodTable classname
+ poke imm_ptr (fromIntegral mtable)
+ poke insn_ptr 0xba -- `mov edx' opcode
+ return eip
+ else error "instanceOfMissHandler: something is wrong here. abort.\n"
+