| author | kleing | 
| Tue, 30 Nov 2004 06:50:03 +0100 | |
| changeset 15343 | 444bb25d3da0 | 
| parent 13677 | 5fad004bd9df | 
| child 16417 | 9bc16273c2d4 | 
| 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 | ||
| 11 | theory JVMExecInstr = JVMInstructions + JVMState: | |
| 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: 
10591diff
changeset | 24 | "exec_instr (LitPush v) G hp stk vars Cl sig pc frs = | 
| 
697fab84709e
removed instructions Aconst_null+Bipush, introduced LitPush
 kleing parents: 
10591diff
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: 
9376diff
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 | |
| 10056 | 69 | [([],rev argsoref@replicate mxl arbitrary,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 |