src/HOL/MicroJava/JVM/JVMExecInstr.thy
changeset 12519 a955fe2879ba
parent 10920 9b74eceea2d2
child 12911 704713ca07ea
equal deleted inserted replaced
12518:521f2da133be 12519:a955fe2879ba
    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