src/HOL/MicroJava/JVM/JVMExecInstr.thy
changeset 12519 a955fe2879ba
parent 10920 9b74eceea2d2
child 12911 704713ca07ea
--- a/src/HOL/MicroJava/JVM/JVMExecInstr.thy	Sun Dec 16 00:18:44 2001 +0100
+++ b/src/HOL/MicroJava/JVM/JVMExecInstr.thy	Sun Dec 16 00:19:08 2001 +0100
@@ -25,57 +25,66 @@
       (None, hp, (v # stk, vars, Cl, sig, pc+1)#frs)"
 
  "exec_instr (New C) G hp stk vars Cl sig pc frs = 
-	(let (oref,xp')	= new_Addr hp;
-       fs		= init_vars (fields(G,C));
-	     hp'	= if xp'=None then hp(oref \<mapsto> (C,fs)) else hp;
-	     stk'	= if xp'=None then (Addr oref)#stk else stk
-	 in 
-      (xp', hp', (stk', vars, Cl, sig, pc+1)#frs))"	
+  (let (oref,xp') = new_Addr hp;
+       fs   = init_vars (fields(G,C));
+       hp'  = if xp'=None then hp(oref \<mapsto> (C,fs)) else hp;
+       stk' = if xp'=None then (Addr oref)#stk else stk;
+       pc'  = if xp'=None then pc+1 else pc
+   in 
+      (xp', hp', (stk', vars, Cl, sig, pc')#frs))"
 
  "exec_instr (Getfield F C) G hp stk vars Cl sig pc frs = 
-	(let oref	= hd stk;
-	     xp'	= raise_xcpt (oref=Null) NullPointer;
-	     (oc,fs)	= the(hp(the_Addr oref));
-	     stk'	= if xp'=None then the(fs(F,C))#(tl stk) else tl stk
-	 in
-      (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
+  (let oref = hd stk;
+       xp'  = raise_system_xcpt (oref=Null) NullPointer;
+       (oc,fs)  = the(hp(the_Addr oref));
+       stk' = if xp'=None then the(fs(F,C))#(tl stk) else tl stk;
+       pc'  = if xp'=None then pc+1 else pc
+   in
+      (xp', hp, (stk', vars, Cl, sig, pc')#frs))"
 
  "exec_instr (Putfield F C) G hp stk vars Cl sig pc frs = 
-	(let (fval,oref)= (hd stk, hd(tl stk));
-	     xp'	= raise_xcpt (oref=Null) NullPointer;
-	     a		= the_Addr oref;
-	     (oc,fs)	= the(hp a);
-	     hp'	= if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp
-	 in
-      (xp', hp', (tl (tl stk), vars, Cl, sig, pc+1)#frs))"
+  (let (fval,oref)= (hd stk, hd(tl stk));
+       xp'  = raise_system_xcpt (oref=Null) NullPointer;
+       a    = the_Addr oref;
+       (oc,fs)  = the(hp a);
+       hp'  = if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp;
+       pc'  = if xp'=None then pc+1 else pc
+   in
+      (xp', hp', (tl (tl stk), vars, Cl, sig, pc')#frs))"
 
  "exec_instr (Checkcast C) G hp stk vars Cl sig pc frs =
-	(let oref	= hd stk;
-	     xp'	= raise_xcpt (\<not> cast_ok G C hp oref) ClassCast; 
-	     stk'	= if xp'=None then stk else tl stk
-	 in
-      (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
+  (let oref = hd stk;
+       xp'  = raise_system_xcpt (\<not> cast_ok G C hp oref) ClassCast; 
+       stk' = if xp'=None then stk else tl stk;
+       pc'  = if xp'=None then pc+1 else pc
+   in
+      (xp', hp, (stk', vars, Cl, sig, pc')#frs))"
 
  "exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs =
-	(let n		= length ps;
-	     argsoref	= take (n+1) stk;
-	     oref	= last argsoref;
-	     xp'	= raise_xcpt (oref=Null) NullPointer;
-	     dynT	= fst(the(hp(the_Addr oref)));
-	     (dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps));
-	     frs'	= if xp'=None then 
+  (let n    = length ps;
+       argsoref = take (n+1) stk;
+       oref = last argsoref;
+       xp'  = raise_system_xcpt (oref=Null) NullPointer;
+       dynT = fst(the(hp(the_Addr oref)));
+       (dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps));
+       frs' = if xp'=None then 
                 [([],rev argsoref@replicate mxl arbitrary,dc,(mn,ps),0)]
-	            else []
-	 in
-      (xp', hp, frs'@(drop (n+1) stk, vars, Cl, sig, pc+1)#frs))"
+              else []
+   in 
+      (xp', hp, frs'@(stk, vars, Cl, sig, pc)#frs))" 
+  -- "Because exception handling needs the pc of the Invoke instruction,"
+  -- "Invoke doesn't change stk and pc yet (@{text Return} does that)."
 
  "exec_instr Return G hp stk0 vars Cl sig0 pc frs =
-	(if frs=[] then 
+  (if frs=[] then 
      (None, hp, [])
    else 
-     let val = hd stk0; (stk,loc,C,sig,pc) = hd frs
-	 in 
-      (None, hp, (val#stk,loc,C,sig,pc)#tl frs))"
+     let val = hd stk0; (stk,loc,C,sig,pc) = hd frs;
+         (mn,pt) = sig0; n = length pt
+   in 
+      (None, hp, (val#(drop (n+1) stk),loc,C,sig,pc+1)#tl frs))"
+  -- "Return drops arguments from the caller's stack and increases"
+  -- "the program counter in the caller"
 
  "exec_instr Pop G hp stk vars Cl sig pc frs = 
       (None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)"
@@ -93,9 +102,9 @@
        vars, Cl, sig, pc+1)#frs)"
 
  "exec_instr Swap G hp stk vars Cl sig pc frs =
-	(let (val1,val2) = (hd stk,hd (tl stk))
+  (let (val1,val2) = (hd stk,hd (tl stk))
    in
-	    (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"
+      (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"
 
  "exec_instr IAdd G hp stk vars Cl sig pc frs =
   (let (val1,val2) = (hd stk,hd (tl stk))
@@ -104,12 +113,18 @@
        vars, Cl, sig, pc+1)#frs))"
 
  "exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs =
-	(let (val1,val2) = (hd stk, hd (tl stk));
+  (let (val1,val2) = (hd stk, hd (tl stk));
      pc' = if val1 = val2 then nat(int pc+i) else pc+1
-	 in
-	    (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))"
+   in
+      (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))"
 
  "exec_instr (Goto i) G hp stk vars Cl sig pc frs =
       (None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)"
 
-end
+ "exec_instr Throw G hp stk vars Cl sig pc frs =
+  (let xcpt  = raise_system_xcpt (hd stk = Null) NullPointer;
+       xcpt' = if xcpt = None then Some (hd stk) else xcpt
+   in
+      (xcpt', hp, (stk, vars, Cl, sig, pc)#frs))"
+
+end
\ No newline at end of file