src/HOL/MicroJava/JVM/JVMExecInstr.thy
author wenzelm
Sat, 02 Jan 2016 18:48:45 +0100
changeset 62042 6c6ccf573479
parent 61361 8b5f00202e1a
child 62390 842917225d56
permissions -rw-r--r--
isabelle update_cartouches -c -t;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/JVM/JVMExecInstr.thy
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     2
    Author:     Cornelia Pusch, Gerwin Klein
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     3
    Copyright   1999 Technische Universitaet Muenchen
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     4
*)
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     5
10057
8c8d2d0d3ef8 converted to Isar, tuned
kleing
parents: 10056
diff changeset
     6
61361
8b5f00202e1a isabelle update_cartouches;
wenzelm
parents: 58886
diff changeset
     7
section \<open>JVM Instruction Semantics\<close>
10057
8c8d2d0d3ef8 converted to Isar, tuned
kleing
parents: 10056
diff changeset
     8
8c8d2d0d3ef8 converted to Isar, tuned
kleing
parents: 10056
diff changeset
     9
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13677
diff changeset
    10
theory JVMExecInstr imports JVMInstructions JVMState begin
10057
8c8d2d0d3ef8 converted to Isar, tuned
kleing
parents: 10056
diff changeset
    11
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    12
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    13
primrec exec_instr :: "[instr, jvm_prog, aheap, opstack, locvars, cname, sig, p_count, frame list] => jvm_state"
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    14
where
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    15
 "exec_instr (Load idx) G hp stk vars Cl sig pc frs = 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    16
      (None, hp, ((vars ! idx) # stk, vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    17
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    18
 "exec_instr (Store idx) G hp stk vars Cl sig pc frs = 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    19
      (None, hp, (tl stk, vars[idx:=hd stk], Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    20
10897
697fab84709e removed instructions Aconst_null+Bipush, introduced LitPush
kleing
parents: 10591
diff changeset
    21
 "exec_instr (LitPush v) G hp stk vars Cl sig pc frs = 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    22
      (None, hp, (v # stk, vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    23
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    24
 "exec_instr (New C) G hp stk vars Cl sig pc frs = 
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    25
  (let (oref,xp') = new_Addr hp;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    26
       fs   = init_vars (fields(G,C));
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    27
       hp'  = if xp'=None then hp(oref \<mapsto> (C,fs)) else hp;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    28
       pc'  = if xp'=None then pc+1 else pc
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    29
   in 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    30
      (xp', hp', (Addr oref#stk, vars, Cl, sig, pc')#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    31
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    32
 "exec_instr (Getfield F C) G hp stk vars Cl sig pc frs = 
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    33
  (let oref = hd stk;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    34
       xp'  = raise_system_xcpt (oref=Null) NullPointer;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    35
       (oc,fs)  = the(hp(the_Addr oref));
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    36
       pc'  = if xp'=None then pc+1 else pc
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    37
   in
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    38
      (xp', hp, (the(fs(F,C))#(tl stk), vars, Cl, sig, pc')#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    39
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    40
 "exec_instr (Putfield F C) G hp stk vars Cl sig pc frs = 
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    41
  (let (fval,oref)= (hd stk, hd(tl stk));
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    42
       xp'  = raise_system_xcpt (oref=Null) NullPointer;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    43
       a    = the_Addr oref;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    44
       (oc,fs)  = the(hp a);
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    45
       hp'  = if xp'=None then hp(a \<mapsto> (oc, fs((F,C) \<mapsto> fval))) else hp;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    46
       pc'  = if xp'=None then pc+1 else pc
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    47
   in
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    48
      (xp', hp', (tl (tl stk), vars, Cl, sig, pc')#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    49
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    50
 "exec_instr (Checkcast C) G hp stk vars Cl sig pc frs =
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    51
  (let oref = hd stk;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    52
       xp'  = raise_system_xcpt (\<not> cast_ok G C hp oref) ClassCast; 
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    53
       stk' = if xp'=None then stk else tl stk;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    54
       pc'  = if xp'=None then pc+1 else pc
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    55
   in
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    56
      (xp', hp, (stk', vars, Cl, sig, pc')#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    57
9550
19a6d1289f5e Invoke instruction gets fully qualified method name (class+name+sig) as
kleing
parents: 9376
diff changeset
    58
 "exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs =
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    59
  (let n    = length ps;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    60
       argsoref = take (n+1) stk;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    61
       oref = last argsoref;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    62
       xp'  = raise_system_xcpt (oref=Null) NullPointer;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    63
       dynT = fst(the(hp(the_Addr oref)));
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    64
       (dc,mh,mxs,mxl,c)= the (method (G,dynT) (mn,ps));
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    65
       frs' = if xp'=None then 
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 16417
diff changeset
    66
                [([],rev argsoref@replicate mxl undefined,dc,(mn,ps),0)]
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    67
              else []
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    68
   in 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    69
      (xp', hp, frs'@(stk, vars, Cl, sig, pc)#frs))" |
62042
6c6ccf573479 isabelle update_cartouches -c -t;
wenzelm
parents: 61361
diff changeset
    70
  \<comment> "Because exception handling needs the pc of the Invoke instruction,"
6c6ccf573479 isabelle update_cartouches -c -t;
wenzelm
parents: 61361
diff changeset
    71
  \<comment> "Invoke doesn't change stk and pc yet (\<open>Return\<close> does that)."
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    72
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    73
 "exec_instr Return G hp stk0 vars Cl sig0 pc frs =
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    74
  (if frs=[] then 
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    75
     (None, hp, [])
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    76
   else 
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    77
     let val = hd stk0; (stk,loc,C,sig,pc) = hd frs;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    78
         (mn,pt) = sig0; n = length pt
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    79
   in 
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
    80
      (None, hp, (val#(drop (n+1) stk),loc,C,sig,pc+1)#tl frs))"
62042
6c6ccf573479 isabelle update_cartouches -c -t;
wenzelm
parents: 61361
diff changeset
    81
  \<comment> "Return drops arguments from the caller's stack and increases"
6c6ccf573479 isabelle update_cartouches -c -t;
wenzelm
parents: 61361
diff changeset
    82
  \<comment> "the program counter in the caller" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    83
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    84
 "exec_instr Pop G hp stk vars Cl sig pc frs = 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    85
      (None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    86
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    87
 "exec_instr Dup G hp stk vars Cl sig pc frs = 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    88
      (None, hp, (hd stk # stk, vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    89
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    90
 "exec_instr Dup_x1 G hp stk vars Cl sig pc frs = 
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    91
      (None, hp, (hd stk # hd (tl stk) # hd stk # (tl (tl stk)), 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    92
                  vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    93
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    94
 "exec_instr Dup_x2 G hp stk vars Cl sig pc frs = 
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    95
      (None, hp, 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    96
       (hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))),
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
    97
       vars, Cl, sig, pc+1)#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    98
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    99
 "exec_instr Swap G hp stk vars Cl sig pc frs =
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   100
  (let (val1,val2) = (hd stk,hd (tl stk))
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   101
   in
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
   102
      (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   103
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   104
 "exec_instr IAdd G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   105
  (let (val1,val2) = (hd stk,hd (tl stk))
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   106
   in
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
   107
      (None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)), 
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
   108
       vars, Cl, sig, pc+1)#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   109
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   110
 "exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs =
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   111
  (let (val1,val2) = (hd stk, hd (tl stk));
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   112
     pc' = if val1 = val2 then nat(int pc+i) else pc+1
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   113
   in
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
   114
      (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   115
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   116
 "exec_instr (Goto i) G hp stk vars Cl sig pc frs =
39758
b8a53e3a0ee2 modernized primrecs
haftmann
parents: 28524
diff changeset
   117
      (None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)" |
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   118
12519
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   119
 "exec_instr Throw G hp stk vars Cl sig pc frs =
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   120
  (let xcpt  = raise_system_xcpt (hd stk = Null) NullPointer;
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   121
       xcpt' = if xcpt = None then Some (hd stk) else xcpt
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   122
   in
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   123
      (xcpt', hp, (stk, vars, Cl, sig, pc)#frs))"
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   124
a955fe2879ba exception merge + cleanup
kleing
parents: 10920
diff changeset
   125
end