src/HOL/MicroJava/JVM/Object.thy
author oheimb
Fri, 14 Jul 2000 16:32:51 +0200
changeset 9346 297dcbf64526
parent 8038 a13c3b80d3d4
child 9348 f495dba0cb07
permissions -rw-r--r--
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/JVM/Object.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
Get and putfield instructions
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
Object = JVMState +
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
 create_object = New cname
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    13
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    14
consts
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    15
 exec_co :: "[create_object,'code prog,aheap,opstack,p_count] \\<Rightarrow> 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    16
		(xcpt option \\<times> aheap \\<times> opstack \\<times> p_count)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    17
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    18
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    19
primrec
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    20
  "exec_co (New C) G hp stk pc = 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    21
	(let xp'	= raise_xcpt (\\<forall>x. hp x \\<noteq> None) OutOfMemory;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    22
	     oref	= newref hp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    23
             fs		= init_vars (fields(G,C));
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8011
diff changeset
    24
	     hp'	= if xp'=None then hp(oref \\<mapsto> (C,fs)) else hp;
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8011
diff changeset
    25
	     stk'	= if xp'=None then (Addr oref)#stk else stk
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    26
	 in (xp' , hp' , stk' , pc+1))"	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    27
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    28
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    29
datatype
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    30
 manipulate_object = 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    31
   Getfield vname cname		(* Fetch field from object *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    32
 | Putfield vname cname		(* Set field in object     *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    33
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    34
consts
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    35
 exec_mo :: "[manipulate_object,aheap,opstack,p_count] \\<Rightarrow> 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    36
		(xcpt option \\<times> aheap \\<times> opstack \\<times> p_count)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    37
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    38
primrec
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    39
 "exec_mo (Getfield F C) hp stk pc = 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    40
	(let oref	= hd stk;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    41
	     xp'	= raise_xcpt (oref=Null) NullPointer;
8038
a13c3b80d3d4 Removed !!
nipkow
parents: 8034
diff changeset
    42
	     (oc,fs)	= the(hp(the_Addr oref));
a13c3b80d3d4 Removed !!
nipkow
parents: 8034
diff changeset
    43
	     stk'	= if xp'=None then the(fs(F,C))#(tl stk) else tl stk
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    44
	 in
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    45
         (xp' , hp , stk' , pc+1))"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    46
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    47
 "exec_mo (Putfield F C) hp stk pc = 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    48
	(let (fval,oref)= (hd stk, hd(tl stk));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    49
	     xp'	= raise_xcpt (oref=Null) NullPointer;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    50
	     a		= the_Addr oref;
8038
a13c3b80d3d4 Removed !!
nipkow
parents: 8034
diff changeset
    51
	     (oc,fs)	= the(hp a);
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8011
diff changeset
    52
	     hp'	= if xp'=None then hp(a \\<mapsto> (oc, fs((F,C) \\<mapsto> fval))) else hp
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    53
	 in
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    54
         (xp' , hp' , tl (tl stk), pc+1))"				
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    55
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    56
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    57
datatype
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    58
 check_object =
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    59
    Checkcast cname	(* Check whether object is of given type *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    60
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    61
consts
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    62
 exec_ch :: "[check_object,'code prog,aheap,opstack,p_count] 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    63
		\\<Rightarrow> (xcpt option \\<times> opstack \\<times> p_count)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    64
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    65
primrec
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    66
  "exec_ch (Checkcast C) G hp stk pc =
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    67
	(let oref	= hd stk;
9346
297dcbf64526 re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents: 8038
diff changeset
    68
	     xp'	= raise_xcpt (\\<not> cast_ok G (ClassT C) hp oref) ClassCast;
8034
6fc37b5c5e98 Various little changes like cmethd -> method and cfield -> field.
nipkow
parents: 8011
diff changeset
    69
	     stk'	= if xp'=None then stk else tl stk
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    70
	 in
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    71
	 (xp' , stk' , pc+1))"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    72
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    73
end