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 |
Semantics of JVM instructions
|
|
7 |
*)
|
|
8 |
|
|
9 |
JVMExecInstr = JVMInstructions + JVMState +
|
|
10 |
|
|
11 |
consts
|
|
12 |
exec_instr :: "[instr, jvm_prog, aheap, opstack, locvars, cname, sig, p_count, frame list] \\<Rightarrow> jvm_state"
|
|
13 |
primrec
|
|
14 |
"exec_instr (Load idx) G hp stk vars Cl sig pc frs =
|
|
15 |
(None, hp, ((vars ! idx) # stk, vars, Cl, sig, pc+1)#frs)"
|
|
16 |
|
|
17 |
"exec_instr (Store idx) G hp stk vars Cl sig pc frs =
|
|
18 |
(None, hp, (tl stk, vars[idx:=hd stk], Cl, sig, pc+1)#frs)"
|
|
19 |
|
|
20 |
"exec_instr (Bipush ival) G hp stk vars Cl sig pc frs =
|
|
21 |
(None, hp, (Intg ival # stk, vars, Cl, sig, pc+1)#frs)"
|
|
22 |
|
|
23 |
"exec_instr Aconst_null G hp stk vars Cl sig pc frs =
|
|
24 |
(None, hp, (Null # stk, vars, Cl, sig, pc+1)#frs)"
|
|
25 |
|
|
26 |
"exec_instr (New C) G hp stk vars Cl sig pc frs =
|
|
27 |
(let xp' = raise_xcpt (\\<forall>x. hp x \\<noteq> None) OutOfMemory;
|
|
28 |
oref = newref hp;
|
|
29 |
fs = init_vars (fields(G,C));
|
|
30 |
hp' = if xp'=None then hp(oref \\<mapsto> (C,fs)) else hp;
|
|
31 |
stk' = if xp'=None then (Addr oref)#stk else stk
|
|
32 |
in
|
|
33 |
(xp', hp', (stk', vars, Cl, sig, pc+1)#frs))"
|
|
34 |
|
|
35 |
"exec_instr (Getfield F C) G hp stk vars Cl sig pc frs =
|
|
36 |
(let oref = hd stk;
|
|
37 |
xp' = raise_xcpt (oref=Null) NullPointer;
|
|
38 |
(oc,fs) = the(hp(the_Addr oref));
|
|
39 |
stk' = if xp'=None then the(fs(F,C))#(tl stk) else tl stk
|
|
40 |
in
|
|
41 |
(xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
|
|
42 |
|
|
43 |
"exec_instr (Putfield F C) G hp stk vars Cl sig pc frs =
|
|
44 |
(let (fval,oref)= (hd stk, hd(tl stk));
|
|
45 |
xp' = raise_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 |
in
|
|
50 |
(xp', hp', (tl (tl stk), vars, Cl, sig, pc+1)#frs))"
|
|
51 |
|
|
52 |
"exec_instr (Checkcast C) G hp stk vars Cl sig pc frs =
|
|
53 |
(let oref = hd stk;
|
|
54 |
xp' = raise_xcpt (\\<not> cast_ok G C hp oref) ClassCast;
|
|
55 |
stk' = if xp'=None then stk else tl stk
|
|
56 |
in
|
|
57 |
(xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
|
|
58 |
|
|
59 |
"exec_instr (Invoke mn ps) G hp stk vars Cl sig pc frs =
|
|
60 |
(let n = length ps;
|
|
61 |
argsoref = take (n+1) stk;
|
|
62 |
oref = last argsoref;
|
|
63 |
xp' = raise_xcpt (oref=Null) NullPointer;
|
|
64 |
dynT = fst(the(hp(the_Addr oref)));
|
|
65 |
(dc,mh,mxl,c)= the (method (G,dynT) (mn,ps));
|
|
66 |
frs' = if xp'=None
|
|
67 |
then [([],rev argsoref@replicate mxl arbitrary,dc,(mn,ps),0)]
|
|
68 |
else []
|
|
69 |
in
|
|
70 |
(xp', hp, frs'@(drop (n+1) stk, vars, Cl, sig, pc+1)#frs))"
|
|
71 |
|
|
72 |
"exec_instr Return G hp stk0 vars Cl sig0 pc frs =
|
|
73 |
(if frs=[] then
|
|
74 |
(None, hp, [])
|
|
75 |
else
|
|
76 |
let val = hd stk0; (stk,loc,C,sig,pc) = hd frs
|
|
77 |
in
|
|
78 |
(None, hp, (val#stk,loc,C,sig,pc)#tl frs))"
|
|
79 |
|
|
80 |
"exec_instr Pop G hp stk vars Cl sig pc frs =
|
|
81 |
(None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)"
|
|
82 |
|
|
83 |
"exec_instr Dup G hp stk vars Cl sig pc frs =
|
|
84 |
(None, hp, (hd stk # stk, vars, Cl, sig, pc+1)#frs)"
|
|
85 |
|
|
86 |
"exec_instr Dup_x1 G hp stk vars Cl sig pc frs =
|
|
87 |
(None, hp, (hd stk # hd (tl stk) # hd stk # (tl (tl stk)), vars, Cl, sig, pc+1)#frs)"
|
|
88 |
|
|
89 |
"exec_instr Dup_x2 G hp stk vars Cl sig pc frs =
|
|
90 |
(None, hp, (hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))),
|
|
91 |
vars, Cl, sig, pc+1)#frs)"
|
|
92 |
|
|
93 |
"exec_instr Swap G hp stk vars Cl sig pc frs =
|
|
94 |
(let (val1,val2) = (hd stk,hd (tl stk))
|
|
95 |
in
|
|
96 |
(None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"
|
|
97 |
|
|
98 |
"exec_instr IAdd G hp stk vars Cl sig pc frs =
|
|
99 |
(let (val1,val2) = (hd stk,hd (tl stk))
|
|
100 |
in
|
|
101 |
(None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"
|
|
102 |
|
|
103 |
"exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs =
|
|
104 |
(let (val1,val2) = (hd stk, hd (tl stk));
|
|
105 |
pc' = if val1 = val2 then nat(int pc+i) else pc+1
|
|
106 |
in
|
|
107 |
(None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))"
|
|
108 |
|
|
109 |
"exec_instr (Goto i) G hp stk vars Cl sig pc frs =
|
|
110 |
(None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)"
|
|
111 |
|
|
112 |
end
|