src/HOL/MicroJava/JVM/JVMExec.thy
author nipkow
Wed, 01 Dec 1999 18:22:28 +0100
changeset 8045 816f566c414f
parent 8034 6fc37b5c5e98
child 9376 c32c5696ec2a
permissions -rw-r--r--
Fixed a problem with returning from the last frame.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/JVM/JVMExec.thy
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     2
    ID:         $Id$
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     3
    Author:     Cornelia Pusch
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     4
    Copyright   1999 Technische Universitaet Muenchen
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     5
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     6
Execution of the JVM
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     7
*)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     8
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     9
JVMExec = LoadAndStore + Object + Method + Opstack + Control + 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    10
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    11
datatype
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    12
 instr	= LS load_and_store	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    13
        | CO create_object	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    14
        | MO manipulate_object	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    15
	| CH check_object	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    16
	| MI meth_inv		
8032
1eaae1a2f8ff Minor mods.
nipkow
parents: 8011
diff changeset
    17
	| MR meth_ret
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    18
	| OS op_stack		
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    19
	| BR branch
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    20
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    21
types
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    22
 bytecode = instr list
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    23
 jvm_prog = "(nat \\<times> bytecode)prog"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    24
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    25
consts
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    26
 exec :: "jvm_prog \\<times> jvm_state \\<Rightarrow> jvm_state option"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    27
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    28
(** exec is not recursive. recdef is just used because for pattern matching **)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    29
recdef exec "{}"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    30
 "exec (G, xp, hp, []) = None"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    31
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    32
 "exec (G, None, hp, (stk,loc,C,sig,pc)#frs) =
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    33
   Some (case snd(snd(snd(the(method (G,C) sig)))) ! pc of
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    34
      LS ins \\<Rightarrow> let (stk',loc',pc') = exec_las ins stk loc pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    35
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    36
		(None,hp,(stk',loc',C,sig,pc')#frs)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    37
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    38
    | CO ins \\<Rightarrow> let (xp',hp',stk',pc') = exec_co ins G hp stk pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    39
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    40
		(xp',hp',(stk',loc,C,sig,pc')#frs)	    
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    41
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    42
    | MO ins \\<Rightarrow> let (xp',hp',stk',pc') = exec_mo ins hp stk pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    43
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    44
		(xp',hp',(stk',loc,C,sig,pc')#frs)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    45
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    46
    | CH ins \\<Rightarrow> let (xp',stk',pc') = exec_ch ins G hp stk pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    47
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    48
		(xp',hp,(stk',loc,C,sig,pc')#frs)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    49
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    50
    | MI ins \\<Rightarrow> let (xp',frs',stk',pc') = exec_mi ins G hp stk pc 
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    51
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    52
		(xp',hp,frs'@(stk',loc,C,sig,pc')#frs)
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    53
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    54
    | MR ins \\<Rightarrow> let frs' = exec_mr ins stk frs in (None,hp,frs')
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    55
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    56
    | OS ins \\<Rightarrow> let (stk',pc') = exec_os ins stk pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    57
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    58
		(None,hp,(stk',loc,C,sig,pc')#frs)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    59
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8032
diff changeset
    60
    | BR ins \\<Rightarrow> let (stk',pc') = exec_br ins stk pc
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    61
		in
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    62
		(None,hp,(stk',loc,C,sig,pc')#frs))"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    63
8045
816f566c414f Fixed a problem with returning from the last frame.
nipkow
parents: 8034
diff changeset
    64
 "exec (G, Some xp, hp, frs) = None"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    65
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    66
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    67
constdefs
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    68
 exec_all :: "[jvm_prog,jvm_state,jvm_state] \\<Rightarrow> bool"  ("_ \\<turnstile> _ -jvm\\<rightarrow> _" [61,61,61]60)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    69
 "G \\<turnstile> s -jvm\\<rightarrow> t \\<equiv> (s,t) \\<in> {(s,t). exec(G,s) = Some t}^*"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    70
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    71
end