| author | nipkow | 
| Sun, 15 Feb 2009 11:26:38 +0100 | |
| changeset 29920 | b95f5b8b93dd | 
| parent 28524 | 644b62cf678f | 
| child 39758 | b8a53e3a0ee2 | 
| permissions | -rw-r--r-- | 
| 9376 | 1  | 
(* Title: HOL/MicroJava/JVM/JVMExecInstr.thy  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: Cornelia Pusch, Gerwin Klein  | 
|
4  | 
Copyright 1999 Technische Universitaet Muenchen  | 
|
5  | 
*)  | 
|
6  | 
||
| 10057 | 7  | 
|
| 12911 | 8  | 
header {* \isaheader{JVM Instruction Semantics} *}
 | 
| 10057 | 9  | 
|
10  | 
||
| 16417 | 11  | 
theory JVMExecInstr imports JVMInstructions JVMState begin  | 
| 10057 | 12  | 
|
| 9376 | 13  | 
|
14  | 
consts  | 
|
| 10056 | 15  | 
exec_instr :: "[instr, jvm_prog, aheap, opstack, locvars,  | 
16  | 
cname, sig, p_count, frame list] => jvm_state"  | 
|
| 9376 | 17  | 
primrec  | 
18  | 
"exec_instr (Load idx) G hp stk vars Cl sig pc frs =  | 
|
19  | 
(None, hp, ((vars ! idx) # stk, vars, Cl, sig, pc+1)#frs)"  | 
|
20  | 
||
21  | 
"exec_instr (Store idx) G hp stk vars Cl sig pc frs =  | 
|
22  | 
(None, hp, (tl stk, vars[idx:=hd stk], Cl, sig, pc+1)#frs)"  | 
|
23  | 
||
| 
10897
 
697fab84709e
removed instructions Aconst_null+Bipush, introduced LitPush
 
kleing 
parents: 
10591 
diff
changeset
 | 
24  | 
"exec_instr (LitPush v) G hp stk vars Cl sig pc frs =  | 
| 
 
697fab84709e
removed instructions Aconst_null+Bipush, introduced LitPush
 
kleing 
parents: 
10591 
diff
changeset
 | 
25  | 
(None, hp, (v # stk, vars, Cl, sig, pc+1)#frs)"  | 
| 9376 | 26  | 
|
27  | 
"exec_instr (New C) G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 28  | 
(let (oref,xp') = new_Addr hp;  | 
29  | 
fs = init_vars (fields(G,C));  | 
|
30  | 
hp' = if xp'=None then hp(oref \<mapsto> (C,fs)) else hp;  | 
|
31  | 
pc' = if xp'=None then pc+1 else pc  | 
|
32  | 
in  | 
|
| 13677 | 33  | 
(xp', hp', (Addr oref#stk, vars, Cl, sig, pc')#frs))"  | 
| 9376 | 34  | 
|
35  | 
"exec_instr (Getfield F C) G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 36  | 
(let oref = hd stk;  | 
37  | 
xp' = raise_system_xcpt (oref=Null) NullPointer;  | 
|
38  | 
(oc,fs) = the(hp(the_Addr oref));  | 
|
39  | 
pc' = if xp'=None then pc+1 else pc  | 
|
40  | 
in  | 
|
| 13677 | 41  | 
(xp', hp, (the(fs(F,C))#(tl stk), vars, Cl, sig, pc')#frs))"  | 
| 9376 | 42  | 
|
43  | 
"exec_instr (Putfield F C) G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 44  | 
(let (fval,oref)= (hd stk, hd(tl stk));  | 
45  | 
xp' = raise_system_xcpt (oref=Null) NullPointer;  | 
|
46  | 
a = the_Addr oref;  | 
|
47  | 
(oc,fs) = the(hp a);  | 
|
48  | 
hp' = if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp;  | 
|
49  | 
pc' = if xp'=None then pc+1 else pc  | 
|
50  | 
in  | 
|
51  | 
(xp', hp', (tl (tl stk), vars, Cl, sig, pc')#frs))"  | 
|
| 9376 | 52  | 
|
53  | 
"exec_instr (Checkcast C) G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 54  | 
(let oref = hd stk;  | 
55  | 
xp' = raise_system_xcpt (\<not> cast_ok G C hp oref) ClassCast;  | 
|
56  | 
stk' = if xp'=None then stk else tl stk;  | 
|
57  | 
pc' = if xp'=None then pc+1 else pc  | 
|
58  | 
in  | 
|
59  | 
(xp', hp, (stk', vars, Cl, sig, pc')#frs))"  | 
|
| 9376 | 60  | 
|
| 
9550
 
19a6d1289f5e
Invoke instruction gets fully qualified method name (class+name+sig) as
 
kleing 
parents: 
9376 
diff
changeset
 | 
61  | 
"exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs =  | 
| 12519 | 62  | 
(let n = length ps;  | 
63  | 
argsoref = take (n+1) stk;  | 
|
64  | 
oref = last argsoref;  | 
|
65  | 
xp' = raise_system_xcpt (oref=Null) NullPointer;  | 
|
66  | 
dynT = fst(the(hp(the_Addr oref)));  | 
|
67  | 
(dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps));  | 
|
68  | 
frs' = if xp'=None then  | 
|
| 28524 | 69  | 
[([],rev argsoref@replicate mxl undefined,dc,(mn,ps),0)]  | 
| 12519 | 70  | 
else []  | 
71  | 
in  | 
|
72  | 
(xp', hp, frs'@(stk, vars, Cl, sig, pc)#frs))"  | 
|
73  | 
-- "Because exception handling needs the pc of the Invoke instruction,"  | 
|
74  | 
  -- "Invoke doesn't change stk and pc yet (@{text Return} does that)."
 | 
|
| 9376 | 75  | 
|
76  | 
"exec_instr Return G hp stk0 vars Cl sig0 pc frs =  | 
|
| 12519 | 77  | 
(if frs=[] then  | 
| 9376 | 78  | 
(None, hp, [])  | 
79  | 
else  | 
|
| 12519 | 80  | 
let val = hd stk0; (stk,loc,C,sig,pc) = hd frs;  | 
81  | 
(mn,pt) = sig0; n = length pt  | 
|
82  | 
in  | 
|
83  | 
(None, hp, (val#(drop (n+1) stk),loc,C,sig,pc+1)#tl frs))"  | 
|
84  | 
-- "Return drops arguments from the caller's stack and increases"  | 
|
85  | 
-- "the program counter in the caller"  | 
|
| 9376 | 86  | 
|
87  | 
"exec_instr Pop G hp stk vars Cl sig pc frs =  | 
|
88  | 
(None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)"  | 
|
89  | 
||
90  | 
"exec_instr Dup G hp stk vars Cl sig pc frs =  | 
|
91  | 
(None, hp, (hd stk # stk, vars, Cl, sig, pc+1)#frs)"  | 
|
92  | 
||
93  | 
"exec_instr Dup_x1 G hp stk vars Cl sig pc frs =  | 
|
| 10056 | 94  | 
(None, hp, (hd stk # hd (tl stk) # hd stk # (tl (tl stk)),  | 
95  | 
vars, Cl, sig, pc+1)#frs)"  | 
|
| 9376 | 96  | 
|
97  | 
"exec_instr Dup_x2 G hp stk vars Cl sig pc frs =  | 
|
| 10056 | 98  | 
(None, hp,  | 
99  | 
(hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))),  | 
|
100  | 
vars, Cl, sig, pc+1)#frs)"  | 
|
| 9376 | 101  | 
|
102  | 
"exec_instr Swap G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 103  | 
(let (val1,val2) = (hd stk,hd (tl stk))  | 
| 9376 | 104  | 
in  | 
| 12519 | 105  | 
(None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"  | 
| 9376 | 106  | 
|
107  | 
"exec_instr IAdd G hp stk vars Cl sig pc frs =  | 
|
108  | 
(let (val1,val2) = (hd stk,hd (tl stk))  | 
|
109  | 
in  | 
|
| 10056 | 110  | 
(None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)),  | 
111  | 
vars, Cl, sig, pc+1)#frs))"  | 
|
| 9376 | 112  | 
|
113  | 
"exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs =  | 
|
| 12519 | 114  | 
(let (val1,val2) = (hd stk, hd (tl stk));  | 
| 9376 | 115  | 
pc' = if val1 = val2 then nat(int pc+i) else pc+1  | 
| 12519 | 116  | 
in  | 
117  | 
(None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))"  | 
|
| 9376 | 118  | 
|
119  | 
"exec_instr (Goto i) G hp stk vars Cl sig pc frs =  | 
|
120  | 
(None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)"  | 
|
121  | 
||
| 12519 | 122  | 
"exec_instr Throw G hp stk vars Cl sig pc frs =  | 
123  | 
(let xcpt = raise_system_xcpt (hd stk = Null) NullPointer;  | 
|
124  | 
xcpt' = if xcpt = None then Some (hd stk) else xcpt  | 
|
125  | 
in  | 
|
126  | 
(xcpt', hp, (stk, vars, Cl, sig, pc)#frs))"  | 
|
127  | 
||
128  | 
end  |