+
+ emit' (GETFIELD x) = do
+ pop eax -- this pointer
+ trapaddr <- getCurrentOffset
+ -- like: 099db064 ff b0 e4 14 00 00 pushl 5348(%eax)
+ 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
+ return reip
+ return $ Just (trapaddr, ObjectField patcher)
+ emit' (PUTFIELD x) = do
+ pop ebx -- value to write
+ pop eax -- this pointer
+ trapaddr <- getCurrentOffset
+ -- like: 4581fc6b 89 98 30 7b 00 00 movl %ebx,31536(%eax)
+ 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
+ return reip
+ return $ Just (trapaddr, ObjectField patcher)
+