@@ -293,15 +293,47 @@ Lemma superstore_object_locs_exist :
293
293
object_locs_exist st obj ->
294
294
object_locs_exist st2 obj
295
295
.
296
- Admitted .
296
+ Proof .
297
+ intros st st2 obj superstore_st_st2.
298
+ unfold object_locs_exist.
299
+ intros H prot cl ext primval props code obj_def.
300
+ edestruct H as (H_prot, (H_primval, (H_code, H_props))).
301
+ apply obj_def.
302
+
303
+ split.
304
+ unfold superstore in superstore_st_st2.
305
+ apply superstore_st_st2.
306
+ assumption.
307
+
308
+ split.
309
+ apply superstore_ok_loc_option with st;
310
+ assumption.
311
+
312
+ split.
313
+ apply superstore_ok_loc_option with st;
314
+ assumption.
315
+
316
+ apply superstore_props_locs_exist with st;
317
+ assumption.
318
+ Qed .
297
319
298
320
Lemma superstore_result_value_loc_exists :
299
321
forall st st2 res,
300
322
superstore st st2 ->
301
323
result_value_loc_exists ok_loc st res ->
302
324
result_value_loc_exists ok_loc st2 res
303
325
.
304
- Admitted .
326
+ Proof .
327
+ intros st st2 res superstore_st_st2.
328
+ destruct res as [v|exc|b|f]; intro H; (* TODO: no auto-naming for break value. *)
329
+ try apply result_value_loc_exists_return;
330
+ try apply result_value_loc_exists_exception;
331
+ try apply result_value_loc_exists_break;
332
+ try apply result_value_loc_exists_fail;
333
+ apply superstore_st_st2;
334
+ inversion H;
335
+ assumption.
336
+ Qed .
305
337
306
338
Lemma fresh_loc_preserves_ok_loc :
307
339
forall obj_heap val_heap loc_heap fresh_locs loc n,
@@ -716,20 +748,25 @@ Proof.
716
748
Qed .
717
749
718
750
Lemma obj_write_makes_superstore :
719
- forall obj_heap val_heap loc_heap fresh_locs ptr obj2 ,
751
+ forall obj_heap val_heap loc_heap fresh_locs ptr obj ,
720
752
superstore
721
753
{|
722
754
object_heap := obj_heap;
723
755
value_heap := val_heap;
724
756
loc_heap := loc_heap;
725
757
fresh_locations := fresh_locs |}
726
758
{|
727
- object_heap := Store.Heap .write obj_heap ptr obj2 ;
759
+ object_heap := Store.Heap .write obj_heap ptr obj ;
728
760
value_heap := val_heap;
729
761
loc_heap := loc_heap;
730
762
fresh_locations := fresh_locs |}
731
763
.
732
- Admitted .
764
+ Proof .
765
+ unfold superstore.
766
+ unfold ok_loc.
767
+ simpl.
768
+ trivial.
769
+ Qed .
733
770
734
771
Lemma obj_write_preserves_all_locs_exist :
735
772
forall obj_heap val_heap loc_heap fresh_locs ptr obj,
@@ -751,7 +788,64 @@ Lemma obj_write_preserves_all_locs_exist :
751
788
loc_heap := loc_heap;
752
789
fresh_locations := fresh_locs |}
753
790
.
754
- Admitted .
791
+ Proof .
792
+ unfold all_locs_exist.
793
+ unfold all_locs_in_loc_heap_exist.
794
+ unfold all_locs_in_obj_heap_exist.
795
+ simpl.
796
+ intros obj_heap val_heap loc_heap fresh_locs ptr0 obj0 obj_cstt H.
797
+ assert (H_superstore: superstore
798
+ {|
799
+ object_heap := obj_heap;
800
+ value_heap := val_heap;
801
+ loc_heap := loc_heap;
802
+ fresh_locations := fresh_locs |}
803
+ {|
804
+ object_heap := Store.Heap.write obj_heap ptr0 obj0;
805
+ value_heap := val_heap;
806
+ loc_heap := loc_heap;
807
+ fresh_locations := fresh_locs |}).
808
+ apply obj_write_makes_superstore.
809
+
810
+ split.
811
+ apply H.
812
+
813
+ intros ptr obj binds_ptr_obj.
814
+ assert (H_eq: (ptr=ptr0 /\ obj=obj0) \/ (ptr<>ptr0 /\ Heap.binds obj_heap ptr obj)).
815
+ apply Heap.binds_write_inv.
816
+ apply binds_ptr_obj.
817
+
818
+ destruct H_eq as [(ptr_eq,obj_eq)|(ptr_neq,binds'_ptr_obj)].
819
+ unfold object_locs_exist.
820
+ rewrite obj_eq.
821
+ unfold object_locs_exist in obj_cstt.
822
+ intros proto_loc class ext primval props code obj0_def.
823
+ split.
824
+ unfold superstore in H_superstore.
825
+ apply H_superstore.
826
+ apply (obj_cstt proto_loc class ext primval props code obj0_def).
827
+
828
+ split.
829
+ eapply superstore_ok_loc_option.
830
+ apply H_superstore.
831
+ apply (obj_cstt proto_loc class ext primval props code obj0_def).
832
+
833
+ split.
834
+ eapply superstore_ok_loc_option.
835
+ apply H_superstore.
836
+ apply (obj_cstt proto_loc class ext primval props code obj0_def).
837
+
838
+ eapply superstore_props_locs_exist.
839
+ apply H_superstore.
840
+ apply (obj_cstt proto_loc class ext primval props code obj0_def).
841
+
842
+ eapply superstore_object_locs_exist.
843
+ apply H_superstore.
844
+
845
+ destruct H as (H1, H2).
846
+ apply H2 with ptr.
847
+ apply binds'_ptr_obj.
848
+ Qed .
755
849
756
850
Lemma prop_write_preserves_object_locs_exist :
757
851
forall st fieldname prop proto class extensible prim_value props code,
@@ -773,15 +867,60 @@ Lemma prop_write_preserves_object_locs_exist :
773
867
object_properties_ := Store.Heap .write props fieldname prop;
774
868
object_code := code |}
775
869
.
776
- Admitted .
870
+ Proof .
871
+ intros st fieldname prop proto class ext primval props code prop_cstt.
872
+ unfold object_locs_exist.
873
+ intros H.
874
+ intros proto' class' ext' primval' props' code'.
875
+ intros H'.
876
+ inversion H' as [(proto_eq, class_eq, ext_eq, primval_eq, props_def, code_eq)].
877
+ rewrite <-proto_eq.
878
+ rewrite <-primval_eq.
879
+ rewrite <-code_eq.
880
+ split.
881
+ apply (H proto class ext primval props code).
882
+ reflexivity.
883
+
884
+ split.
885
+ apply (H proto class ext primval props code).
886
+ reflexivity.
887
+
888
+ split.
889
+ apply (H proto class ext primval props code).
890
+ reflexivity.
891
+
892
+ unfold props_locs_exist.
893
+ unfold props_locs_exist in H.
894
+ intros name attrs binds_k_v.
895
+ assert (H_eq: (name=fieldname /\ attrs=prop) \/ (name<>fieldname /\ Heap.binds props name attrs)).
896
+ apply Heap.binds_write_inv.
897
+ apply binds_k_v.
898
+ destruct H_eq as [(name_eq,attrs_eq)|(name_neq,binds'_name_attrs)].
899
+ rewrite attrs_eq.
900
+ apply prop_cstt.
901
+
902
+ destruct (H proto class ext primval props code) as (_, (_, (_, H''))).
903
+ reflexivity.
904
+ apply H'' with name.
905
+ apply binds'_name_attrs.
906
+ Qed .
777
907
778
908
Lemma get_object_preserves_all_locs_exist :
779
909
forall st ptr obj,
780
910
all_locs_exist st ->
781
911
get_object st ptr = Some obj ->
782
912
object_locs_exist st obj
783
913
.
784
- Admitted .
914
+ Proof .
915
+ intros st ptr obj st_cstt obj_def.
916
+ unfold all_locs_exist in st_cstt.
917
+ unfold all_locs_in_obj_heap_exist in st_cstt.
918
+ destruct st_cstt as (_, obj_cstt).
919
+ apply obj_cstt with ptr.
920
+ unfold get_object in obj_def.
921
+ rewrite Heap.binds_equiv_read_option.
922
+ apply obj_def.
923
+ Qed .
785
924
786
925
Lemma update_object_preserves_all_locs_exist :
787
926
forall st ptr pred st2 res2,
0 commit comments