projects
/
mate.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
basicblock: annotate BBs with exceptions
[mate.git]
/
Mate
/
Types.hs
diff --git
a/Mate/Types.hs
b/Mate/Types.hs
index 3bcf6570bc899db38635671da99b95d2bd0669a8..de17e3780aa4cf8c695e72ce4a6891fb505a64e8 100644
(file)
--- a/
Mate/Types.hs
+++ b/
Mate/Types.hs
@@
-29,6
+29,9
@@
import qualified Data.ByteString.Lazy as B
import Data.IORef
import System.IO.Unsafe
import Data.IORef
import System.IO.Unsafe
+import Harpy
+import Foreign.C.Types
+
import JVM.ClassFile
import JVM.Assembler
import JVM.ClassFile
import JVM.Assembler
@@
-39,6
+42,7
@@
type BlockID = Int
-- Represents a CFG node
data BasicBlock = BasicBlock {
code :: [Instruction],
-- Represents a CFG node
data BasicBlock = BasicBlock {
code :: [Instruction],
+ exception :: B.ByteString,
successor :: BBEnd }
-- describes (leaving) edges of a CFG node
successor :: BBEnd }
-- describes (leaving) edges of a CFG node
@@
-63,12
+67,18
@@
data RawMethod = RawMethod {
-- MethodInfo = relevant information about callee
type TrapMap = M.Map NativeWord TrapCause
-- MethodInfo = relevant information about callee
type TrapMap = M.Map NativeWord TrapCause
+type TrapPatcher = CPtrdiff -> CodeGen () () CPtrdiff
+type TrapPatcherEax = CPtrdiff -> CPtrdiff -> CodeGen () () CPtrdiff
+type TrapPatcherEsp = TrapPatcherEax
+
data TrapCause
data TrapCause
- = StaticMethod
MethodInfo
-- for static calls
+ = StaticMethod
TrapPatcher
-- for static calls
| VirtualCall Bool MethodInfo (IO NativeWord) -- for invoke{interface,virtual}
| VirtualCall Bool MethodInfo (IO NativeWord) -- for invoke{interface,virtual}
- | InstanceOf B.ByteString -- class name
- | NewObject B.ByteString -- class name
+ | InstanceOf TrapPatcherEax
+ | ThrowException TrapPatcherEsp
+ | NewObject TrapPatcher
| StaticField StaticFieldInfo
| StaticField StaticFieldInfo
+ | ObjectField TrapPatcher
data StaticFieldInfo = StaticFieldInfo {
sfiClassName :: B.ByteString,
data StaticFieldInfo = StaticFieldInfo {
sfiClassName :: B.ByteString,