Classfile.thy
Back to the index of JVM0_ASCII
Classfile = Cpool + Store + WF_Rel +
types
iflag = bool
this = cl_idx
super = cl_idx
inter = "cl_idx list"
(** fields/methods p.101 **)
'code method_info = "nm_idx *
nm_idx *
'code" (* only one m_attribute *)
field_info = "nm_idx *
nm_idx"
(****************** classFile p.84 ******************)
fields = field_info list (* field descriptions *)
'code methods = ('code method_info) list (* method descriptions *)
'code classfile = "cpool *
iflag *
this *
super *
inter *
fields *
'code methods"
(** constant pool **)
(** is it an interface? **)
(** idx to Class entry with current class **)
(** idx to Class entry with direct superclass **)
(** idxes to Class entries with direct superinterfaces **)
(** fields **)
(** methods **)
constdefs
get_cpool :: "'code classfile => cpool"
"get_cpool == %(cp,a,t,s,is,fs,ms). cp"
is_interface :: "'code classfile => bool"
"is_interface == %(cp,a,t,s,is,fs,ms). a"
get_thisclass :: "'code classfile => cname"
"get_thisclass == %(cp,a,t,s,is,fs,ms). get_Id (extract_Class cp t)"
get_superclass :: "'code classfile => cname"
"get_superclass == %(cp,a,t,s,is,fs,ms). get_Id (extract_Class cp s)"
get_superinterfaces :: "'code classfile => cname set"
"get_superinterfaces == %(cp,a,t,s,is,fs,ms). set (map (get_Id o (extract_Class cp)) is)"
get_methods :: "'code classfile => (method_loc ~=> return_desc * 'code)"
"get_methods == %(cp,a,t,s,is,fs,ms).
map_of (map (%(mn,md,ins). let (pd,rd) = get_Md (get_Utf8 (cp ! md))
in
((get_Id (get_Utf8 (cp ! mn)), pd) , (rd,ins)))
ms)"
get_fields :: "'code classfile => (field_loc ~=> field_desc)"
"get_fields == %(cp,a,t,s,is,fs,ms).
map_of (map (%(fn,fd). ((get_Id (extract_Class cp t), get_Id (get_Utf8 (cp ! fn))),
get_Fd (get_Utf8 (cp ! fd))))
fs)"
(** is it class Object ? **)
no_super :: "'code classfile => bool"
"no_super == %(cp,a,t,s,is,fs,ms). s=0"
types
'code classfiles = "cname ~=> 'code classfile"
constdefs
(** get code of current method **)
get_code :: "['code classfiles,cname,method_loc] => 'code"
"get_code CFS cn ml == let (rd,code) = ((get_methods (CFS !! cn)) !! ml) in code"
is_class :: "['code classfiles,cname] => bool"
"is_class CFS cn == CFS cn ~= None & ~ is_interface (CFS !! cn)"
d_superclass_rel :: "'code classfiles => (cname * cname) set"
"d_superclass_rel CFS == {(sc,cn). is_class CFS sc & is_class CFS cn &
cn~=Object &
get_superclass (CFS !! cn) = sc}"
is_inter :: "['code classfiles,cname] => bool"
"is_inter CFS cn == CFS cn ~= None & is_interface (CFS !! cn)"
d_superinterface_rel :: "'code classfiles => (cname * cname) set"
"d_superinterface_rel CFS == {(si,i). is_inter CFS si & is_inter CFS i &
si : (get_superinterfaces (CFS !! i))}"
d_implements :: "['code classfiles,cname,cname] => bool"
"d_implements CFS cn i == is_class CFS cn & is_inter CFS i &
i : (get_superinterfaces (CFS !! cn))"
constdefs
implements_term_rel :: "(('code classfiles * cname * cname) *
('code classfiles * cname * cname)) set"
"implements_term_rel == {((CFS,sc,i),(CFS',cn,i')).
CFS=CFS' & i=i' & wf (d_superclass_rel CFS) &
(sc,cn) : d_superclass_rel CFS}"
consts
implements :: "'code classfiles * cname * cname => bool"
recdef implements "implements_term_rel" congs "[conj_cong]"
"implements (CFS, cn, si) =
(if wf (d_superclass_rel CFS)
then (d_implements CFS cn si) |
(? si'. d_implements CFS cn si' &
(si,si') : (d_superinterface_rel CFS)^+) |
(? sc. (sc,cn) : d_superclass_rel CFS &
implements (CFS, sc, si))
else arbitrary)"
end