9791
|
1 |
(* Title: HOL/BCV/JVM.thy
|
|
2 |
ID: $Id$
|
|
3 |
Author: Tobias Nipkow
|
|
4 |
Copyright 2000 TUM
|
|
5 |
|
|
6 |
A micro-JVM
|
|
7 |
*)
|
|
8 |
|
|
9 |
JVM = Kildall + JType + Opt + Product +
|
|
10 |
|
|
11 |
types mname
|
|
12 |
arities mname :: term
|
|
13 |
|
|
14 |
datatype instr =
|
|
15 |
Load nat | Store nat | AConst_Null | IConst int
|
|
16 |
| IAdd | Getfield ty cname | Putfield ty cname
|
|
17 |
| New cname
|
|
18 |
| Invoke cname mname ty ty
|
|
19 |
| CmpEq nat
|
|
20 |
| Return
|
|
21 |
|
|
22 |
types mdict = "cname => (mname * ty ~=> ty)"
|
|
23 |
|
|
24 |
constdefs
|
|
25 |
wfi :: subclass => mdict => nat => instr => bool
|
|
26 |
"wfi S md maxr i == case i of
|
|
27 |
Load n => n < maxr
|
|
28 |
| Store n => n < maxr
|
|
29 |
| AConst_Null => True
|
|
30 |
| IConst j => True
|
|
31 |
| IAdd => True
|
|
32 |
| Getfield T C => is_type S T & is_type S (Class C)
|
|
33 |
| Putfield T C => is_type S T & is_type S (Class C)
|
|
34 |
| New C => is_type S (Class C)
|
|
35 |
| Invoke C m pT rT => md C (m,pT) = Some(rT)
|
|
36 |
| CmpEq n => True
|
|
37 |
| Return => True"
|
|
38 |
|
|
39 |
wfis :: subclass => mdict => nat => instr list => bool
|
|
40 |
"wfis S md maxr ins == !i : set ins. wfi S md maxr i"
|
|
41 |
|
|
42 |
types config = "ty list * ty err list"
|
|
43 |
state = config err option
|
|
44 |
|
|
45 |
constdefs
|
|
46 |
stk_esl :: subclass => nat => ty list esl
|
|
47 |
"stk_esl S maxs == upto_esl maxs (JType.esl S)"
|
|
48 |
|
|
49 |
reg_sl :: subclass => nat => ty err list sl
|
|
50 |
"reg_sl S maxr == Listn.sl maxr (Err.sl (JType.esl S))"
|
|
51 |
|
|
52 |
sl :: subclass => nat => nat => state sl
|
|
53 |
"sl S maxs maxr ==
|
|
54 |
Opt.sl(Err.sl(Product.esl (stk_esl S maxs) (Err.esl(reg_sl S maxr))))"
|
|
55 |
|
|
56 |
states :: subclass => nat => nat => state set
|
|
57 |
"states S maxs maxr == fst(sl S maxs maxr)"
|
|
58 |
|
|
59 |
le :: subclass => nat => nat => state ord
|
|
60 |
"le S maxs maxr == fst(snd(sl S maxs maxr))"
|
|
61 |
|
|
62 |
sup :: subclass => nat => nat => state binop
|
|
63 |
"sup S maxs maxr == snd(snd(sl S maxs maxr))"
|
|
64 |
|
|
65 |
syntax "@lle" :: state => subclass => state => bool
|
|
66 |
("(_ /<<='__ _)" [50, 1000, 51] 50)
|
|
67 |
|
|
68 |
translations
|
|
69 |
"x <<=_S y" => "x <=_(le S arbitrary arbitrary) y"
|
|
70 |
|
|
71 |
constdefs
|
|
72 |
|
|
73 |
wf_mdict :: subclass => mdict => bool
|
|
74 |
"wf_mdict S md ==
|
|
75 |
!C mpT rT. md C mpT = Some(rT)
|
|
76 |
--> is_type S rT &
|
|
77 |
(!C'. (C',C) : S^*
|
|
78 |
--> (EX rT'. md C' mpT = Some(rT') & rT' [=_S rT))"
|
|
79 |
|
|
80 |
wti :: subclass => nat => ty => instr list => state list => nat => bool
|
|
81 |
"wti S maxs rT bs ss p ==
|
|
82 |
case ss!p of
|
|
83 |
None => True
|
|
84 |
| Some e =>
|
|
85 |
(case e of
|
|
86 |
Err => False
|
|
87 |
| OK (st,reg) =>
|
|
88 |
(case bs!p of
|
|
89 |
Load n => size st < maxs &
|
|
90 |
(? T. reg!n = OK T & Some(OK(T#st,reg)) <<=_S ss!(p+1))
|
|
91 |
| Store n => (? T Ts. st = T#Ts & Some(OK(Ts,reg[n := OK T])) <<=_S ss!(p+1))
|
|
92 |
| AConst_Null => size st < maxs & Some(OK(NullT#st,reg)) <<=_S ss!(p+1)
|
|
93 |
| IConst i => size st < maxs & Some(OK(Integer#st,reg)) <<=_S ss!(p+1)
|
|
94 |
| IAdd => (? Ts. st = Integer#Integer#Ts &
|
|
95 |
Some(OK(Integer#Ts,reg)) <<=_S ss!(p+1))
|
|
96 |
| Getfield fT C => (? T Ts. st = T#Ts & T [=_S Class(C) &
|
|
97 |
Some(OK(fT#Ts,reg)) <<=_S ss!(p+1))
|
|
98 |
| Putfield fT C => (? vT oT Ts. st = vT#oT#Ts & vT [=_S fT & oT [=_S Class C &
|
|
99 |
Some(OK(Ts,reg)) <<=_S ss!(p+1))
|
|
100 |
| New C => (size st < maxs & Some(OK((Class C)#st,reg)) <<=_S ss!(p+1))
|
|
101 |
| Invoke C m pT rT =>
|
|
102 |
(? aT oT Ts. st = aT#oT#Ts & oT [=_S Class C & aT [=_S pT &
|
|
103 |
Some(OK(rT#Ts,reg)) <<=_S ss!(p+1))
|
|
104 |
| CmpEq q => (? T1 T2 Ts. st = T1#T2#Ts & (T1=T2 | is_ref T1 & is_ref T2) &
|
|
105 |
Some(OK(Ts,reg)) <<=_S ss!(p+1) &
|
|
106 |
Some(OK(Ts,reg)) <<=_S ss!q)
|
|
107 |
| Return => (? T Ts. st = T#Ts & T [=_S rT)))"
|
|
108 |
|
|
109 |
succs :: "instr list => nat => nat list"
|
|
110 |
"succs bs p ==
|
|
111 |
case bs!p of
|
|
112 |
Load n => [p+1]
|
|
113 |
| Store n => [p+1]
|
|
114 |
| AConst_Null => [p+1]
|
|
115 |
| IConst i => [p+1]
|
|
116 |
| IAdd => [p+1]
|
|
117 |
| Getfield x C => [p+1]
|
|
118 |
| Putfield x C => [p+1]
|
|
119 |
| New C => [p+1]
|
|
120 |
| Invoke C m pT rT => [p+1]
|
|
121 |
| CmpEq q => [p+1,q]
|
|
122 |
| Return => [p]"
|
|
123 |
|
|
124 |
exec :: "subclass => nat => ty => instr => config => config err"
|
|
125 |
"exec S maxs rT instr == %(st,reg).
|
|
126 |
case instr of
|
|
127 |
Load n => if size st < maxs
|
|
128 |
then case reg!n of Err => Err | OK T => OK(T#st,reg)
|
|
129 |
else Err
|
|
130 |
| Store n => (case st of [] => Err | T#Ts => OK(Ts,reg[n := OK T]))
|
|
131 |
| AConst_Null => if size st < maxs then OK(NullT#st,reg) else Err
|
|
132 |
| IConst i => if size st < maxs then OK(Integer#st,reg) else Err
|
|
133 |
| IAdd =>
|
|
134 |
(case st of [] => Err | T1#st1 =>
|
|
135 |
(case st1 of [] => Err | T2#st2 =>
|
|
136 |
if T1 = Integer & T2 = Integer then OK(st1,reg) else Err))
|
|
137 |
| Getfield fT C =>
|
|
138 |
(case st of [] => Err | oT#st' =>
|
|
139 |
(if oT [=_S Class(C) then OK(fT#st',reg) else Err))
|
|
140 |
| Putfield fT C =>
|
|
141 |
(case st of [] => Err | vT#st1 =>
|
|
142 |
(case st1 of [] => Err | oT#st2 =>
|
|
143 |
if vT [=_S fT & oT [=_S Class C then OK(st2,reg) else Err))
|
|
144 |
| New C => if size st < maxs then OK((Class C)#st,reg) else Err
|
|
145 |
| Invoke C m pT rT =>
|
|
146 |
(case st of [] => Err | aT#st1 =>
|
|
147 |
(case st1 of [] => Err | oT#st2 =>
|
|
148 |
if oT [=_S Class C & aT [=_S pT then OK(rT#st2,reg) else Err))
|
|
149 |
| CmpEq q =>
|
|
150 |
(case st of [] => Err | T1#st1 =>
|
|
151 |
(case st1 of [] => Err | T2#st2 =>
|
|
152 |
if T1=T2 | is_ref T1 & is_ref T2 then OK(st2,reg) else Err))
|
|
153 |
| Return =>
|
|
154 |
(case st of [] => Err | T#Ts =>
|
|
155 |
if T [=_S rT then OK(st,reg) else Err)"
|
|
156 |
|
|
157 |
step :: "subclass => nat => ty => instr list => nat => state => state"
|
|
158 |
"step S maxs rT bs p == option_map (lift (exec S maxs rT (bs!p)))"
|
|
159 |
|
|
160 |
kiljvm ::
|
|
161 |
"subclass => nat => nat => ty => instr list => state list => state list"
|
|
162 |
"kiljvm S maxs maxr rT bs ==
|
|
163 |
kildall (sl S maxs maxr) (step S maxs rT bs) (succs bs)"
|
|
164 |
|
|
165 |
end
|