src/HOL/MicroJava/JVM/JVMExecInstr.thy
author kleing
Thu, 21 Sep 2000 19:25:57 +0200
changeset 10056 9f84ffa4a8d0
parent 10042 7164dc0d24d8
child 10057 8c8d2d0d3ef8
permissions -rw-r--r--
tuned spacing for document generation
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
    ID:         $Id$
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     3
    Author:     Cornelia Pusch, Gerwin Klein
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     4
    Copyright   1999 Technische Universitaet Muenchen
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     5
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     6
Semantics of JVM instructions
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     7
*)
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     8
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
     9
JVMExecInstr = JVMInstructions + JVMState +
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    10
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    11
consts
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    12
  exec_instr :: "[instr, jvm_prog, aheap, opstack, locvars, 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    13
                  cname, sig, p_count, frame list] => jvm_state"
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    14
primrec
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    15
 "exec_instr (Load idx) G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    16
      (None, hp, ((vars ! idx) # stk, vars, Cl, sig, pc+1)#frs)"
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 = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    19
      (None, hp, (tl stk, vars[idx:=hd stk], Cl, sig, pc+1)#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    20
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    21
 "exec_instr (Bipush ival) G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    22
      (None, hp, (Intg ival # stk, vars, Cl, sig, pc+1)#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    23
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    24
 "exec_instr Aconst_null G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    25
      (None, hp, (Null # stk, vars, Cl, sig, pc+1)#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    26
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    27
 "exec_instr (New C) G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    28
	(let xp'	= raise_xcpt (\\<forall>x. hp x \\<noteq> None) OutOfMemory;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    29
	     oref	= newref hp;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    30
             fs		= init_vars (fields(G,C));
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    31
	     hp'	= if xp'=None then hp(oref \\<mapsto> (C,fs)) else hp;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    32
	     stk'	= if xp'=None then (Addr oref)#stk else stk
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    33
	 in 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    34
      (xp', hp', (stk', vars, Cl, sig, pc+1)#frs))"	
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    35
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    36
 "exec_instr (Getfield F C) G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    37
	(let oref	= hd stk;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    38
	     xp'	= raise_xcpt (oref=Null) NullPointer;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    39
	     (oc,fs)	= the(hp(the_Addr oref));
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    40
	     stk'	= if xp'=None then the(fs(F,C))#(tl stk) else tl stk
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    41
	 in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    42
      (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    43
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    44
 "exec_instr (Putfield F C) G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    45
	(let (fval,oref)= (hd stk, hd(tl stk));
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    46
	     xp'	= raise_xcpt (oref=Null) NullPointer;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    47
	     a		= the_Addr oref;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    48
	     (oc,fs)	= the(hp a);
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    49
	     hp'	= if xp'=None then hp(a \\<mapsto> (oc, fs((F,C) \\<mapsto> fval))) else hp
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    50
	 in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    51
      (xp', hp', (tl (tl stk), vars, Cl, sig, pc+1)#frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    52
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    53
 "exec_instr (Checkcast C) G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    54
	(let oref	= hd stk;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    55
	     xp'	= raise_xcpt (\\<not> cast_ok G C hp oref) ClassCast; 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    56
	     stk'	= if xp'=None then stk else tl stk
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    57
	 in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    58
      (xp', hp, (stk', vars, Cl, sig, pc+1)#frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    59
9550
19a6d1289f5e Invoke instruction gets fully qualified method name (class+name+sig) as
kleing
parents: 9376
diff changeset
    60
 "exec_instr (Invoke C mn ps) G hp stk vars Cl sig pc frs =
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    61
	(let n		= length ps;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    62
	     argsoref	= take (n+1) stk;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    63
	     oref	= last argsoref;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    64
	     xp'	= raise_xcpt (oref=Null) NullPointer;
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    65
	     dynT	= fst(the(hp(the_Addr oref)));
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    66
	     (dc,mh,mxl,c)= the (method (G,dynT) (mn,ps));
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    67
	     frs'	= if xp'=None then 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    68
                [([],rev argsoref@replicate mxl arbitrary,dc,(mn,ps),0)]
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    69
	            else []
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    70
	 in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    71
      (xp', hp, frs'@(drop (n+1) stk, vars, Cl, sig, pc+1)#frs))"
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 =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    74
	(if frs=[] then 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    75
     (None, hp, [])
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    76
   else 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    77
     let val = hd stk0; (stk,loc,C,sig,pc) = hd frs
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    78
	 in 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    79
      (None, hp, (val#stk,loc,C,sig,pc)#tl frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    80
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    81
 "exec_instr Pop G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    82
      (None, hp, (tl stk, vars, Cl, sig, pc+1)#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    83
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    84
 "exec_instr Dup G hp stk vars Cl sig pc frs = 
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    85
      (None, hp, (hd stk # stk, vars, Cl, sig, pc+1)#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    86
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    87
 "exec_instr Dup_x1 G hp stk vars Cl sig pc frs = 
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    88
      (None, hp, (hd stk # hd (tl stk) # hd stk # (tl (tl stk)), 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    89
                  vars, Cl, sig, pc+1)#frs)"
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    90
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    91
 "exec_instr Dup_x2 G hp stk vars Cl sig pc frs = 
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    92
      (None, hp, 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    93
       (hd stk # hd (tl stk) # (hd (tl (tl stk))) # hd stk # (tl (tl (tl stk))),
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
    94
       vars, Cl, sig, pc+1)#frs)"
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    95
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    96
 "exec_instr Swap G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    97
	(let (val1,val2) = (hd stk,hd (tl stk))
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    98
   in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
    99
	    (None, hp, (val2#val1#(tl (tl stk)), vars, Cl, sig, pc+1)#frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   100
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   101
 "exec_instr IAdd G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   102
  (let (val1,val2) = (hd stk,hd (tl stk))
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   103
   in
10056
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
   104
      (None, hp, (Intg ((the_Intg val1)+(the_Intg val2))#(tl (tl stk)), 
9f84ffa4a8d0 tuned spacing for document generation
kleing
parents: 10042
diff changeset
   105
       vars, Cl, sig, pc+1)#frs))"
9376
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   106
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   107
 "exec_instr (Ifcmpeq i) G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   108
	(let (val1,val2) = (hd stk, hd (tl stk));
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   109
     pc' = if val1 = val2 then nat(int pc+i) else pc+1
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   110
	 in
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   111
	    (None, hp, (tl (tl stk), vars, Cl, sig, pc')#frs))"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   112
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   113
 "exec_instr (Goto i) G hp stk vars Cl sig pc frs =
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   114
      (None, hp, (stk, vars, Cl, sig, nat(int pc+i))#frs)"
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   115
c32c5696ec2a flat instruction set
kleing
parents:
diff changeset
   116
end