Theory JVMListExample

Up to index of Isabelle/HOL/Jinja

theory JVMListExample
imports SystemClasses JVMExec Code_Target_Numeral
(*  Title:      Jinja/JVM/JVMListExample.thy
Author: Stefan Berghofer, Gerwin Klein
*)


header {* \isaheader{Example for generating executable code from JVM semantics}\label{sec:JVMListExample} *}

theory JVMListExample
imports
"../Common/SystemClasses"
JVMExec
"~~/src/HOL/Library/Code_Target_Numeral"
begin

definition list_name :: string
where
"list_name == ''list''"

definition test_name :: string
where
"test_name == ''test''"

definition val_name :: string
where
"val_name == ''val''"

definition next_name :: string
where
"next_name == ''next''"

definition append_name :: string
where
"append_name == ''append''"

definition makelist_name :: string
where
"makelist_name == ''makelist''"

definition append_ins :: bytecode
where
"append_ins ==
[Load 0,
Getfield next_name list_name,
Load 0,
Getfield next_name list_name,
Push Null,
CmpEq,
IfFalse 7,
Pop,
Load 0,
Load 1,
Putfield next_name list_name,
Push Unit,
Return,
Load 1,
Invoke append_name 1,
Return]"


definition list_class :: "jvm_method class"
where
"list_class ==
(Object,
[(val_name, Integer), (next_name, Class list_name)],
[(append_name, [Class list_name], Void,
(3, 0, append_ins, [(1, 2, NullPointer, 7, 0)]))])"


definition make_list_ins :: bytecode
where
"make_list_ins ==
[New list_name,
Store 0,
Load 0,
Push (Intg 1),
Putfield val_name list_name,
New list_name,
Store 1,
Load 1,
Push (Intg 2),
Putfield val_name list_name,
New list_name,
Store 2,
Load 2,
Push (Intg 3),
Putfield val_name list_name,
Load 0,
Load 1,
Invoke append_name 1,
Pop,
Load 0,
Load 2,
Invoke append_name 1,
Return]"


definition test_class :: "jvm_method class"
where
"test_class ==
(Object, [],
[(makelist_name, [], Void, (3, 2, make_list_ins, []))])"


definition E :: jvm_prog
where
"E == SystemClasses @ [(list_name, list_class), (test_name, test_class)]"

definition undefined_cname :: cname
where [code del]: "undefined_cname = undefined"
declare undefined_cname_def[symmetric, code_unfold]
code_const undefined_cname
(SML "object")

definition undefined_val :: val
where [code del]: "undefined_val = undefined"
declare undefined_val_def[symmetric, code_unfold]
code_const undefined_val
(SML "Unit")

lemmas [code_unfold] = SystemClasses_def [unfolded ObjectC_def NullPointerC_def ClassCastC_def OutOfMemoryC_def]

definition "test = exec (E, start_state E test_name makelist_name)"

ML_val {*
@{code test};
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);
@{code exec} (@{code E}, @{code the} it);

val SOME (_, (h, _)) = it;
if snd (@{code the} (h (@{code nat_of_integer} 3))) (@{code val_name}, @{code list_name}) =
SOME (@{code Intg} (@{code int_of_integer} 1)) then () else error "wrong result";
if snd (@{code the} (h (@{code nat_of_integer} 3))) (@{code next_name}, @{code list_name}) =
SOME (@{code Addr} (@{code nat_of_integer} 4)) then () else error "wrong result";
if snd (@{code the} (h (@{code nat_of_integer} 4))) (@{code val_name}, @{code list_name}) =
SOME (@{code Intg} (@{code int_of_integer} 2)) then () else error "wrong result";
if snd (@{code the} (h (@{code nat_of_integer} 4))) (@{code next_name}, @{code list_name}) =
SOME (@{code Addr} (@{code nat_of_integer} 5)) then () else error "wrong result";
if snd (@{code the} (h (@{code nat_of_integer} 5))) (@{code val_name}, @{code list_name}) =
SOME (@{code Intg} (@{code int_of_integer} 3)) then () else error "wrong result";
if snd (@{code the} (h (@{code nat_of_integer} 5))) (@{code next_name}, @{code list_name}) =
SOME @{code Null} then () else error "wrong result";
*}


end