23 |
23 |
24 "exec_instr (LitPush v) G hp stk vars Cl sig pc frs = |
24 "exec_instr (LitPush v) G hp stk vars Cl sig pc frs = |
25 (None, hp, (v # stk, vars, Cl, sig, pc+1)#frs)" |
25 (None, hp, (v # stk, vars, Cl, sig, pc+1)#frs)" |
26 |
26 |
27 "exec_instr (New C) G hp stk vars Cl sig pc frs = |
27 "exec_instr (New C) G hp stk vars Cl sig pc frs = |
28 (let (oref,xp') = new_Addr hp; |
28 (let (oref,xp') = new_Addr hp; |
29 fs = init_vars (fields(G,C)); |
29 fs = init_vars (fields(G,C)); |
30 hp' = if xp'=None then hp(oref \<mapsto> (C,fs)) else hp; |
30 hp' = if xp'=None then hp(oref \<mapsto> (C,fs)) else hp; |
31 stk' = if xp'=None then (Addr oref)#stk else stk |
31 stk' = if xp'=None then (Addr oref)#stk else stk; |
32 in |
32 pc' = if xp'=None then pc+1 else pc |
33 (xp', hp', (stk', vars, Cl, sig, pc+1)#frs))" |
33 in |
|
34 (xp', hp', (stk', vars, Cl, sig, pc')#frs))" |
34 |
35 |
35 "exec_instr (Getfield F C) G hp stk vars Cl sig pc frs = |
36 "exec_instr (Getfield F C) G hp stk vars Cl sig pc frs = |
36 (let oref = hd stk; |
37 (let oref = hd stk; |
37 xp' = raise_xcpt (oref=Null) NullPointer; |
38 xp' = raise_system_xcpt (oref=Null) NullPointer; |
38 (oc,fs) = the(hp(the_Addr oref)); |
39 (oc,fs) = the(hp(the_Addr oref)); |
39 stk' = if xp'=None then the(fs(F,C))#(tl stk) else tl stk |
40 stk' = if xp'=None then the(fs(F,C))#(tl stk) else tl stk; |
40 in |
41 pc' = if xp'=None then pc+1 else pc |
41 (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))" |
42 in |
|
43 (xp', hp, (stk', vars, Cl, sig, pc')#frs))" |
42 |
44 |
43 "exec_instr (Putfield F C) G hp stk vars Cl sig pc frs = |
45 "exec_instr (Putfield F C) G hp stk vars Cl sig pc frs = |
44 (let (fval,oref)= (hd stk, hd(tl stk)); |
46 (let (fval,oref)= (hd stk, hd(tl stk)); |
45 xp' = raise_xcpt (oref=Null) NullPointer; |
47 xp' = raise_system_xcpt (oref=Null) NullPointer; |
46 a = the_Addr oref; |
48 a = the_Addr oref; |
47 (oc,fs) = the(hp a); |
49 (oc,fs) = the(hp a); |
48 hp' = if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp |
50 hp' = if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp; |
49 in |
51 pc' = if xp'=None then pc+1 else pc |
50 (xp', hp', (tl (tl stk), vars, Cl, sig, pc+1)#frs))" |
52 in |
|
53 (xp', hp', (tl (tl stk), vars, Cl, sig, pc')#frs))" |
51 |
54 |
52 "exec_instr (Checkcast C) G hp stk vars Cl sig pc frs = |
55 "exec_instr (Checkcast C) G hp stk vars Cl sig pc frs = |
53 (let oref = hd stk; |
56 (let oref = hd stk; |
54 xp' = raise_xcpt (\<not> cast_ok G C hp oref) ClassCast; |
57 xp' = raise_system_xcpt (\<not> cast_ok G C hp oref) ClassCast; |
55 stk' = if xp'=None then stk else tl stk |
58 stk' = if xp'=None then stk else tl stk; |
56 in |
59 pc' = if xp'=None then pc+1 else pc |
57 (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))" |
60 in |
|
61 (xp', hp, (stk', vars, Cl, sig, pc')#frs))" |
58 |
62 |
59 "exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs = |
63 "exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs = |
60 (let n = length ps; |
64 (let n = length ps; |
61 argsoref = take (n+1) stk; |
65 argsoref = take (n+1) stk; |
62 oref = last argsoref; |
66 oref = last argsoref; |
63 xp' = raise_xcpt (oref=Null) NullPointer; |
67 xp' = raise_system_xcpt (oref=Null) NullPointer; |
64 dynT = fst(the(hp(the_Addr oref))); |
68 dynT = fst(the(hp(the_Addr oref))); |
65 (dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps)); |
69 (dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps)); |
66 frs' = if xp'=None then |
70 frs' = if xp'=None then |
67 [([],rev argsoref@replicate mxl arbitrary,dc,(mn,ps),0)] |
71 [([],rev argsoref@replicate mxl arbitrary,dc,(mn,ps),0)] |
68 else [] |
72 else [] |
69 in |
73 in |
70 (xp', hp, frs'@(drop (n+1) stk, vars, Cl, sig, pc+1)#frs))" |
74 (xp', hp, frs'@(stk, vars, Cl, sig, pc)#frs))" |
|
75 -- "Because exception handling needs the pc of the Invoke instruction," |
|
76 -- "Invoke doesn't change stk and pc yet (@{text Return} does that)." |
71 |
77 |
72 "exec_instr Return G hp stk0 vars Cl sig0 pc frs = |
78 "exec_instr Return G hp stk0 vars Cl sig0 pc frs = |
73 (if frs=[] then |
79 (if frs=[] then |
74 (None, hp, []) |
80 (None, hp, []) |
75 else |
81 else |
76 let val = hd stk0; (stk,loc,C,sig,pc) = hd frs |
82 let val = hd stk0; (stk,loc,C,sig,pc) = hd frs; |
77 in |
83 (mn,pt) = sig0; n = length pt |
78 (None, hp, (val#stk,loc,C,sig,pc)#tl frs))" |
84 in |
|
85 (None, hp, (val#(drop (n+1) stk),loc,C,sig,pc+1)#tl frs))" |
|
86 -- "Return drops arguments from the caller's stack and increases" |
|
87 -- "the program counter in the caller" |
79 |
88 |
80 "exec_instr Pop G hp stk vars Cl sig pc frs = |
89 "exec_instr Pop G hp stk vars Cl sig pc frs = |
81 (None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)" |
90 (None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)" |
82 |
91 |
83 "exec_instr Dup G hp stk vars Cl sig pc frs = |
92 "exec_instr Dup G hp stk vars Cl sig pc frs = |
91 (None, hp, |
100 (None, hp, |
92 (hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))), |
101 (hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))), |
93 vars, Cl, sig, pc+1)#frs)" |
102 vars, Cl, sig, pc+1)#frs)" |
94 |
103 |
95 "exec_instr Swap G hp stk vars Cl sig pc frs = |
104 "exec_instr Swap G hp stk vars Cl sig pc frs = |
96 (let (val1,val2) = (hd stk,hd (tl stk)) |
105 (let (val1,val2) = (hd stk,hd (tl stk)) |
97 in |
106 in |
98 (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))" |
107 (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))" |
99 |
108 |
100 "exec_instr IAdd G hp stk vars Cl sig pc frs = |
109 "exec_instr IAdd G hp stk vars Cl sig pc frs = |
101 (let (val1,val2) = (hd stk,hd (tl stk)) |
110 (let (val1,val2) = (hd stk,hd (tl stk)) |
102 in |
111 in |
103 (None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)), |
112 (None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)), |
104 vars, Cl, sig, pc+1)#frs))" |
113 vars, Cl, sig, pc+1)#frs))" |
105 |
114 |
106 "exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs = |
115 "exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs = |
107 (let (val1,val2) = (hd stk, hd (tl stk)); |
116 (let (val1,val2) = (hd stk, hd (tl stk)); |
108 pc' = if val1 = val2 then nat(int pc+i) else pc+1 |
117 pc' = if val1 = val2 then nat(int pc+i) else pc+1 |
109 in |
118 in |
110 (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))" |
119 (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))" |
111 |
120 |
112 "exec_instr (Goto i) G hp stk vars Cl sig pc frs = |
121 "exec_instr (Goto i) G hp stk vars Cl sig pc frs = |
113 (None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)" |
122 (None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)" |
114 |
123 |
|
124 "exec_instr Throw G hp stk vars Cl sig pc frs = |
|
125 (let xcpt = raise_system_xcpt (hd stk = Null) NullPointer; |
|
126 xcpt' = if xcpt = None then Some (hd stk) else xcpt |
|
127 in |
|
128 (xcpt', hp, (stk, vars, Cl, sig, pc)#frs))" |
|
129 |
115 end |
130 end |