mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	BSD-2-Clause: https://github.com/jscert/jscert * JSCorrectness.v * JSInterpreterExtraction.v * JSNumber.v * JSPrettyInterm.v MIT/Expat: https://github.com/clarus/coq-atm * Computation.v * Main.v * Spec.v
		
			
				
	
	
		
			1767 lines
		
	
	
		
			83 KiB
		
	
	
	
		
			Coq
		
	
	
	
	
	
			
		
		
	
	
			1767 lines
		
	
	
		
			83 KiB
		
	
	
	
		
			Coq
		
	
	
	
	
	
| Set Implicit Arguments.
 | |
| Require Export JsSyntax JsSyntaxAux JsPreliminary.
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Implicit Types -- copied from JsPreliminary  *)
 | |
| 
 | |
| Implicit Type b : bool.
 | |
| Implicit Type n : number.
 | |
| Implicit Type k : int.
 | |
| Implicit Type s : string.
 | |
| Implicit Type i : literal.
 | |
| Implicit Type l : object_loc.
 | |
| Implicit Type w : prim.
 | |
| Implicit Type v : value.
 | |
| Implicit Type r : ref.
 | |
| (*Implicit Type B : builtin.*)
 | |
| Implicit Type ty : type.
 | |
| 
 | |
| Implicit Type rt : restype.
 | |
| Implicit Type rv : resvalue.
 | |
| Implicit Type lab : label.
 | |
| Implicit Type labs : label_set.
 | |
| Implicit Type R : res.
 | |
| Implicit Type o : out.
 | |
| 
 | |
| Implicit Type x : prop_name.
 | |
| Implicit Type str : strictness_flag.
 | |
| Implicit Type m : mutability.
 | |
| Implicit Type Ad : attributes_data.
 | |
| Implicit Type Aa : attributes_accessor.
 | |
| Implicit Type A : attributes.
 | |
| Implicit Type Desc : descriptor.
 | |
| Implicit Type D : full_descriptor.
 | |
| 
 | |
| Implicit Type L : env_loc.
 | |
| Implicit Type E : env_record.
 | |
| Implicit Type Ed : decl_env_record.
 | |
| Implicit Type X : lexical_env.
 | |
| Implicit Type O : object.
 | |
| Implicit Type S : state.
 | |
| Implicit Type C : execution_ctx.
 | |
| Implicit Type P : object_properties_type.
 | |
| 
 | |
| Implicit Type e : expr.
 | |
| Implicit Type p : prog.
 | |
| Implicit Type t : stat.
 | |
| 
 | |
| 
 | |
| (****************************************************************)
 | |
| (** ** Intermediate expression for the Pretty-Big-Step semantic *)
 | |
| 
 | |
| (** Grammar of extended expressions *)
 | |
| 
 | |
| Inductive ext_expr :=
 | |
| 
 | |
|   (** Extended expressions include expressions *)
 | |
| 
 | |
|   | expr_basic : expr -> ext_expr
 | |
| 
 | |
|   (** Extended expressions associated with primitive expressions *)
 | |
| 
 | |
|   | expr_identifier_1 : specret ref -> ext_expr
 | |
| 
 | |
|   | expr_object_0 : out -> propdefs -> ext_expr
 | |
|   | expr_object_1 : object_loc -> propdefs -> ext_expr
 | |
|   | expr_object_2 : object_loc -> string -> propbody -> propdefs -> ext_expr 
 | |
|   | expr_object_3_val : object_loc -> string -> specret value -> propdefs -> ext_expr
 | |
|   | expr_object_3_get : object_loc -> string -> out -> propdefs -> ext_expr
 | |
|   | expr_object_3_set : object_loc -> string -> out -> propdefs -> ext_expr
 | |
|   | expr_object_4 : object_loc -> string -> descriptor -> propdefs -> ext_expr
 | |
|   | expr_object_5 : object_loc -> propdefs -> out -> ext_expr
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   (* _ARRAYS_ : support for array intermediate forms *)
 | |
|   | expr_array_0 : out -> list (option expr) -> ext_expr
 | |
|   | expr_array_1 : object_loc -> list (option expr) -> ext_expr
 | |
|   | expr_array_2 : object_loc -> list (option expr) -> int -> ext_expr
 | |
|   | expr_array_3 : object_loc -> list (option expr) -> int -> ext_expr
 | |
|   | expr_array_3_1 : object_loc -> specret value -> list (option expr) -> int -> ext_expr
 | |
|   | expr_array_3_2 : object_loc -> value -> out -> list (option expr) -> int -> ext_expr
 | |
|   | expr_array_3_3 : object_loc -> value -> specret int -> list (option expr) -> int -> ext_expr
 | |
|   | expr_array_3_4 : object_loc -> value -> out -> list (option expr) -> ext_expr
 | |
|   | expr_array_3_5 : object_loc -> out -> list (option expr) -> ext_expr
 | |
| 
 | |
|   | expr_array_add_length   : object_loc -> int -> out -> ext_expr
 | |
|   | expr_array_add_length_0 : object_loc -> int -> ext_expr
 | |
|   | expr_array_add_length_1 : object_loc -> int -> out -> ext_expr
 | |
|   | expr_array_add_length_2 : object_loc -> specret int -> int -> ext_expr
 | |
|   | expr_array_add_length_3 : object_loc -> specret int -> ext_expr
 | |
|   | expr_array_add_length_4 : object_loc -> out -> ext_expr
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   | expr_function_1 : string -> list string -> funcbody -> env_loc -> lexical_env -> out -> ext_expr
 | |
|   | expr_function_2 : string -> env_loc -> out -> ext_expr
 | |
|   | expr_function_3 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   | expr_access_1 : specret value -> expr -> ext_expr (* The left expression has been executed *)
 | |
|   | expr_access_2 : value -> specret value -> ext_expr (* The right expression is executed. *)
 | |
|   | expr_access_3 : value -> out -> value -> ext_expr
 | |
|   | expr_access_4 : value -> out -> ext_expr
 | |
| 
 | |
|   | expr_new_1 : specret value -> list expr -> ext_expr (* The arguments too. *)
 | |
|   | expr_new_2 : value -> specret (list value) -> ext_expr (* The call has been executed. *)
 | |
| 
 | |
|   | expr_call_1 : out -> bool -> list expr -> ext_expr
 | |
|   | expr_call_2 : res -> bool -> list expr -> specret value -> ext_expr (* The function has been evaluated. *)
 | |
|   | expr_call_3 : res -> value -> bool -> specret (list value) -> ext_expr (* The arguments have been executed. *)
 | |
|   | expr_call_4 : res -> object_loc -> bool -> list value -> ext_expr
 | |
|   | expr_call_5 : object_loc -> bool -> list value -> out -> ext_expr (* The call has been executed. *)
 | |
| 
 | |
|   | spec_eval : bool -> value -> list value -> ext_expr
 | |
| 
 | |
|   | expr_unary_op_1 : unary_op -> (specret value) -> ext_expr (* The argument have been executed. *)
 | |
|   | expr_unary_op_2 : unary_op -> value -> ext_expr (* The argument is a value. *)
 | |
|   | expr_delete_1 : out -> ext_expr
 | |
|   | expr_delete_2 : ref -> ext_expr
 | |
|   | expr_delete_3 : ref -> out -> ext_expr
 | |
|   | expr_delete_4 : ref -> env_loc -> ext_expr
 | |
|   | expr_typeof_1 : out -> ext_expr
 | |
|   | expr_typeof_2 : specret value -> ext_expr
 | |
|   | expr_prepost_1 : unary_op -> out -> ext_expr
 | |
|   | expr_prepost_2 : unary_op -> res -> specret value -> ext_expr
 | |
|   | expr_prepost_3 : unary_op -> res -> out -> ext_expr
 | |
|   | expr_prepost_4 : value -> out -> ext_expr
 | |
|   | expr_unary_op_neg_1 : out -> ext_expr
 | |
|   | expr_unary_op_bitwise_not_1 : specret int -> ext_expr
 | |
|   | expr_unary_op_not_1 : out -> ext_expr
 | |
|   | expr_conditional_1 : specret value -> expr -> expr -> ext_expr
 | |
|   | expr_conditional_1': out -> expr -> expr -> ext_expr
 | |
|   | expr_conditional_2 : specret value -> ext_expr
 | |
| 
 | |
|   | expr_binary_op_1 : binary_op -> (specret value) -> expr -> ext_expr
 | |
|   | expr_binary_op_2 : binary_op -> value -> (specret value) -> ext_expr
 | |
|   | expr_binary_op_3 : binary_op -> value -> value -> ext_expr
 | |
|   | expr_binary_op_add_1 : specret (value*value) -> ext_expr
 | |
|   | expr_binary_op_add_string_1 : specret (value*value) -> ext_expr
 | |
|   | expr_puremath_op_1 : (number -> number -> number) -> specret (value*value) -> ext_expr
 | |
|   | expr_shift_op_1 : (int -> int -> int) -> specret int -> value -> ext_expr
 | |
|   | expr_shift_op_2 : (int -> int -> int) -> int -> specret int -> ext_expr
 | |
|   | expr_inequality_op_1 : bool -> bool -> value -> value -> ext_expr
 | |
|   | expr_inequality_op_2 : bool -> bool -> specret (value*value) -> ext_expr
 | |
|   | expr_binary_op_in_1 : object_loc -> out -> ext_expr
 | |
|   | expr_binary_op_disequal_1 : out -> ext_expr
 | |
|   | spec_equal : value -> value -> ext_expr
 | |
|   | spec_equal_1 : type -> type -> value -> value -> ext_expr
 | |
|   | spec_equal_2 : bool -> ext_expr
 | |
|   | spec_equal_3 : value -> (value -> ext_expr) -> value -> ext_expr
 | |
|   | spec_equal_4 : value -> out -> ext_expr
 | |
|   | expr_bitwise_op_1 : (int -> int -> int) -> specret int -> value -> ext_expr
 | |
|   | expr_bitwise_op_2 : (int -> int -> int) -> int -> specret int -> ext_expr
 | |
|   | expr_lazy_op_1 : bool -> (specret value) -> expr -> ext_expr
 | |
|   | expr_lazy_op_2 : bool -> value -> out -> expr -> ext_expr
 | |
|   | expr_lazy_op_2_1 : (specret value) -> ext_expr
 | |
| 
 | |
|   | expr_assign_1 : out -> option binary_op -> expr -> ext_expr
 | |
|   | expr_assign_2 : res -> (specret value) -> binary_op -> expr -> ext_expr
 | |
|   | expr_assign_3 : res -> value -> binary_op -> (specret value) -> ext_expr
 | |
|   | expr_assign_3' : res -> out -> ext_expr
 | |
|   | expr_assign_4 : res -> (specret value) -> ext_expr
 | |
|   | expr_assign_5 : value -> out -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for conversions *)
 | |
| 
 | |
|   | spec_to_primitive : value -> option preftype -> ext_expr
 | |
|   | spec_to_boolean : value -> ext_expr
 | |
|   | spec_to_number : value -> ext_expr
 | |
|   | spec_to_number_1 : out -> ext_expr
 | |
|   | spec_to_integer : value -> ext_expr
 | |
|   | spec_to_integer_1 : out -> ext_expr
 | |
|   | spec_to_string : value -> ext_expr
 | |
|   | spec_to_string_1 : out -> ext_expr
 | |
|   | spec_to_object : value -> ext_expr
 | |
|   | spec_check_object_coercible : value -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for comparison *)
 | |
| 
 | |
|   | spec_eq : value -> value -> ext_expr
 | |
|   | spec_eq0 : value -> value -> ext_expr
 | |
|   | spec_eq1 : value -> value -> ext_expr
 | |
|   | spec_eq2 : ext_expr -> value -> value -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for operations on objects *)
 | |
| 
 | |
|   | spec_object_get : object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_get_1 : builtin_get -> value -> object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_get_2 : value -> specret full_descriptor -> ext_expr
 | |
|   | spec_object_get_3 : value -> value -> ext_expr
 | |
| 
 | |
|   | spec_object_can_put : object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_can_put_1 : builtin_can_put -> object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_can_put_2 : object_loc -> prop_name -> (specret full_descriptor) -> ext_expr
 | |
| 
 | |
|   (* LATER: shift names since spec_object_can_put_3 is not used *)
 | |
|   | spec_object_can_put_4 : object_loc -> prop_name -> value -> ext_expr
 | |
|   | spec_object_can_put_5 : object_loc -> specret full_descriptor -> ext_expr
 | |
|   | spec_object_can_put_6 : attributes_data -> bool -> ext_expr
 | |
| 
 | |
|   | spec_object_put : object_loc -> prop_name -> value -> bool -> ext_expr
 | |
|   | spec_object_put_1 : builtin_put -> value -> object_loc -> prop_name -> value -> bool -> ext_expr
 | |
|   | spec_object_put_2 : value -> object_loc -> prop_name -> value -> bool -> out -> ext_expr
 | |
|   | spec_object_put_3 : value -> object_loc -> prop_name -> value -> bool -> specret full_descriptor -> ext_expr
 | |
|   | spec_object_put_4 : value -> object_loc -> prop_name -> value -> bool -> specret full_descriptor -> ext_expr
 | |
|   | spec_object_put_5 : out -> ext_expr
 | |
| 
 | |
|   | spec_object_has_prop : object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_has_prop_1 : builtin_has_prop -> object_loc -> prop_name -> ext_expr
 | |
|   | spec_object_has_prop_2 : specret full_descriptor -> ext_expr
 | |
| 
 | |
|   | spec_object_delete : object_loc -> prop_name -> bool -> ext_expr
 | |
|   | spec_object_delete_1 : builtin_delete -> object_loc -> prop_name -> bool -> ext_expr
 | |
|   | spec_object_delete_2 : object_loc -> prop_name -> bool -> (specret full_descriptor) -> ext_expr
 | |
|   | spec_object_delete_3 : object_loc -> prop_name -> bool -> bool -> ext_expr
 | |
| 
 | |
|   | spec_object_default_value : object_loc -> option preftype -> ext_expr
 | |
|   | spec_object_default_value_1 : builtin_default_value -> object_loc -> option preftype -> ext_expr
 | |
|   | spec_object_default_value_2 : object_loc -> preftype -> preftype -> ext_expr
 | |
|   | spec_object_default_value_3 : object_loc -> preftype -> ext_expr
 | |
|   | spec_object_default_value_4 : ext_expr
 | |
|   | spec_object_default_value_sub_1 : object_loc -> string -> ext_expr -> ext_expr
 | |
|   | spec_object_default_value_sub_2 : object_loc -> out -> ext_expr -> ext_expr
 | |
|   | spec_object_default_value_sub_3 : out -> ext_expr -> ext_expr
 | |
| 
 | |
|   | spec_object_define_own_prop : object_loc -> prop_name -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_1 : builtin_define_own_prop -> object_loc -> prop_name -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_2 : object_loc -> prop_name -> descriptor -> bool -> (specret full_descriptor) -> ext_expr
 | |
|   | spec_object_define_own_prop_3 : object_loc -> prop_name -> descriptor -> bool -> full_descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_4 : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_5 : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_6a : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_6b : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_6c : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_reject : bool -> ext_expr
 | |
|   | spec_object_define_own_prop_write : object_loc -> prop_name -> attributes -> descriptor -> bool -> ext_expr
 | |
| 
 | |
|   | spec_prim_value_get : value -> prop_name -> ext_expr
 | |
|   | spec_prim_value_get_1 : value -> prop_name -> out -> ext_expr
 | |
|   | spec_prim_value_put : value -> prop_name -> value -> bool -> ext_expr
 | |
|   | spec_prim_value_put_1 : prim -> prop_name -> value -> bool -> out -> ext_expr
 | |
| 
 | |
|   (* ARRAYS *)
 | |
|   | spec_object_define_own_prop_array_2 : object_loc -> prop_name -> descriptor -> bool -> (specret full_descriptor) -> ext_expr
 | |
|   | spec_object_define_own_prop_array_2_1 : object_loc -> prop_name -> descriptor -> bool -> descriptor -> value -> ext_expr
 | |
|   | spec_object_define_own_prop_array_branch_3_4 : object_loc -> prop_name -> descriptor -> bool -> descriptor -> (specret int) -> ext_expr
 | |
|   | spec_object_define_own_prop_array_branch_4_5   : object_loc -> prop_name -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_branch_4_5_a : object_loc -> prop_name -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_branch_4_5_b : object_loc -> prop_name -> int -> out -> descriptor -> bool -> descriptor -> int -> ext_expr 
 | |
|   | spec_object_define_own_prop_array_4a : object_loc -> prop_name -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_4b : object_loc -> prop_name -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_4c : object_loc -> int -> descriptor -> bool -> int -> descriptor -> out -> ext_expr
 | |
|   | spec_object_define_own_prop_array_5  : object_loc -> prop_name -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3 : object_loc -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3c : object_loc -> value -> (specret int) -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3d_e : object_loc -> out -> int -> descriptor -> bool -> descriptor -> int -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3f_g : object_loc -> int -> int -> descriptor -> bool -> descriptor -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3h_i : object_loc -> int -> int -> descriptor -> bool -> descriptor -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3j : object_loc -> int -> int -> descriptor -> bool -> bool -> descriptor -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3k_l : object_loc -> out -> int -> int -> descriptor -> bool -> bool -> descriptor -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l : object_loc -> int -> int -> descriptor -> bool -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_ii : object_loc -> int -> int -> descriptor -> bool -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_ii_1 : object_loc -> int -> int -> descriptor -> bool -> bool -> out -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_ii_2 : object_loc -> int -> int -> descriptor -> bool -> bool -> out -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_iii_1 : object_loc -> int -> descriptor -> bool -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_iii_2 : object_loc -> descriptor -> bool -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_iii_3 : object_loc -> descriptor -> bool -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3l_iii_4 : object_loc -> bool -> out -> ext_expr
 | |
|   | spec_object_define_own_prop_array_3m_n : object_loc -> bool -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for operations on references *)
 | |
|   | spec_put_value : resvalue -> value -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for operations on environment records *)
 | |
| 
 | |
|   | spec_env_record_has_binding : env_loc -> prop_name -> ext_expr
 | |
|   | spec_env_record_has_binding_1 : env_loc -> prop_name -> env_record -> ext_expr
 | |
|   | spec_env_record_get_binding_value : env_loc -> prop_name -> bool -> ext_expr
 | |
|   | spec_env_record_get_binding_value_1 : env_loc -> prop_name -> bool -> env_record -> ext_expr
 | |
|   | spec_env_record_get_binding_value_2 : prop_name -> bool -> object_loc -> out -> ext_expr
 | |
| 
 | |
|   | spec_env_record_create_immutable_binding : env_loc -> prop_name -> ext_expr
 | |
|   | spec_env_record_initialize_immutable_binding : env_loc -> prop_name -> value -> ext_expr
 | |
|   | spec_env_record_create_mutable_binding : env_loc -> prop_name -> option bool -> ext_expr
 | |
|   | spec_env_record_create_mutable_binding_1 : env_loc -> prop_name -> bool -> env_record -> ext_expr
 | |
|   | spec_env_record_create_mutable_binding_2 : env_loc -> prop_name -> bool -> object_loc -> out -> ext_expr
 | |
|   | spec_env_record_create_mutable_binding_3 : out -> ext_expr
 | |
|   | spec_env_record_set_mutable_binding : env_loc -> prop_name -> value -> bool -> ext_expr
 | |
|   | spec_env_record_set_mutable_binding_1 : env_loc -> prop_name -> value -> bool -> env_record -> ext_expr
 | |
|   | spec_env_record_delete_binding : env_loc -> prop_name -> ext_expr
 | |
|   | spec_env_record_delete_binding_1 : env_loc -> prop_name -> env_record -> ext_expr
 | |
| 
 | |
|   | spec_env_record_create_set_mutable_binding : env_loc -> prop_name -> option bool -> value -> bool -> ext_expr
 | |
|   | spec_env_record_create_set_mutable_binding_1 : out -> env_loc -> prop_name -> value -> bool -> ext_expr
 | |
| 
 | |
|   | spec_env_record_implicit_this_value : env_loc -> ext_expr
 | |
|   | spec_env_record_implicit_this_value_1 : env_loc -> env_record -> ext_expr
 | |
| 
 | |
| 
 | |
|   (** Extended expressions for operations on property descriptors (8.10) *)
 | |
| 
 | |
|   | spec_from_descriptor : (specret full_descriptor) -> ext_expr
 | |
|   | spec_from_descriptor_1 : attributes -> out -> ext_expr
 | |
|   | spec_from_descriptor_2 : object_loc -> attributes_data -> out -> ext_expr
 | |
|   | spec_from_descriptor_3 : object_loc -> attributes_accessor -> out -> ext_expr
 | |
|   | spec_from_descriptor_4 : object_loc -> attributes -> out -> ext_expr
 | |
|   | spec_from_descriptor_5 : object_loc -> attributes -> out -> ext_expr
 | |
|   | spec_from_descriptor_6 : object_loc -> out -> ext_expr
 | |
| 
 | |
|                        
 | |
|                   
 | |
|   (** Extented expressions for eval *)
 | |
| 
 | |
|   | spec_entering_eval_code : bool -> funcbody -> ext_expr -> ext_expr
 | |
|   | spec_entering_eval_code_1 : funcbody -> ext_expr -> bool -> ext_expr
 | |
|   | spec_entering_eval_code_2 : out -> ext_expr -> ext_expr
 | |
| 
 | |
|   | spec_call_global_eval : bool -> list value -> ext_expr
 | |
|   | spec_call_global_eval_1 : bool -> value -> ext_expr
 | |
|   | spec_call_global_eval_2 : prog -> ext_expr
 | |
|   | spec_call_global_eval_3 : out -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for function calls *)
 | |
| 
 | |
|   | spec_entering_func_code : object_loc -> value -> list value -> ext_expr -> ext_expr
 | |
|   | spec_entering_func_code_1 : object_loc -> list value -> funcbody -> value -> strictness_flag -> ext_expr -> ext_expr
 | |
|   | spec_entering_func_code_2 : object_loc -> list value -> funcbody -> out -> ext_expr -> ext_expr
 | |
|   | spec_entering_func_code_3 : object_loc -> list value -> strictness_flag -> funcbody -> value -> ext_expr -> ext_expr
 | |
|   | spec_entering_func_code_4 : out -> ext_expr -> ext_expr
 | |
| 
 | |
|   | spec_binding_inst_formal_params : list value -> env_loc -> list string -> strictness_flag -> ext_expr
 | |
|   | spec_binding_inst_formal_params_1 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> out -> ext_expr
 | |
|   | spec_binding_inst_formal_params_2 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> out -> ext_expr
 | |
|   | spec_binding_inst_formal_params_3 : list value -> env_loc -> string -> list string -> strictness_flag -> value -> ext_expr
 | |
|   | spec_binding_inst_formal_params_4 : list value -> env_loc -> list string -> strictness_flag -> out -> ext_expr
 | |
|   | spec_binding_inst_function_decls :  list value -> env_loc -> list funcdecl -> strictness_flag -> bool -> ext_expr
 | |
|   | spec_binding_inst_function_decls_1 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> bool -> out -> ext_expr
 | |
|   | spec_binding_inst_function_decls_2 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> out -> ext_expr
 | |
|   | spec_binding_inst_function_decls_3 : list value -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> specret full_descriptor -> ext_expr
 | |
|   | spec_binding_inst_function_decls_3a : list value -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> full_descriptor -> ext_expr
 | |
|   | spec_binding_inst_function_decls_4 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> out -> ext_expr
 | |
|   | spec_binding_inst_function_decls_5 : list value -> env_loc -> funcdecl -> list funcdecl -> strictness_flag -> object_loc -> bool -> ext_expr
 | |
|   | spec_binding_inst_function_decls_6 : list value -> env_loc -> list funcdecl -> strictness_flag -> bool -> out -> ext_expr
 | |
|   | spec_binding_inst_arg_obj :   object_loc -> prog -> list string -> list value -> env_loc -> ext_expr
 | |
|   | spec_binding_inst_arg_obj_1 : prog -> env_loc -> strictness_flag -> out -> ext_expr
 | |
|   | spec_binding_inst_arg_obj_2 : prog -> env_loc -> object_loc -> out -> ext_expr
 | |
|   | spec_binding_inst_var_decls : env_loc -> list string -> bool -> strictness_flag -> ext_expr
 | |
|   | spec_binding_inst_var_decls_1 : env_loc -> string -> list string -> bool -> strictness_flag -> out -> ext_expr
 | |
|   | spec_binding_inst_var_decls_2 : env_loc -> list string -> bool -> strictness_flag -> out -> ext_expr
 | |
|   | spec_binding_inst : codetype -> option object_loc -> prog -> list value -> ext_expr
 | |
|   | spec_binding_inst_1 : codetype -> option object_loc -> prog -> list value -> env_loc -> ext_expr
 | |
|   | spec_binding_inst_2 : codetype -> object_loc -> prog -> list string -> list value -> env_loc -> out -> ext_expr
 | |
|   | spec_binding_inst_3 : codetype -> option object_loc -> prog -> list string -> list value -> env_loc -> ext_expr
 | |
|   | spec_binding_inst_4 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> out -> ext_expr
 | |
|   | spec_binding_inst_5 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> ext_expr
 | |
|   | spec_binding_inst_6 : codetype -> option object_loc -> prog -> list string -> list value -> bool -> env_loc -> out -> ext_expr
 | |
|   | spec_binding_inst_7 : prog -> bool -> env_loc -> out -> ext_expr
 | |
|   | spec_binding_inst_8 : prog -> bool -> env_loc -> ext_expr
 | |
|   
 | |
|   | spec_make_arg_getter : string -> lexical_env -> ext_expr
 | |
|   | spec_make_arg_setter : string -> lexical_env -> ext_expr
 | |
|   
 | |
|   | spec_args_obj_get_1 : value -> object_loc -> prop_name -> object_loc -> (specret full_descriptor) -> ext_expr
 | |
|   
 | |
|   
 | |
|   | spec_args_obj_define_own_prop_1 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> specret full_descriptor -> ext_expr
 | |
|   | spec_args_obj_define_own_prop_2 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> full_descriptor -> out -> ext_expr
 | |
|   | spec_args_obj_define_own_prop_3 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> out -> ext_expr
 | |
|   | spec_args_obj_define_own_prop_4 : object_loc -> prop_name -> descriptor -> bool -> object_loc -> ext_expr
 | |
|   | spec_args_obj_define_own_prop_5 : out -> ext_expr
 | |
|   | spec_args_obj_define_own_prop_6 : ext_expr
 | |
|   
 | |
|   | spec_args_obj_delete_1 : object_loc -> prop_name -> bool -> object_loc -> specret full_descriptor -> ext_expr
 | |
|   | spec_args_obj_delete_2 : object_loc -> prop_name -> bool -> object_loc -> full_descriptor -> out -> ext_expr
 | |
|   | spec_args_obj_delete_3 : out -> ext_expr
 | |
|   | spec_args_obj_delete_4 : bool -> ext_expr
 | |
|   
 | |
|   | spec_arguments_object_map : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> ext_expr
 | |
|   | spec_arguments_object_map_1 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> out -> ext_expr
 | |
|   | spec_arguments_object_map_2 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> ext_expr
 | |
|   | spec_arguments_object_map_3 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> out -> ext_expr
 | |
|   | spec_arguments_object_map_4 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> string -> ext_expr
 | |
|   | spec_arguments_object_map_5 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> string -> out -> ext_expr
 | |
|   | spec_arguments_object_map_6 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> object_loc -> out -> ext_expr
 | |
|   | spec_arguments_object_map_7 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> list string -> int -> out -> ext_expr
 | |
|   | spec_arguments_object_map_8 : object_loc -> object_loc -> list string -> ext_expr
 | |
| 
 | |
|   | spec_create_arguments_object : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> ext_expr
 | |
|   | spec_create_arguments_object_1 : object_loc -> list string -> list value -> lexical_env -> strictness_flag -> object_loc -> out -> ext_expr
 | |
|   | spec_create_arguments_object_2 : object_loc -> strictness_flag -> object_loc -> out -> ext_expr
 | |
|   | spec_create_arguments_object_3 : object_loc -> value -> attributes -> out -> ext_expr
 | |
|   | spec_create_arguments_object_4 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   (* Functions *)
 | |
| 
 | |
|   | spec_object_has_instance : object_loc -> value -> ext_expr
 | |
|   | spec_object_has_instance_1 : builtin_has_instance -> object_loc -> value -> ext_expr
 | |
|   | spec_function_has_instance_1 : object_loc -> out -> ext_expr
 | |
|   | spec_function_has_instance_2 : object_loc -> object_loc -> ext_expr
 | |
|   | spec_function_has_instance_3 : object_loc -> value -> ext_expr
 | |
| 
 | |
|   | spec_function_has_instance_after_bind_1 : object_loc -> value -> ext_expr
 | |
|   | spec_function_has_instance_after_bind_2 : object_loc -> value  -> ext_expr
 | |
| 
 | |
|   | spec_function_get_1 : object_loc -> prop_name -> out -> ext_expr
 | |
| 
 | |
|   (* Function.prototype.apply *)
 | |
| 
 | |
|   | spec_function_proto_apply   : object_loc -> value -> value -> ext_expr
 | |
|   | spec_function_proto_apply_1 : object_loc -> value -> object_loc -> out -> ext_expr   
 | |
|   | spec_function_proto_apply_2 : object_loc -> value -> object_loc -> specret int -> ext_expr
 | |
|   | spec_function_proto_apply_3 : object_loc -> value -> specret (list value) -> ext_expr 
 | |
| 
 | |
|   (* Function.prototype.bind *)
 | |
| 
 | |
|   | spec_function_proto_bind_1 : object_loc -> value -> list value -> ext_expr
 | |
|   | spec_function_proto_bind_2 : object_loc -> value -> list value -> ext_expr
 | |
|   | spec_function_proto_bind_3 : object_loc -> specret int -> ext_expr
 | |
|   | spec_function_proto_bind_4 : object_loc -> int -> ext_expr
 | |
|   | spec_function_proto_bind_5 : object_loc -> ext_expr
 | |
|   | spec_function_proto_bind_6 : object_loc -> out -> ext_expr
 | |
|   | spec_function_proto_bind_7 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   (* Throwing of errors *)
 | |
| 
 | |
|   | spec_error : native_error -> ext_expr 
 | |
|   | spec_error_1 : out -> ext_expr
 | |
|   | spec_error_or_cst : bool -> native_error -> value -> ext_expr
 | |
|   | spec_error_or_void : bool -> native_error -> ext_expr
 | |
| 
 | |
|   (* LATER: these are currently unused *)
 | |
|   | spec_init_throw_type_error : ext_expr
 | |
|   | spec_init_throw_type_error_1 : out -> ext_expr
 | |
| 
 | |
|   | spec_build_error : value -> value -> ext_expr
 | |
|   | spec_build_error_1 : object_loc -> value -> ext_expr
 | |
|   | spec_build_error_2 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   (* Object creation and calling continuation with object address *)
 | |
| 
 | |
|   | spec_new_object : (object_loc -> ext_expr) -> ext_expr
 | |
|   | spec_new_object_1 : out -> (object_loc -> ext_expr) -> ext_expr
 | |
| 
 | |
|   | spec_prim_new_object : prim -> ext_expr
 | |
| 
 | |
|   (* Auxiliary reduction for creating function object steps 16 - 18 *)
 | |
|   | spec_creating_function_object_proto : object_loc -> ext_expr
 | |
|   | spec_creating_function_object_proto_1 : object_loc -> out -> ext_expr
 | |
|   | spec_creating_function_object_proto_2 : object_loc -> object_loc -> out -> ext_expr
 | |
| 
 | |
|   | spec_creating_function_object : list string -> funcbody -> lexical_env -> strictness_flag -> ext_expr
 | |
|   | spec_creating_function_object_1 : strictness_flag -> object_loc -> out -> ext_expr
 | |
|   | spec_creating_function_object_2 : strictness_flag -> object_loc -> out -> ext_expr
 | |
|   | spec_creating_function_object_3 : object_loc -> out -> ext_expr
 | |
|   | spec_creating_function_object_4 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   (* Function creation in give execution context*)
 | |
|   | spec_create_new_function_in :  execution_ctx -> list string -> funcbody -> ext_expr
 | |
| 
 | |
|   (* TODO: Check if object_loc or value could be None *)
 | |
|   (* TODO: get rid of this: | spec_call : builtin -> option object_loc -> option value -> list value -> ext_expr *)
 | |
|   | spec_call : object_loc -> value -> list value -> ext_expr (* object with the call method, this value, arguments *)
 | |
|   | spec_call_1 : call -> object_loc -> value -> list value -> ext_expr
 | |
| 
 | |
|   | spec_call_prealloc : prealloc -> value -> list value -> ext_expr
 | |
| 
 | |
|   | spec_call_default : object_loc -> value -> list value -> ext_expr
 | |
|   | spec_call_default_1 : object_loc -> ext_expr
 | |
|   | spec_call_default_2 : option funcbody -> ext_expr
 | |
|   | spec_call_default_3 : out -> ext_expr
 | |
|  
 | |
|   | spec_construct : object_loc -> list value -> ext_expr
 | |
|   | spec_construct_1 : construct -> object_loc -> list value -> ext_expr
 | |
| 
 | |
|   | spec_construct_prealloc : prealloc -> list value -> ext_expr
 | |
| 
 | |
|   | spec_construct_default : object_loc -> list value -> ext_expr
 | |
|   | spec_construct_default_1 : object_loc -> list value -> out -> ext_expr
 | |
|   | spec_construct_default_2 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   | spec_construct_1_after_bind : object_loc -> list value -> object_loc -> ext_expr
 | |
| 
 | |
|   (** Extended expressions for calling global object builtin functions *)
 | |
|   (* LATER: rename all the spec_call into spec_builtin *)
 | |
| 
 | |
|   | spec_call_global_is_nan_1 : out -> ext_expr
 | |
|   | spec_call_global_is_finite_1 : out -> ext_expr
 | |
| 
 | |
|   | spec_call_object_call_1 : value -> list value -> ext_expr
 | |
|   | spec_call_object_new_1 : value -> ext_expr
 | |
|   | spec_call_object_get_proto_of_1 : value -> ext_expr
 | |
|   | spec_call_object_is_extensible_1 : value -> ext_expr
 | |
| 
 | |
|   | spec_call_object_create_1 : value -> value -> ext_expr
 | |
|   | spec_call_object_create_2 : out -> value -> value -> ext_expr
 | |
|   | spec_call_object_create_3 : object_loc -> value -> ext_expr
 | |
| 
 | |
|   | spec_call_object_define_props_1 : value -> value -> ext_expr
 | |
|   | spec_call_object_define_props_2 : out -> object_loc -> ext_expr
 | |
|   | spec_call_object_define_props_3 : object_loc -> object_loc -> list prop_name -> list (prop_name * attributes) -> ext_expr
 | |
|   | spec_call_object_define_props_4 : out -> object_loc -> object_loc -> prop_name -> list prop_name -> list (prop_name * attributes) -> ext_expr
 | |
|   | spec_call_object_define_props_5 : object_loc -> object_loc -> prop_name -> list prop_name -> list (prop_name * attributes) -> specret attributes -> ext_expr
 | |
|   | spec_call_object_define_props_6 : object_loc -> list (prop_name * attributes) -> ext_expr
 | |
|   | spec_call_object_define_props_7 : out -> object_loc -> list (prop_name * attributes) -> ext_expr
 | |
| 
 | |
|   | spec_call_object_seal_1 : value -> ext_expr
 | |
|   | spec_call_object_seal_2 : object_loc -> list prop_name -> ext_expr
 | |
|   | spec_call_object_seal_3 : object_loc -> prop_name -> list prop_name -> specret full_descriptor -> ext_expr
 | |
|   | spec_call_object_seal_4 : object_loc -> list prop_name -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_object_is_sealed_1 : value -> ext_expr
 | |
|   | spec_call_object_is_sealed_2 : object_loc -> list prop_name -> ext_expr
 | |
|   | spec_call_object_is_sealed_3 : object_loc -> list prop_name -> specret full_descriptor -> ext_expr
 | |
| 
 | |
|   | spec_call_object_freeze_1 : value -> ext_expr
 | |
|   | spec_call_object_freeze_2 : object_loc -> list prop_name -> ext_expr
 | |
|   | spec_call_object_freeze_3 : object_loc -> prop_name -> list prop_name -> specret full_descriptor -> ext_expr
 | |
|   | spec_call_object_freeze_4 : object_loc -> prop_name -> list prop_name -> full_descriptor -> ext_expr
 | |
|   | spec_call_object_freeze_5 : object_loc -> list prop_name -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_object_is_frozen_1 : value -> ext_expr
 | |
|   | spec_call_object_is_frozen_2 : object_loc -> list prop_name -> ext_expr
 | |
|   | spec_call_object_is_frozen_3 : object_loc -> list prop_name -> specret full_descriptor -> ext_expr
 | |
|   | spec_call_object_is_frozen_4 : object_loc -> list prop_name -> full_descriptor -> ext_expr
 | |
|   | spec_call_object_is_frozen_5 : object_loc -> list prop_name -> full_descriptor -> ext_expr
 | |
| 
 | |
| 
 | |
|   | spec_call_object_prevent_extensions_1 : value -> ext_expr
 | |
| 
 | |
|   | spec_call_object_define_prop_1 : value -> value -> value -> ext_expr
 | |
|   | spec_call_object_define_prop_2 : object_loc -> out -> value -> ext_expr
 | |
|   | spec_call_object_define_prop_3 : object_loc -> string -> specret descriptor -> ext_expr
 | |
|   | spec_call_object_define_prop_4 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_object_get_own_prop_descriptor_1: value -> value -> ext_expr
 | |
|   | spec_call_object_get_own_prop_descriptor_2: object_loc -> out -> ext_expr
 | |
| 
 | |
| 
 | |
|   | spec_call_object_proto_to_string_1 : value -> ext_expr
 | |
|   | spec_call_object_proto_to_string_2 : out -> ext_expr
 | |
| 
 | |
|   | spec_call_object_proto_has_own_prop_1 : out -> value -> ext_expr
 | |
|   | spec_call_object_proto_has_own_prop_2 : out -> prop_name -> ext_expr
 | |
|   | spec_call_object_proto_has_own_prop_3 : specret full_descriptor -> ext_expr
 | |
| 
 | |
|   | spec_call_object_proto_is_prototype_of_2_1 : value -> value -> ext_expr
 | |
|   | spec_call_object_proto_is_prototype_of_2_2 : out -> object_loc -> ext_expr
 | |
|   | spec_call_object_proto_is_prototype_of_2_3 : object_loc -> object_loc -> ext_expr
 | |
|   | spec_call_object_proto_is_prototype_of_2_4 : object_loc -> value -> ext_expr
 | |
| 
 | |
|   | spec_call_object_proto_prop_is_enumerable_1 : value -> value -> ext_expr
 | |
|   | spec_call_object_proto_prop_is_enumerable_2 : value -> out -> ext_expr
 | |
|   | spec_call_object_proto_prop_is_enumerable_3 : out -> string -> ext_expr
 | |
|   | spec_call_object_proto_prop_is_enumerable_4 : specret full_descriptor -> ext_expr
 | |
| 
 | |
|   | spec_call_array_new_1 : list value -> ext_expr
 | |
|   | spec_call_array_new_2 : object_loc -> list value -> ext_expr
 | |
|   | spec_call_array_new_3 : object_loc -> list value -> int -> ext_expr
 | |
| 
 | |
|   | spec_call_array_new_single_1 : value -> ext_expr
 | |
|   | spec_call_array_new_single_2 : object_loc -> value -> ext_expr
 | |
|   | spec_call_array_new_single_3 : object_loc -> number -> specret int -> ext_expr
 | |
|   | spec_call_array_new_single_4 : object_loc -> int -> ext_expr
 | |
| 
 | |
|   | spec_call_array_is_array_1 : value -> ext_expr
 | |
|   | spec_call_array_is_array_2_3 : class_name -> ext_expr
 | |
| 
 | |
|   | spec_call_array_proto_to_string : out -> ext_expr
 | |
|   | spec_call_array_proto_to_string_1 : object_loc -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_array_proto_join   : out -> list value -> ext_expr 
 | |
|   | spec_call_array_proto_join_1 : object_loc -> out -> list value -> ext_expr 
 | |
|   | spec_call_array_proto_join_2 : object_loc -> specret int -> list value -> ext_expr
 | |
|   | spec_call_array_proto_join_3 : object_loc -> int -> value -> ext_expr
 | |
|   | spec_call_array_proto_join_4 : object_loc -> int -> out -> ext_expr
 | |
|   | spec_call_array_proto_join_5 : object_loc -> int -> string -> specret string -> ext_expr
 | |
| 
 | |
|   | spec_call_array_proto_join_elements : object_loc -> int -> int -> string -> string -> ext_expr
 | |
|   | spec_call_array_proto_join_elements_1 : object_loc -> int -> int -> string -> string -> ext_expr
 | |
|   | spec_call_array_proto_join_elements_2 : object_loc -> int -> int -> string -> string -> specret string -> ext_expr
 | |
| 
 | |
|   | spec_call_array_proto_pop_1 : out -> ext_expr
 | |
|   | spec_call_array_proto_pop_2 : object_loc -> out -> ext_expr
 | |
|   | spec_call_array_proto_pop_3 : object_loc -> specret int -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_empty_1 : object_loc -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_empty_2 : out -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_nonempty_1 : object_loc -> int -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_nonempty_2 : object_loc -> out -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_nonempty_3 : object_loc -> value -> out -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_nonempty_4 : object_loc -> value -> value -> out -> ext_expr
 | |
|   | spec_call_array_proto_pop_3_nonempty_5 : value -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_array_proto_push_1 : out -> list value -> ext_expr
 | |
|   | spec_call_array_proto_push_2 : object_loc -> list value -> out -> ext_expr
 | |
|   | spec_call_array_proto_push_3 : object_loc -> list value -> specret int -> ext_expr
 | |
|   | spec_call_array_proto_push_4 : object_loc -> list value -> int -> ext_expr
 | |
|   | spec_call_array_proto_push_4_nonempty_1 : object_loc -> list value -> int -> value -> ext_expr
 | |
|   | spec_call_array_proto_push_4_nonempty_2 : object_loc -> list value -> int -> value -> out -> ext_expr
 | |
|   | spec_call_array_proto_push_4_nonempty_3 : object_loc -> list value -> int -> value -> out -> ext_expr
 | |
|   | spec_call_array_proto_push_5 : object_loc -> value -> ext_expr
 | |
|   | spec_call_array_proto_push_6 : value -> out -> ext_expr
 | |
| 
 | |
|   | spec_call_string_non_empty : out -> ext_expr 
 | |
| 
 | |
|   | spec_construct_string_1 : value -> ext_expr
 | |
|   | spec_construct_string_2 : out -> ext_expr
 | |
| 
 | |
|   | spec_construct_bool_1 : out -> ext_expr
 | |
|   | spec_call_bool_proto_to_string_1 : out -> ext_expr
 | |
|   | spec_call_bool_proto_value_of_1 : value -> ext_expr
 | |
|   | spec_call_bool_proto_value_of_2 : value -> ext_expr
 | |
| 
 | |
|   | spec_call_number_proto_to_string_1 : value -> list value -> ext_expr
 | |
|   | spec_call_number_proto_to_string_2 : value -> out -> ext_expr
 | |
|   | spec_construct_number_1 : out -> ext_expr
 | |
|   | spec_call_number_proto_value_of_1 : value -> ext_expr
 | |
| 
 | |
|   | spec_call_error_proto_to_string_1 : value -> ext_expr
 | |
|   | spec_call_error_proto_to_string_2 : object_loc -> out -> ext_expr
 | |
|   | spec_call_error_proto_to_string_3 : object_loc -> out -> ext_expr
 | |
|   | spec_call_error_proto_to_string_4 : object_loc -> string -> out -> ext_expr
 | |
|   | spec_call_error_proto_to_string_5 : object_loc -> string -> out -> ext_expr
 | |
|   | spec_call_error_proto_to_string_6 : object_loc -> string -> out -> ext_expr
 | |
| 
 | |
| 
 | |
|   (** Special state for returning an outcome *)
 | |
| 
 | |
|   | spec_returns : out -> ext_expr
 | |
| 
 | |
| (** Grammar of extended statements *)
 | |
| 
 | |
| with ext_stat :=
 | |
| 
 | |
|   (** Extended expressions include statements *)
 | |
| 
 | |
|   | stat_basic : stat -> ext_stat
 | |
| 
 | |
|   (** Extended statements associated with primitive statements *)
 | |
|   | stat_expr_1: (specret value) -> ext_stat
 | |
| 
 | |
|   | stat_block_1 : out -> stat -> ext_stat
 | |
|   | stat_block_2 : resvalue -> out -> ext_stat
 | |
| 
 | |
|   | stat_label_1 : label -> out -> ext_stat
 | |
| 
 | |
|   | stat_var_decl_1 : out -> list (string * option expr) -> ext_stat
 | |
|   | stat_var_decl_item : (string * option expr) -> ext_stat
 | |
|   | stat_var_decl_item_1 : string -> specret ref -> expr -> ext_stat
 | |
|   | stat_var_decl_item_2 : string -> ref -> (specret value) -> ext_stat
 | |
|   | stat_var_decl_item_3 : string -> out -> ext_stat
 | |
| 
 | |
|   | stat_if_1 : specret value -> stat -> option stat -> ext_stat
 | |
| 
 | |
|   | stat_while_1 : label_set -> expr -> stat -> resvalue -> ext_stat
 | |
|   | stat_while_2 : label_set -> expr -> stat -> resvalue -> specret value -> ext_stat
 | |
|   | stat_while_3 : label_set -> expr -> stat -> resvalue -> out -> ext_stat
 | |
|   | stat_while_4 : label_set -> expr -> stat -> resvalue -> res -> ext_stat
 | |
|   | stat_while_5 : label_set -> expr -> stat -> resvalue -> res -> ext_stat
 | |
|   | stat_while_6 : label_set -> expr -> stat -> resvalue -> res -> ext_stat
 | |
| 
 | |
| 
 | |
|   | stat_do_while_1 : label_set -> stat -> expr -> resvalue -> ext_stat
 | |
|   | stat_do_while_2 : label_set -> stat -> expr -> resvalue -> out -> ext_stat
 | |
|   | stat_do_while_3 : label_set -> stat -> expr -> resvalue -> res -> ext_stat
 | |
|   | stat_do_while_4 : label_set -> stat -> expr -> resvalue -> res -> ext_stat
 | |
|   | stat_do_while_5 : label_set -> stat -> expr -> resvalue -> res -> ext_stat
 | |
|   | stat_do_while_6 : label_set -> stat -> expr -> resvalue -> ext_stat
 | |
|   | stat_do_while_7 : label_set -> stat -> expr -> resvalue -> specret value -> ext_stat
 | |
| 
 | |
|   | stat_for_1 : label_set -> specret value -> option expr -> option expr -> stat -> ext_stat
 | |
|   | stat_for_2 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat
 | |
|   | stat_for_3 : label_set -> resvalue -> expr -> specret value -> option expr -> stat -> ext_stat
 | |
|   | stat_for_4 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat
 | |
|   | stat_for_5 : label_set -> resvalue -> option expr -> out -> option expr -> stat -> ext_stat
 | |
|   | stat_for_6 : label_set -> resvalue -> option expr -> option expr -> stat -> res -> ext_stat
 | |
|   | stat_for_7 : label_set -> resvalue -> option expr -> option expr -> stat -> res -> ext_stat
 | |
|   | stat_for_8 : label_set -> resvalue -> option expr -> option expr -> stat -> ext_stat
 | |
|   | stat_for_9 : label_set -> resvalue -> option expr -> expr -> specret value -> stat -> ext_stat
 | |
| 
 | |
|   | stat_for_var_1 : out -> label_set -> option expr -> option expr -> stat -> ext_stat
 | |
| 
 | |
| 
 | |
| (* LATER: define prop_names for [set prop_name] *)
 | |
| (* LATER
 | |
|   | stat_for_in_1 : expr -> stat -> out -> ext_stat
 | |
|   | stat_for_in_2 : expr -> stat -> out -> ext_stat
 | |
|   | stat_for_in_3 : expr -> stat -> out -> ext_stat
 | |
|   | stat_for_in_4 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> ext_stat 
 | |
|   | stat_for_in_5 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> prop_name -> ext_stat
 | |
|   | stat_for_in_6 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> prop_name -> ext_stat
 | |
|   | stat_for_in_7 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> out -> ext_stat
 | |
|   | stat_for_in_8 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> out -> ext_stat
 | |
|   | stat_for_in_9 : expr -> stat -> object_loc -> option res -> option out -> set prop_name -> set prop_name -> res -> ext_stat
 | |
| *)
 | |
| 
 | |
|   (* Extended statements for 'switch' *)
 | |
|                                                                            
 | |
|   | stat_switch_1: (specret value) -> label_set -> switchbody -> ext_stat
 | |
|   | stat_switch_2: out -> label_set -> ext_stat
 | |
|   | stat_switch_nodefault_1: value -> resvalue -> list switchclause -> ext_stat
 | |
|   | stat_switch_nodefault_2: (specret value) -> value -> resvalue -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_nodefault_3: bool -> value -> resvalue -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_nodefault_4: out -> list switchclause -> ext_stat
 | |
|   | stat_switch_nodefault_5: resvalue -> list switchclause -> ext_stat
 | |
|   | stat_switch_nodefault_6: resvalue -> out -> list switchclause -> ext_stat
 | |
| 
 | |
|   | stat_switch_default_1: value -> resvalue -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_A_1: bool -> value -> resvalue -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_A_2: (specret value) -> value -> resvalue -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_A_3: bool -> value -> resvalue -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_A_4: resvalue -> value -> list stat -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_A_5: resvalue -> out -> value -> list switchclause -> list stat -> list switchclause -> ext_stat
 | |
| 
 | |
|   | stat_switch_default_B_1: value -> resvalue -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_B_2: (specret value) -> value -> resvalue -> list stat -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_B_3: bool -> value -> resvalue -> list stat -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_B_4: out -> list stat -> list switchclause -> ext_stat
 | |
| 
 | |
|   | stat_switch_default_5: value -> resvalue -> list stat -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_6: out -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_7: resvalue -> list switchclause -> ext_stat
 | |
|   | stat_switch_default_8: resvalue -> out -> list switchclause -> ext_stat
 | |
| 
 | |
|   | stat_with_1 : stat -> specret value -> ext_stat (* The expression have been executed. *)
 | |
| 
 | |
|   | stat_throw_1 : (specret value) -> ext_stat (* The expression have been executed. *)
 | |
| 
 | |
|   | stat_return_1 : (specret value) -> ext_stat (* The expression have been executed. *)
 | |
| 
 | |
|   | stat_try_1 : out -> option (string*stat) -> option stat -> ext_stat (* The try block has been executed. *)
 | |
|   | stat_try_2 : out -> lexical_env -> stat -> option stat -> ext_stat (* The catch block is actived and will be executed. *)
 | |
|   | stat_try_3 : out -> option stat -> ext_stat (* The try catch block has been executed:  there only stay an optional finally. *)
 | |
|   | stat_try_4 : res -> option stat -> ext_stat (* The try catch block has been executed:  there only stay an optional finally. *)
 | |
|   | stat_try_5 : res -> out -> ext_stat (* The finally has been executed. *)
 | |
| 
 | |
| (** Grammar of extended programs *)
 | |
| 
 | |
| with ext_prog :=
 | |
| 
 | |
|   | prog_basic : prog -> ext_prog
 | |
|   | javascript_1 : out -> prog -> ext_prog
 | |
|   | prog_1 : out -> element -> ext_prog
 | |
|   | prog_2 : resvalue -> out -> ext_prog
 | |
| 
 | |
| 
 | |
| (** Grammar of extended forms for specification functions *)
 | |
| 
 | |
| with ext_spec :=
 | |
|   | spec_to_int32 : value -> ext_spec
 | |
|   | spec_to_int32_1 : out -> ext_spec
 | |
|   | spec_to_uint32 : value -> ext_spec
 | |
|   | spec_to_uint32_1 : out -> ext_spec
 | |
| 
 | |
|   | spec_expr_get_value_conv : (value -> ext_expr) -> expr -> ext_spec
 | |
|   | spec_expr_get_value_conv_1 : (value -> ext_expr) -> (specret value) -> ext_spec
 | |
|   | spec_expr_get_value_conv_2 : out -> ext_spec
 | |
| 
 | |
|   | spec_convert_twice : ext_expr -> ext_expr -> ext_spec
 | |
|   | spec_convert_twice_1 : out -> ext_expr -> ext_spec
 | |
|   | spec_convert_twice_2 : value -> out -> ext_spec
 | |
| 
 | |
|   (** Extended expressions for lists of expressions *)
 | |
|   | spec_list_expr : list expr -> ext_spec
 | |
|   | spec_list_expr_1 : list value -> list expr -> ext_spec
 | |
|   | spec_list_expr_2 : list value -> (specret value) -> list expr -> ext_spec 
 | |
| 
 | |
|   | spec_to_descriptor : value -> ext_spec
 | |
|   | spec_to_descriptor_1a : object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_1b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_1c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_2a : object_loc -> descriptor -> ext_spec                            
 | |
|   | spec_to_descriptor_2b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_2c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_3a : object_loc -> descriptor -> ext_spec                            
 | |
|   | spec_to_descriptor_3b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_3c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_4a : object_loc -> descriptor -> ext_spec                            
 | |
|   | spec_to_descriptor_4b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_4c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_5a : object_loc -> descriptor -> ext_spec                            
 | |
|   | spec_to_descriptor_5b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_5c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_6a : object_loc -> descriptor -> ext_spec                            
 | |
|   | spec_to_descriptor_6b : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_6c : out -> object_loc -> descriptor -> ext_spec
 | |
|   | spec_to_descriptor_7 : object_loc -> descriptor -> ext_spec    
 | |
| 
 | |
|   | spec_object_get_own_prop : object_loc -> prop_name -> ext_spec
 | |
|   | spec_object_get_own_prop_1 : builtin_get_own_prop -> object_loc -> prop_name -> ext_spec
 | |
|   | spec_object_get_own_prop_2 : object_loc -> prop_name -> option attributes -> ext_spec
 | |
| 
 | |
|   | spec_object_get_prop : object_loc -> prop_name -> ext_spec
 | |
|   | spec_object_get_prop_1 : builtin_get_prop -> object_loc -> prop_name -> ext_spec
 | |
|   | spec_object_get_prop_2 : object_loc -> prop_name -> specret full_descriptor -> ext_spec
 | |
|   | spec_object_get_prop_3 : object_loc -> prop_name -> value -> ext_spec
 | |
| 
 | |
|   | spec_get_value : resvalue -> ext_spec
 | |
|   | spec_get_value_ref_b_1 : out -> ext_spec
 | |
|   | spec_get_value_ref_c_1 : out -> ext_spec
 | |
| 
 | |
|   (** Shorthand for calling [red_expr] then [ref_get_value] *)
 | |
| 
 | |
|   | spec_expr_get_value : expr -> ext_spec
 | |
|   | spec_expr_get_value_1 : out -> ext_spec
 | |
| 
 | |
|   (** Extended expressions for operations on lexical environments *)
 | |
| 
 | |
|   | spec_lexical_env_get_identifier_ref : lexical_env -> prop_name -> bool -> ext_spec
 | |
|   | spec_lexical_env_get_identifier_ref_1 : env_loc -> lexical_env -> prop_name -> bool -> ext_spec
 | |
|   | spec_lexical_env_get_identifier_ref_2 : env_loc -> lexical_env -> prop_name -> bool -> out -> ext_spec
 | |
| 
 | |
|   (** Errors in the grammar of spec *) (* LATER: merge *)
 | |
|   | spec_error_spec : native_error -> ext_spec
 | |
|   | spec_error_spec_1 : out -> ext_spec
 | |
| 
 | |
|   (* .. *)
 | |
|   | spec_args_obj_get_own_prop_1 : object_loc -> prop_name -> (specret full_descriptor) -> ext_spec
 | |
|   | spec_args_obj_get_own_prop_2 : object_loc -> prop_name -> object_loc -> full_descriptor -> (specret full_descriptor) -> ext_spec
 | |
|   | spec_args_obj_get_own_prop_3 : full_descriptor -> out -> ext_spec
 | |
|   | spec_args_obj_get_own_prop_4 : full_descriptor -> ext_spec
 | |
| 
 | |
|   | spec_string_get_own_prop_1 : object_loc -> prop_name -> (specret full_descriptor) -> ext_spec
 | |
|   | spec_string_get_own_prop_2 : object_loc -> prop_name -> (specret int) -> ext_spec
 | |
|   | spec_string_get_own_prop_3 : object_loc -> prop_name -> out -> ext_spec
 | |
|   | spec_string_get_own_prop_4 : prop_name -> string -> ext_spec
 | |
|   | spec_string_get_own_prop_5 : string -> (specret int) -> ext_spec
 | |
|   | spec_string_get_own_prop_6 : string -> int -> int -> ext_spec
 | |
| 
 | |
|   (* Argumenst for Function.prototype.apply *)
 | |
| 
 | |
|   | spec_function_proto_apply_get_args   : object_loc -> int -> int -> ext_spec
 | |
|   | spec_function_proto_apply_get_args_1 : object_loc -> int -> int -> out -> ext_spec
 | |
|   | spec_function_proto_apply_get_args_2 : object_loc -> int -> int -> out -> ext_spec
 | |
|   | spec_function_proto_apply_get_args_3 : value -> specret (list value) -> ext_spec 
 | |
| 
 | |
|   (* Length for Function.prototype.bind *)
 | |
| 
 | |
|   | spec_function_proto_bind_length   : object_loc -> list value -> ext_spec
 | |
|   | spec_function_proto_bind_length_1 : object_loc -> list value -> ext_spec
 | |
|   | spec_function_proto_bind_length_2 : list value -> out -> ext_spec
 | |
|   | spec_function_proto_bind_length_3 : specret int -> list value -> ext_spec
 | |
| 
 | |
|   (* Conversion for Array.prototype.join *)
 | |
| 
 | |
|   | spec_call_array_proto_join_vtsfj : object_loc -> int -> ext_spec
 | |
|   | spec_call_array_proto_join_vtsfj_1 : object_loc -> out -> ext_spec
 | |
|   | spec_call_array_proto_join_vtsfj_2 : object_loc -> out -> ext_spec
 | |
|   | spec_call_array_proto_join_vtsfj_3 : out -> ext_spec
 | |
| .
 | |
| 
 | |
| (** Coercions *)
 | |
| 
 | |
| Coercion expr_basic : expr >-> ext_expr.
 | |
| Coercion stat_basic : stat >-> ext_stat.
 | |
| Coercion prog_basic : prog >-> ext_prog.
 | |
| 
 | |
| 
 | |
| (** Shorthand for calling toPrimitive without prefered type *)
 | |
| 
 | |
| Definition spec_to_primitive_auto v :=
 | |
|   spec_to_primitive v None.
 | |
| 
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Extracting outcome from an extended expression. *)
 | |
| 
 | |
| (** Auxiliary definition for extracting [out] of [specret] *)
 | |
| 
 | |
| Definition out_of_specret T (y:specret T) :=
 | |
|   match y with
 | |
|   | specret_out o => Some o
 | |
|   | specret_val _ _ => None
 | |
|   end.
 | |
| 
 | |
| (** The [out_of_ext_*] family of definitions is used by
 | |
|     the generic abort rule, which propagates exceptions,
 | |
|     and divergence, break and continues. *)
 | |
| 
 | |
| Definition out_of_ext_expr (e : ext_expr) : option out :=
 | |
|   match e with
 | |
|   | expr_basic _ => None
 | |
| 
 | |
|   | expr_identifier_1 y => out_of_specret y   
 | |
|   | expr_object_0 o _ => Some o
 | |
|   | expr_object_1 _ _ => None
 | |
|   | expr_object_2 _ _ _ _ => None
 | |
|   | expr_object_3_val _ _ y _ => out_of_specret y
 | |
|   | expr_object_3_get _ _ o _ => Some o
 | |
|   | expr_object_3_set _ _ o _ => Some o
 | |
|   | expr_object_4 _ _ _ _ => None
 | |
|   | expr_object_5 _ _ o => Some o
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   (* _ARRAYS_ : support for array intermediate forms - CHECK!*)
 | |
|   | expr_array_0 o _ => Some o
 | |
|   | expr_array_1 _ _ => None
 | |
|   | expr_array_2 _ _ _ => None
 | |
|   | expr_array_3 _ _ _ => None
 | |
|   | expr_array_3_1 _ y _ _ => out_of_specret y
 | |
|   | expr_array_3_2 _ _ o _ _ => Some o
 | |
|   | expr_array_3_3 _ _ y _ _ => out_of_specret y
 | |
|   | expr_array_3_4 _ _ o _ => Some o
 | |
|   | expr_array_3_5 _ o _ => Some o
 | |
|   
 | |
| 
 | |
|   | expr_array_add_length   _ _ o => Some o
 | |
|   | expr_array_add_length_0 _ _ => None
 | |
|   | expr_array_add_length_1 _ _ o => Some o 
 | |
|   | expr_array_add_length_2 _ y _ => out_of_specret y
 | |
|   | expr_array_add_length_3 _ y => out_of_specret y
 | |
|   | expr_array_add_length_4 _ o => Some o
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   | expr_function_1 _ _ _ _ _ o => Some o
 | |
|   | expr_function_2 _ _ o => Some o
 | |
|   | expr_function_3 _ o => Some o
 | |
| 
 | |
|   | expr_access_1 y _ => out_of_specret y
 | |
|   | expr_access_2 _ y => out_of_specret y
 | |
|   | expr_access_3 _ o _ => Some o
 | |
|   | expr_access_4 _ o => Some o
 | |
| 
 | |
|   | expr_new_1 y _ => out_of_specret y
 | |
|   | expr_new_2 _ y => out_of_specret y  
 | |
| 
 | |
|   | expr_call_1 o _ _ => Some o
 | |
|   | expr_call_2 _ _ _ y => out_of_specret y
 | |
|   | expr_call_3 _ _ _ y => out_of_specret y  
 | |
|   | expr_call_4 _ _ _ _ => None
 | |
|   | expr_call_5 _ _ _ o => Some o
 | |
| 
 | |
|   | spec_eval _ _ _ => None
 | |
| 
 | |
|   | expr_unary_op_1 _ y => out_of_specret y
 | |
|   | expr_unary_op_2 _ _ => None
 | |
|   | expr_delete_1 o => Some o
 | |
|   | expr_delete_2 _ => None
 | |
|   | expr_delete_3 _ o => Some o
 | |
|   | expr_delete_4 _ _ => None
 | |
|   | expr_typeof_1 o => Some o
 | |
|   | expr_typeof_2 y => out_of_specret y
 | |
|   | expr_prepost_1 _ o => Some o
 | |
| (*  | expr_prepost_2 _ _ o => Some o *)
 | |
| 
 | |
|   | expr_prepost_2 _ _ y => out_of_specret y
 | |
| 
 | |
|   | expr_prepost_3 _ _ o => Some o
 | |
|   | expr_prepost_4 _ o => Some o
 | |
|   | expr_unary_op_neg_1 o => Some o
 | |
|   | expr_unary_op_bitwise_not_1 y => out_of_specret y
 | |
|   | expr_unary_op_not_1 o => Some o
 | |
|   | expr_conditional_1 y _ _ => out_of_specret y
 | |
|   | expr_conditional_1' o _ _ => None
 | |
|   | expr_conditional_2 y => out_of_specret y
 | |
| 
 | |
|   | expr_binary_op_1 _ y _ => out_of_specret y
 | |
|   | expr_binary_op_2 _ _ y => out_of_specret y
 | |
|   | expr_binary_op_3 _ _ _ => None
 | |
|   | expr_binary_op_add_1 y => out_of_specret y
 | |
|   | expr_binary_op_add_string_1 y => out_of_specret y
 | |
|   | expr_puremath_op_1 _ y => out_of_specret y
 | |
|   | expr_shift_op_1 _ y _ => out_of_specret y
 | |
|   | expr_shift_op_2 _ _ y => out_of_specret y
 | |
|   | expr_inequality_op_1 _ _ _ _ => None
 | |
|   | expr_inequality_op_2 _ _ y => out_of_specret y
 | |
|   | expr_binary_op_in_1 _ o => Some o
 | |
|   | expr_binary_op_disequal_1 o => Some o
 | |
|   | spec_equal _ _ => None
 | |
|   | spec_equal_1 _ _ _ _ => None
 | |
|   | spec_equal_2 _ => None
 | |
|   | spec_equal_3 _ _ _ => None
 | |
|   | spec_equal_4 _ o => Some o
 | |
|   | expr_bitwise_op_1 _ y _ => out_of_specret y
 | |
|   | expr_bitwise_op_2 _ _ y => out_of_specret y
 | |
|   | expr_lazy_op_1 _ y _ => out_of_specret y
 | |
|   | expr_lazy_op_2 _ _ o _ => Some o
 | |
|   | expr_lazy_op_2_1 y => out_of_specret y
 | |
| 
 | |
|   | expr_assign_1 o _ _ => Some o
 | |
|   | expr_assign_2 _ y _ _ => out_of_specret y
 | |
|   | expr_assign_3 _ _ _ y => out_of_specret y
 | |
|   | expr_assign_3' _ o => Some o
 | |
|   | expr_assign_4 _ y => out_of_specret y
 | |
|   | expr_assign_5 _ o => Some o
 | |
| 
 | |
|   | spec_to_primitive _ _ => None
 | |
|   | spec_to_boolean _ => None
 | |
|   | spec_to_number _ => None
 | |
|   | spec_to_number_1 o => Some o
 | |
|   | spec_to_integer _ => None
 | |
|   | spec_to_integer_1 o => Some o
 | |
|   | spec_to_string _ => None
 | |
|   | spec_to_string_1 o => Some o
 | |
|   | spec_to_object _ => None
 | |
| 
 | |
|   | spec_check_object_coercible _ => None
 | |
| 
 | |
|   | spec_eq _ _ => None
 | |
|   | spec_eq0 _ _ => None
 | |
|   | spec_eq1 _ _ => None
 | |
|   | spec_eq2 _ _ _ => None
 | |
| 
 | |
|   | spec_object_get _ _ => None
 | |
|   | spec_object_get_1 _ _ _ _ => None
 | |
|   | spec_object_get_2 _ y => out_of_specret y
 | |
|   | spec_object_get_3 _ _ => None
 | |
| 
 | |
|   | spec_object_can_put _ _ => None
 | |
|   | spec_object_can_put_1 _ _ _ => None
 | |
|   | spec_object_can_put_2 _ _ y => out_of_specret y
 | |
|   | spec_object_can_put_4 _ _ _ => None
 | |
|   | spec_object_can_put_5 _ y => out_of_specret y
 | |
|   | spec_object_can_put_6 _ _ => None
 | |
| 
 | |
|   | spec_object_put _ _ _ _ => None
 | |
|   | spec_object_put_1 _ _ _ _ _ _ => None
 | |
|   | spec_object_put_2 _ _ _ _ _ o => Some o
 | |
|   | spec_object_put_3 _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_object_put_4 _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_object_put_5 o => Some o
 | |
| 
 | |
|   | spec_object_has_prop _ _ => None
 | |
|   | spec_object_has_prop_1 _ _ _ => None
 | |
|   | spec_object_has_prop_2 y => out_of_specret y
 | |
| 
 | |
|   | spec_object_delete _ _ _ => None
 | |
|   | spec_object_delete_1 _ _ _ _ => None
 | |
|   | spec_object_delete_2 _ _ _ y => out_of_specret y
 | |
|   | spec_object_delete_3 _ _ _ _ => None
 | |
| 
 | |
|   | spec_object_default_value _ _ => None
 | |
|   | spec_object_default_value_1 _ _ _ => None
 | |
|   | spec_object_default_value_2 _ _ _ => None
 | |
|   | spec_object_default_value_3 _ _ => None
 | |
|   | spec_object_default_value_4 => None
 | |
|   | spec_object_default_value_sub_1 _ _ _ => None
 | |
|   | spec_object_default_value_sub_2 _ o _ => Some o
 | |
|   | spec_object_default_value_sub_3 o _ => Some o
 | |
| 
 | |
|   | spec_object_define_own_prop _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_1 _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_2 _ _ _ _ y => out_of_specret y
 | |
|   | spec_object_define_own_prop_3 _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_4 _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_5 _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_6a _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_6b _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_6c _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_reject _ => None
 | |
|   | spec_object_define_own_prop_write _ _ _ _ _ => None
 | |
| 
 | |
| 
 | |
| 
 | |
|   (* ARRAYS *)
 | |
|   | spec_object_define_own_prop_array_2 _ _ _ _ y => out_of_specret y
 | |
|   | spec_object_define_own_prop_array_2_1 _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_branch_3_4 _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_object_define_own_prop_array_branch_4_5 _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_branch_4_5_a _ _ y _ _ _ _ => out_of_specret y
 | |
|   | spec_object_define_own_prop_array_branch_4_5_b _ _ _ o _ _ _ _ => Some o
 | |
|   | spec_object_define_own_prop_array_4a _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_4b _ _ y _ _ _ _ => out_of_specret y
 | |
|   | spec_object_define_own_prop_array_4c _ _ _ _ _ _ o => Some o
 | |
|   | spec_object_define_own_prop_array_5 _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3 _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3c _ _ y _ _ _ _ => out_of_specret y
 | |
|   | spec_object_define_own_prop_array_3d_e _ o _ _ _ _ _ => Some o
 | |
|   | spec_object_define_own_prop_array_3f_g _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3h_i _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3j _ _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3k_l _ o _ _ _ _ _ _ => Some o
 | |
|   | spec_object_define_own_prop_array_3l _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3l_ii _ _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3l_ii_1 _ _ _ _ _ _ o => Some o
 | |
|   | spec_object_define_own_prop_array_3l_ii_2 _ _ _ _ _ _ o => Some o
 | |
|   | spec_object_define_own_prop_array_3l_iii_1 _ _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3l_iii_2 _ _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3l_iii_3 _ _ _ => None
 | |
|   | spec_object_define_own_prop_array_3l_iii_4 _ _ o => Some o
 | |
|   | spec_object_define_own_prop_array_3m_n _ _ => None
 | |
| 
 | |
|   | spec_prim_value_get _ _ => None
 | |
|   | spec_prim_value_get_1 _ _ o => Some o
 | |
| 
 | |
|   | spec_prim_value_put _ _ _ _ => None
 | |
|   | spec_prim_value_put_1 _ _ _ _ o => Some o
 | |
| 
 | |
|   | spec_put_value _ _ => None
 | |
| 
 | |
| 
 | |
|   | spec_env_record_has_binding _ _ => None
 | |
|   | spec_env_record_has_binding_1 _ _ _ => None
 | |
|   | spec_env_record_get_binding_value _ _ _ => None
 | |
|   | spec_env_record_get_binding_value_1 _ _ _ _ => None
 | |
|   | spec_env_record_get_binding_value_2 _ _ _ o => Some o
 | |
| 
 | |
|   | spec_env_record_create_immutable_binding _ _ => None
 | |
|   | spec_env_record_initialize_immutable_binding _ _ _ => None
 | |
|   | spec_env_record_create_mutable_binding _ _ _ => None
 | |
|   | spec_env_record_create_mutable_binding_1 _ _ _ _ => None
 | |
|   | spec_env_record_create_mutable_binding_2 _ _ _ _ o => Some o
 | |
|   | spec_env_record_create_mutable_binding_3 o => Some o
 | |
|   | spec_env_record_set_mutable_binding _ _ _ _ => None
 | |
|   | spec_env_record_set_mutable_binding_1 _ _ _ _ _ => None
 | |
|   | spec_env_record_delete_binding _ _ => None
 | |
|   | spec_env_record_delete_binding_1 _ _ _ => None
 | |
| 
 | |
|   | spec_env_record_create_set_mutable_binding _ _ _ _ _ => None
 | |
|   | spec_env_record_create_set_mutable_binding_1 o _ _ _ _ => Some o
 | |
| 
 | |
|   | spec_env_record_implicit_this_value _ => None
 | |
|   | spec_env_record_implicit_this_value_1 _ _ => None
 | |
| 
 | |
|   | spec_from_descriptor y => out_of_specret y
 | |
|   | spec_from_descriptor_1 _ o => Some o
 | |
|   | spec_from_descriptor_2 _ _ o => Some o
 | |
|   | spec_from_descriptor_3 _ _ o => Some o
 | |
|   | spec_from_descriptor_4 _ _ o => Some o
 | |
|   | spec_from_descriptor_5 _ _ o => Some o
 | |
|   | spec_from_descriptor_6 _ o => Some o
 | |
| 
 | |
| 
 | |
|   | spec_entering_eval_code _ _ _ => None
 | |
|   | spec_entering_eval_code_1 _ _ _ => None
 | |
|   | spec_entering_eval_code_2 o _ => Some o
 | |
| 
 | |
|   | spec_call_global_eval _ _ => None
 | |
|   | spec_call_global_eval_1 _ _ => None
 | |
|   | spec_call_global_eval_2 _ => None
 | |
|   | spec_call_global_eval_3 o => Some o
 | |
| 
 | |
|   | spec_entering_func_code _ _ _ _ => None
 | |
|   | spec_entering_func_code_1 _ _ _ _ _ _ => None
 | |
|   | spec_entering_func_code_2 _ _ _ o _ => Some o
 | |
|   | spec_entering_func_code_3 _ _ _ _ _ _ => None
 | |
|   | spec_entering_func_code_4 o _ => Some o
 | |
| 
 | |
|   | spec_binding_inst_formal_params _ _ _ _ => None
 | |
|   | spec_binding_inst_formal_params_1 _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_formal_params_2 _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_formal_params_3 _ _ _ _ _ _ => None
 | |
|   | spec_binding_inst_formal_params_4 _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_function_decls _ _ _ _ _ => None
 | |
|   | spec_binding_inst_function_decls_1 _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_function_decls_2 _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_function_decls_3 _ _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_binding_inst_function_decls_3a _ _ _ _ _ _ _ => None
 | |
|   | spec_binding_inst_function_decls_4 _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_function_decls_5 _ _ _ _ _ _ _ => None
 | |
|   | spec_binding_inst_function_decls_6 _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_arg_obj   object_loc _ _ _ _ => None
 | |
|   | spec_binding_inst_arg_obj_1 _ _ _ o => Some o
 | |
|   | spec_binding_inst_arg_obj_2 _ _ _ o => Some o
 | |
|   | spec_binding_inst_var_decls _ _ _ _ => None
 | |
|   | spec_binding_inst_var_decls_1 _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_var_decls_2 _ _ _ _ o => Some o
 | |
|   | spec_binding_inst _ _ _ _ => None
 | |
|   | spec_binding_inst_1 _ _ _ _ _ => None
 | |
|   | spec_binding_inst_2 _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_3 _ _ _ _ _ _ => None
 | |
|   | spec_binding_inst_4 _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_5 _ _ _ _ _ _ _ => None
 | |
|   | spec_binding_inst_6 _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_binding_inst_7 _ _ _ o => Some o
 | |
|   | spec_binding_inst_8 _ _ _ => None
 | |
|   
 | |
|   | spec_make_arg_getter _ _ => None
 | |
|   | spec_make_arg_setter _ _ => None
 | |
|   
 | |
|   | spec_args_obj_get_1 _ _ _ _ y => out_of_specret y
 | |
|   
 | |
|   
 | |
|   | spec_args_obj_define_own_prop_1 _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_args_obj_define_own_prop_2 _ _ _ _ _ _ o => Some o
 | |
|   | spec_args_obj_define_own_prop_3 _ _ _ _ _ o => Some o
 | |
|   | spec_args_obj_define_own_prop_4 _ _ _ _ _ => None
 | |
|   | spec_args_obj_define_own_prop_5 o => Some o
 | |
|   | spec_args_obj_define_own_prop_6 => None
 | |
|   
 | |
|   | spec_args_obj_delete_1 _ _ _ _ y => out_of_specret y
 | |
|   | spec_args_obj_delete_2 _ _ _ _ _ o => Some o
 | |
|   | spec_args_obj_delete_3 o => Some o
 | |
|   | spec_args_obj_delete_4 _ => None
 | |
|   
 | |
|   | spec_arguments_object_map _ _ _ _ _ => None
 | |
|   | spec_arguments_object_map_1 _ _ _ _ _ o => Some o
 | |
|   | spec_arguments_object_map_2 _ _ _ _ _ _ _ _ => None
 | |
|   | spec_arguments_object_map_3 _ _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_arguments_object_map_4 _ _ _ _ _ _ _ _ _ => None
 | |
|   | spec_arguments_object_map_5 _ _ _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_arguments_object_map_6 _ _ _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_arguments_object_map_7 _ _ _ _ _ _ _ _ o => Some o
 | |
|   | spec_arguments_object_map_8 _ _ _  => None
 | |
| 
 | |
| 
 | |
|   | spec_create_arguments_object _ _ _ _ _ => None
 | |
|   | spec_create_arguments_object_1 _ _ _ _ _ _ o => Some o
 | |
|   | spec_create_arguments_object_2 _ _ _ o => Some o
 | |
|   | spec_create_arguments_object_3 _ _ _ o => Some o
 | |
|   | spec_create_arguments_object_4 _ o => Some o
 | |
| 
 | |
|   | spec_object_has_instance _ _ => None
 | |
|   | spec_object_has_instance_1 _ _ _ => None
 | |
|   | spec_function_has_instance_1 _ o => Some o
 | |
|   | spec_function_has_instance_2 _ _ => None
 | |
|   | spec_function_has_instance_3 _ _ => None
 | |
|   | spec_function_has_instance_after_bind_1 _ _ => None
 | |
|   | spec_function_has_instance_after_bind_2 _ _ => None 
 | |
| 
 | |
|   | spec_function_get_1 _ _ o => Some o
 | |
| 
 | |
|   | spec_error _ => None
 | |
|   | spec_error_1 o => Some o 
 | |
|   | spec_error_or_cst _ _ _ => None
 | |
|   | spec_error_or_void _ _ => None
 | |
| 
 | |
|   | spec_init_throw_type_error => None
 | |
|   | spec_init_throw_type_error_1 o => Some o
 | |
| 
 | |
|   | spec_build_error _ _ => None
 | |
|   | spec_build_error_1 _ _ => None
 | |
|   | spec_build_error_2 _ o => Some o
 | |
| 
 | |
|   | spec_new_object _ => None
 | |
|   | spec_new_object_1 o _ => Some o
 | |
| 
 | |
|   | spec_prim_new_object _ => None
 | |
| 
 | |
|   | spec_creating_function_object_proto _ => None
 | |
|   | spec_creating_function_object_proto_1 _ o => Some o
 | |
|   | spec_creating_function_object_proto_2 _ _ o => Some o
 | |
| 
 | |
|   | spec_creating_function_object _ _ _ _ => None
 | |
|   | spec_creating_function_object_1 _ _ o => Some o
 | |
|   | spec_creating_function_object_2 _ _ o => Some o
 | |
|   | spec_creating_function_object_3 _ o => Some o
 | |
|   | spec_creating_function_object_4 _ o => Some o
 | |
| 
 | |
|   | spec_function_proto_apply _ _ _ => None
 | |
|   | spec_function_proto_apply_1 _ _ _ o => Some o  
 | |
|   | spec_function_proto_apply_2 _ _ _ y => out_of_specret y
 | |
|   | spec_function_proto_apply_3 _ _ y => out_of_specret y
 | |
| 
 | |
|   | spec_function_proto_bind_1 _ _ _ => None 
 | |
|   | spec_function_proto_bind_2 _ _ _ => None 
 | |
|   | spec_function_proto_bind_3 _ y => out_of_specret y 
 | |
|   | spec_function_proto_bind_4 _ _ => None 
 | |
|   | spec_function_proto_bind_5 _ => None
 | |
|   | spec_function_proto_bind_6 _ o => Some o 
 | |
|   | spec_function_proto_bind_7 _ o => Some o
 | |
| 
 | |
|   | spec_create_new_function_in  execution_ctx _ _ => None
 | |
| 
 | |
|   | spec_call _ _ _ => None
 | |
|   | spec_call_1 _ _ _ _ => None
 | |
| 
 | |
|   | spec_call_prealloc _ _ _ => None
 | |
| 
 | |
|   | spec_call_default _ _ _ => None
 | |
|   | spec_call_default_1 _ => None
 | |
|   | spec_call_default_2 _ => None
 | |
|   | spec_call_default_3 o => Some o
 | |
| 
 | |
|   | spec_construct _ _ => None
 | |
|   | spec_construct_1 _ _ _ => None
 | |
| 
 | |
|   | spec_construct_prealloc _ _ => None
 | |
| 
 | |
|   | spec_construct_default _ _ => None
 | |
|   | spec_construct_default_1 _ _ o => Some o
 | |
|   | spec_construct_default_2 _ o => Some o
 | |
| 
 | |
|   | spec_construct_1_after_bind _ _ _ => None
 | |
| 
 | |
|   | spec_construct_bool_1 o => Some o
 | |
| 
 | |
|   | spec_construct_number_1 o => Some o
 | |
| 
 | |
|   | spec_call_global_is_nan_1 o => Some o
 | |
|   | spec_call_global_is_finite_1 o => Some o
 | |
| 
 | |
|   | spec_call_object_call_1 _ _ => None
 | |
|   | spec_call_object_new_1 _ => None
 | |
|   | spec_call_object_get_proto_of_1 _ => None
 | |
|   | spec_call_object_is_extensible_1 _ => None
 | |
| 
 | |
|   | spec_call_object_define_props_1 _ _ => None
 | |
|   | spec_call_object_define_props_2 o _ => Some o
 | |
|   | spec_call_object_define_props_3 _ _ _ _ => None
 | |
|   | spec_call_object_define_props_4 o _ _ _ _ _ => Some o
 | |
|   | spec_call_object_define_props_5 _ _ _ _ _ y => out_of_specret y
 | |
|   | spec_call_object_define_props_6 _ _ => None
 | |
|   | spec_call_object_define_props_7 o _ _ => Some o
 | |
| 
 | |
|   | spec_call_object_create_1 _ _ => None
 | |
|   | spec_call_object_create_2 o _ _ => Some o
 | |
|   | spec_call_object_create_3 _ _ => None
 | |
| 
 | |
|   | spec_call_object_seal_1 _ => None
 | |
|   | spec_call_object_seal_2 _ _ => None
 | |
|   | spec_call_object_seal_3 _ _ _ y => out_of_specret y
 | |
|   | spec_call_object_seal_4 _ _ o => Some o
 | |
| 
 | |
|   | spec_call_object_is_sealed_1 _ => None
 | |
|   | spec_call_object_is_sealed_2 _ _ => None
 | |
|   | spec_call_object_is_sealed_3 _ _ y => out_of_specret y
 | |
| 
 | |
|   | spec_call_object_freeze_1 _ => None
 | |
|   | spec_call_object_freeze_2 _ _ => None
 | |
|   | spec_call_object_freeze_3 _ _ _ y => out_of_specret y
 | |
|   | spec_call_object_freeze_4 _ _ _ _ => None
 | |
|   | spec_call_object_freeze_5 _ _ o => Some o
 | |
| 
 | |
|   | spec_call_object_is_frozen_1 _ => None
 | |
|   | spec_call_object_is_frozen_2 _ _ => None
 | |
|   | spec_call_object_is_frozen_3 _ _ y => out_of_specret y
 | |
|   | spec_call_object_is_frozen_4 _ _ _ => None
 | |
|   | spec_call_object_is_frozen_5 _ _ _ => None
 | |
| 
 | |
| 
 | |
|   | spec_call_object_prevent_extensions_1 _ => None
 | |
| 
 | |
|   | spec_call_object_define_prop_1 _ _ _ => None
 | |
|   | spec_call_object_define_prop_2 _ o _ => Some o
 | |
|   | spec_call_object_define_prop_3 _ _ y => out_of_specret y
 | |
|   | spec_call_object_define_prop_4 _ o => Some o
 | |
| 
 | |
|   | spec_call_object_get_own_prop_descriptor_1 _ _ => None
 | |
|   | spec_call_object_get_own_prop_descriptor_2 _ o => Some o
 | |
| 
 | |
|   | spec_call_object_proto_to_string_1 _ => None
 | |
|   | spec_call_object_proto_to_string_2 o => Some o
 | |
| 
 | |
|   | spec_call_object_proto_has_own_prop_1 o _ => Some o
 | |
|   | spec_call_object_proto_has_own_prop_2 o _ => Some o
 | |
|   | spec_call_object_proto_has_own_prop_3 y => out_of_specret y
 | |
| 
 | |
|   | spec_call_object_proto_is_prototype_of_2_1 _ _ => None
 | |
|   | spec_call_object_proto_is_prototype_of_2_2 o _ => Some o
 | |
|   | spec_call_object_proto_is_prototype_of_2_3 _ _ => None
 | |
|   | spec_call_object_proto_is_prototype_of_2_4 _ _ => None
 | |
| 
 | |
|   | spec_call_object_proto_prop_is_enumerable_1 _ _ => None
 | |
|   | spec_call_object_proto_prop_is_enumerable_2 _ o => Some o
 | |
|   | spec_call_object_proto_prop_is_enumerable_3 o _ => Some o
 | |
|   | spec_call_object_proto_prop_is_enumerable_4 y => out_of_specret y
 | |
| 
 | |
|   | spec_call_array_new_1 _ => None
 | |
|   | spec_call_array_new_2 _ _ => None
 | |
|   | spec_call_array_new_3 _ _ _ => None
 | |
| 
 | |
|   | spec_call_array_new_single_1 _ => None
 | |
|   | spec_call_array_new_single_2 _ _ => None
 | |
|   | spec_call_array_new_single_3 _ _ y => out_of_specret y
 | |
|   | spec_call_array_new_single_4 _ _ => None
 | |
|   
 | |
|   | spec_call_array_is_array_1 _ => None
 | |
|   | spec_call_array_is_array_2_3 _ => None
 | |
| 
 | |
|   | spec_call_array_proto_join   o _ => Some o 
 | |
|   | spec_call_array_proto_join_1 _ o _ => Some o 
 | |
|   | spec_call_array_proto_join_2 _ y _ => out_of_specret y
 | |
|   | spec_call_array_proto_join_3 _ _ _ => None
 | |
|   | spec_call_array_proto_join_4 _ _ o => Some o
 | |
|   | spec_call_array_proto_join_5 _ _ _ y => out_of_specret y
 | |
| 
 | |
|   | spec_call_array_proto_join_elements _ _ _ _ _ => None
 | |
|   | spec_call_array_proto_join_elements_1 _ _ _ _ _ => None
 | |
|   | spec_call_array_proto_join_elements_2 _ _ _ _ _ y => out_of_specret y
 | |
| 
 | |
|   | spec_call_array_proto_to_string o => Some o
 | |
|   | spec_call_array_proto_to_string_1 _ o => Some o
 | |
| 
 | |
|   | spec_call_array_proto_pop_1 o => Some o
 | |
|   | spec_call_array_proto_pop_2 _ o => Some o
 | |
|   | spec_call_array_proto_pop_3 _ y  => out_of_specret y
 | |
|   | spec_call_array_proto_pop_3_empty_1 _ => None
 | |
|   | spec_call_array_proto_pop_3_empty_2 o => Some o
 | |
|   | spec_call_array_proto_pop_3_nonempty_1 _ _ => None
 | |
|   | spec_call_array_proto_pop_3_nonempty_2 _ o => Some o
 | |
|   | spec_call_array_proto_pop_3_nonempty_3 _ _ o => Some o
 | |
|   | spec_call_array_proto_pop_3_nonempty_4 _ _ _ o => Some o
 | |
|   | spec_call_array_proto_pop_3_nonempty_5 _ o => Some o
 | |
| 
 | |
|   | spec_call_array_proto_push_1 o _ => Some o
 | |
|   | spec_call_array_proto_push_2 _ _ o => Some o
 | |
|   | spec_call_array_proto_push_3 _ _ y => out_of_specret y
 | |
|   | spec_call_array_proto_push_4 _ _ _ => None
 | |
|   | spec_call_array_proto_push_4_nonempty_1 _ _ _ _ => None
 | |
|   | spec_call_array_proto_push_4_nonempty_2 _ _ _ _ o => Some o
 | |
|   | spec_call_array_proto_push_4_nonempty_3 _ _ _ _ o => Some o
 | |
|   | spec_call_array_proto_push_5 _ _ => None
 | |
|   | spec_call_array_proto_push_6 _ o => Some o
 | |
| 
 | |
|   | spec_call_string_non_empty o => Some o 
 | |
| 
 | |
|   | spec_construct_string_1 _ => None
 | |
|   | spec_construct_string_2 o => Some o
 | |
| 
 | |
|   | spec_call_bool_proto_to_string_1 o => Some o
 | |
|   | spec_call_bool_proto_value_of_1 _ => None
 | |
|   | spec_call_bool_proto_value_of_2 _ => None
 | |
| 
 | |
|   | spec_call_number_proto_to_string_1 _ _ => None
 | |
|   | spec_call_number_proto_to_string_2 _ o => Some o
 | |
|   | spec_call_number_proto_value_of_1 _ => None
 | |
| 
 | |
|   | spec_call_error_proto_to_string_1 _ => None
 | |
|   | spec_call_error_proto_to_string_2 _ o => Some o
 | |
|   | spec_call_error_proto_to_string_3 _ o => Some o
 | |
|   | spec_call_error_proto_to_string_4 _ _ o => Some o
 | |
|   | spec_call_error_proto_to_string_5 _ _ o => Some o
 | |
|   | spec_call_error_proto_to_string_6 _ _ o => Some o
 | |
| 
 | |
|   | spec_returns o => Some o
 | |
|   end.
 | |
| 
 | |
| Definition out_of_ext_stat (p : ext_stat) : option out :=
 | |
|   match p with
 | |
|   | stat_expr_1 (specret_out o) => Some o
 | |
|   | stat_expr_1 (specret_val _ _) => None
 | |
|   | stat_basic _ => None
 | |
| 
 | |
|   | stat_block_1 o _ => Some o
 | |
|   | stat_block_2 _ o => Some o
 | |
| 
 | |
|   | stat_label_1 _ o => Some o
 | |
| 
 | |
|   | stat_var_decl_1 o _ => Some o
 | |
|   | stat_var_decl_item _ => None
 | |
|   | stat_var_decl_item_1 _ y _ => out_of_specret y
 | |
|   | stat_var_decl_item_2 _ _ y => out_of_specret y
 | |
|   | stat_var_decl_item_3 _ o => Some o
 | |
| 
 | |
|   | stat_if_1 y _ _ => out_of_specret y
 | |
| 
 | |
|   | stat_while_1 _ _ _ _ => None
 | |
|   | stat_while_2 _ _ _ _ y => out_of_specret y
 | |
|   | stat_while_3 _ _ _ _ o => Some o
 | |
|   | stat_while_4 _ _ _ _ _ => None
 | |
|   | stat_while_5 _ _ _ _ _ => None
 | |
|   | stat_while_6 _ _ _ _ _ => None
 | |
| 
 | |
|   | stat_do_while_1 _ _ _ _ => None
 | |
|   | stat_do_while_2 _ _ _ _ o => Some o
 | |
|   | stat_do_while_3 _ _ _ _ _ => None
 | |
|   | stat_do_while_4 _ _ _ _ _ => None
 | |
|   | stat_do_while_5 _ _ _ _ _ => None
 | |
|   | stat_do_while_6 _ _ _ _ => None
 | |
|   | stat_do_while_7 _ _ _ _ y => out_of_specret y
 | |
| 
 | |
|   | stat_for_1 _ y _ _ _ => out_of_specret y
 | |
|   | stat_for_2 _ _ _ _ _ => None
 | |
|   | stat_for_3 _ _ _ y _ _ => out_of_specret y
 | |
|   | stat_for_4 _ _ _ _ _ => None
 | |
|   | stat_for_5 _ _ _ o _ _ => Some o
 | |
|   | stat_for_6 _ _ _ _ _ _ => None
 | |
|   | stat_for_7 _ _ _ _ _ _ => None
 | |
|   | stat_for_8 _ _ _ _ _ => None
 | |
|   | stat_for_9 _ _ _ _ y _ => out_of_specret y
 | |
|   | stat_for_var_1 o _ _ _ _ => Some o
 | |
| 
 | |
|   | stat_with_1 _ y => out_of_specret y
 | |
| 
 | |
|   | stat_throw_1 y => out_of_specret y
 | |
| 
 | |
|   | stat_return_1 y => out_of_specret y
 | |
| 
 | |
|   | stat_try_1 o _ _ => Some o
 | |
|   | stat_try_2 o _ _ _ => Some o
 | |
|   | stat_try_3 o _ => Some o
 | |
|   | stat_try_4 _ _ => None
 | |
|   | stat_try_5 _ o => Some o
 | |
| 
 | |
|   | stat_switch_1 y _ _ => out_of_specret y
 | |
|   | stat_switch_2 o _ => Some o
 | |
|   | stat_switch_nodefault_1 _ _ _=> None
 | |
|   | stat_switch_nodefault_2 y _ _ _ _  => out_of_specret y
 | |
|   | stat_switch_nodefault_3 _ _ _ _ _ => None
 | |
|   | stat_switch_nodefault_4 o _ => Some o
 | |
|   | stat_switch_nodefault_5 _ _ => None
 | |
|   | stat_switch_nodefault_6 _ o _ => Some o
 | |
| 
 | |
|   | stat_switch_default_1 _ _ _ _ _ => None
 | |
|   | stat_switch_default_A_1 _ _ _ _ _ _ => None 
 | |
|   | stat_switch_default_A_2 y _ _ _ _ _ _ => out_of_specret y
 | |
|   | stat_switch_default_A_3 _ _ _ _ _ _ _  => None
 | |
|   | stat_switch_default_A_4 _ _ _ _ _ _ => None
 | |
|   | stat_switch_default_A_5 _ o _ _ _ _ => Some o
 | |
|   | stat_switch_default_B_1 _ _ _ _ => None
 | |
|   | stat_switch_default_B_2 y _ _ _ _ _ => out_of_specret y
 | |
|   | stat_switch_default_B_3 _ _ _ _ _ _ => None
 | |
|   | stat_switch_default_B_4 o _ _ => Some o
 | |
| 
 | |
|   | stat_switch_default_5 _ _ _ _ => None
 | |
|   | stat_switch_default_6 o _ => Some o 
 | |
|   | stat_switch_default_7 _ _  => None
 | |
|   | stat_switch_default_8 _ o _ => Some o
 | |
| 
 | |
|   end.
 | |
| 
 | |
| Definition out_of_ext_prog (p : ext_prog) : option out :=
 | |
|   match p with
 | |
|   | prog_basic _ => None
 | |
|   | javascript_1 o _ => Some o
 | |
|   | prog_1 o _ => Some o
 | |
|   | prog_2 _ o => Some o
 | |
| 
 | |
|   end.
 | |
| 
 | |
| Definition out_of_ext_spec (es : ext_spec) : option out :=
 | |
|   match es with
 | |
|   | spec_to_int32 _ => None
 | |
|   | spec_to_int32_1 o => Some o
 | |
|   | spec_to_uint32 _ => None
 | |
|   | spec_to_uint32_1 o => Some o
 | |
|   | spec_expr_get_value_conv _ _ => None
 | |
|   | spec_expr_get_value_conv_1 _ y => out_of_specret y
 | |
|   | spec_expr_get_value_conv_2 o => Some o
 | |
|   | spec_convert_twice _ _ => None
 | |
|   | spec_convert_twice_1 o _ => Some o
 | |
|   | spec_convert_twice_2 _ o => Some o
 | |
|   | spec_list_expr _ => None
 | |
|   | spec_list_expr_1 _ _ => None
 | |
|   | spec_list_expr_2 _ y _ => out_of_specret y
 | |
|   | spec_to_descriptor _ => None
 | |
|   | spec_to_descriptor_1a _ _ => None
 | |
|   | spec_to_descriptor_1b o _ _ => Some o
 | |
|   | spec_to_descriptor_1c o _ _ => Some o
 | |
|   | spec_to_descriptor_2a _ _ => None
 | |
|   | spec_to_descriptor_2b o _ _ => Some o
 | |
|   | spec_to_descriptor_2c o _ _ => Some o
 | |
|   | spec_to_descriptor_3a _ _ => None
 | |
|   | spec_to_descriptor_3b o _ _ => Some o
 | |
|   | spec_to_descriptor_3c o _ _ => Some o
 | |
|   | spec_to_descriptor_4a _ _ => None
 | |
|   | spec_to_descriptor_4b o _ _ => Some o
 | |
|   | spec_to_descriptor_4c o _ _ => Some o
 | |
|   | spec_to_descriptor_5a _ _ => None
 | |
|   | spec_to_descriptor_5b o _ _ => Some o
 | |
|   | spec_to_descriptor_5c o _ _ => Some o
 | |
|   | spec_to_descriptor_6a _ _ => None
 | |
|   | spec_to_descriptor_6b o _ _=> Some o
 | |
|   | spec_to_descriptor_6c o _ _ => Some o
 | |
|   | spec_to_descriptor_7 _ _ => None
 | |
|   | spec_object_get_own_prop _ _ => None
 | |
|   | spec_object_get_own_prop_1 _ _ _ => None
 | |
|   | spec_object_get_own_prop_2 _ _ _ => None
 | |
|   | spec_object_get_prop _ _ => None
 | |
|   | spec_object_get_prop_1 _ _ _ => None
 | |
|   | spec_object_get_prop_2 _ _ y => out_of_specret y
 | |
|   | spec_object_get_prop_3 _ _ _ => None
 | |
|   | spec_get_value _ => None
 | |
|   | spec_get_value_ref_b_1 o => Some o
 | |
|   | spec_get_value_ref_c_1 o => Some o
 | |
|   | spec_expr_get_value _ => None
 | |
|   | spec_expr_get_value_1 o => Some o
 | |
|   | spec_lexical_env_get_identifier_ref _ _ _ => None
 | |
|   | spec_lexical_env_get_identifier_ref_1 _ _ _ _ => None
 | |
|   | spec_lexical_env_get_identifier_ref_2 _ _ _ _ o => Some o
 | |
|   | spec_error_spec _ => None
 | |
|   | spec_error_spec_1 o => Some o
 | |
|   | spec_args_obj_get_own_prop_1 _ _ y => out_of_specret y
 | |
|   | spec_args_obj_get_own_prop_2 _ _ _ _ y => out_of_specret y
 | |
|   | spec_args_obj_get_own_prop_3 _ o => Some o
 | |
|   | spec_args_obj_get_own_prop_4 _ => None
 | |
|   | spec_string_get_own_prop_1 _ _ y => out_of_specret y
 | |
|   | spec_string_get_own_prop_2 _ _ y => out_of_specret y
 | |
|   | spec_string_get_own_prop_3 _ _ o => Some o
 | |
|   | spec_string_get_own_prop_4 _ _ => None
 | |
|   | spec_string_get_own_prop_5 _ y => out_of_specret y
 | |
|   | spec_string_get_own_prop_6 _ _ _ => None
 | |
|   | spec_function_proto_apply_get_args _ _ _ => None
 | |
|   | spec_function_proto_apply_get_args_1 _ _ _ o => Some o 
 | |
|   | spec_function_proto_apply_get_args_2 _ _ _ o => Some o 
 | |
|   | spec_function_proto_apply_get_args_3 _ y => out_of_specret y
 | |
|   | spec_function_proto_bind_length _ _ => None
 | |
|   | spec_function_proto_bind_length_1 _ _ => None
 | |
|   | spec_function_proto_bind_length_2 _ o => Some o
 | |
|   | spec_function_proto_bind_length_3 y _ => out_of_specret y
 | |
|   | spec_call_array_proto_join_vtsfj _ _ => None
 | |
|   | spec_call_array_proto_join_vtsfj_1 _ o => Some o 
 | |
|   | spec_call_array_proto_join_vtsfj_2 _ o => Some o 
 | |
|   | spec_call_array_proto_join_vtsfj_3 o => Some o 
 | |
|   end.
 | |
| 
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Rules for propagating aborting expressions *)
 | |
| 
 | |
| (** Definition of a result of type normal *)
 | |
| 
 | |
| Definition res_is_normal R :=
 | |
|   res_type R = restype_normal.
 | |
| 
 | |
| (** Definition of aborting outcomes: diverging outcomes,
 | |
|     and terminating outcomes that are not of type "normal". *)
 | |
| 
 | |
| Inductive abort : out -> Prop :=
 | |
|   | abort_div :
 | |
|       abort out_div
 | |
|   | abort_not_normal : forall S R,
 | |
|       abrupt_res R ->
 | |
|       abort (out_ter S R).
 | |
| 
 | |
| (** Definition of the behaviors caught by an exception handler,
 | |
|     and thus not propagated by the generic abort rule *)
 | |
| 
 | |
| Inductive abort_intercepted_prog : ext_prog -> Prop :=
 | |
|   | abort_intercepted_prog_block_2 : forall S R rv,
 | |
|       abort_intercepted_prog (prog_2 rv (out_ter S R)).
 | |
| 
 | |
| Inductive abort_intercepted_stat : ext_stat -> Prop :=
 | |
| 
 | |
|   | abort_intercepted_stat_block_2 : forall S R rv,
 | |
|       abort_intercepted_stat (stat_block_2 rv (out_ter S R))
 | |
|   | abort_intercepted_stat_label_1 : forall lab rv S R,
 | |
|       R = res_intro restype_break rv lab ->
 | |
|       abort_intercepted_stat (stat_label_1 lab (out_ter S R))
 | |
|   | abort_intercepted_do_while_2 : forall labs e1 t2 rv S R,
 | |
|       res_label_in R labs ->
 | |
|       (res_type R = restype_continue \/ res_type R = restype_break) ->
 | |
|       abort_intercepted_stat (stat_do_while_2 labs t2 e1 rv (out_ter S R))
 | |
|   | abort_intercepted_while_3 : forall labs e1 t2 rv S R,
 | |
|       res_label_in R labs ->
 | |
|       (res_type R = restype_continue \/ res_type R = restype_break) ->
 | |
|       abort_intercepted_stat (stat_while_3 labs e1 t2 rv (out_ter S R))
 | |
|   | abort_intercepted_stat_try_1 : forall S R cb fo,
 | |
|       res_type R = restype_throw ->
 | |
|       abort_intercepted_stat (stat_try_1 (out_ter S R) (Some cb) fo)
 | |
|   | abort_intercepted_stat_try_3 : forall S R fo,
 | |
|       abort_intercepted_stat (stat_try_3 (out_ter S R) fo)
 | |
|   | abort_intercepted_stat_switch_2 : forall S R labs,
 | |
|       res_type R = restype_break ->
 | |
|       res_label_in R labs ->  
 | |
|       abort_intercepted_stat (stat_switch_2 (out_ter S R) labs)
 | |
|   | abort_intercepted_stat_switch_nodefault_6 : forall S rv R scs,
 | |
|       abrupt_res R ->
 | |
|       res_type R <> restype_throw -> 
 | |
|       abort_intercepted_stat (stat_switch_nodefault_6 rv (out_ter S R) scs)
 | |
|   | abort_intercepted_stat_switch_default_8 : forall S rv R scs,
 | |
|       abrupt_res R ->
 | |
|       res_type R <> restype_throw ->
 | |
|       abort_intercepted_stat (stat_switch_default_8 rv (out_ter S R) scs)
 | |
|   | abort_intercepted_stat_switch_default_A_5 : forall S rv R vi scs ts1 scs2,
 | |
|       abrupt_res R ->
 | |
|       res_type R <> restype_throw ->
 | |
|       abort_intercepted_stat (stat_switch_default_A_5 rv (out_ter S R) vi scs ts1 scs2)
 | |
|    | abort_intercepted_stat_for_6 : forall S0 S C labs rv R eo2 eo3 t,
 | |
|       abort_intercepted_stat (stat_for_6 labs rv eo2 eo3 t R)
 | |
|    | abort_intercepted_stat_for_7 : forall S0 S C labs rv R eo2 eo3 t,
 | |
|       abort_intercepted_stat (stat_for_7 labs rv eo2 eo3 t R)
 | |
| .
 | |
| 
 | |
| Inductive abort_intercepted_expr : ext_expr -> Prop :=
 | |
|   | abort_intercepted_expr_call_default_2 : forall S R,
 | |
|       res_type R = restype_return ->
 | |
|       abort_intercepted_expr (spec_call_default_3 (out_ter S R))
 | |
|   | abort_intercepted_expr_call_global_eval_3 : forall S R,
 | |
|       res_type R = restype_throw ->
 | |
|       abort_intercepted_expr (spec_call_global_eval_3 (out_ter S R)).
 | |
| 
 | |
| Inductive abort_intercepted_spec : ext_spec -> Prop :=
 | |
|   .
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Auxiliary definition used in identifier resolution *)
 | |
| 
 | |
| (** [spec_identifier_resolution C x] returns the extended expression
 | |
|     which needs to be evaluated in order to perform the lookup
 | |
|     of name [x] in the execution context [C]. Typically, a
 | |
|     reduction rule that performs such a lookup would have a
 | |
|     premise of the form [red_expr S C (identifier_resolution C x) o1]. *)
 | |
| 
 | |
| Definition spec_identifier_resolution C x :=
 | |
|   let lex := execution_ctx_lexical_env C in
 | |
|   let strict := execution_ctx_strict C in
 | |
|   spec_lexical_env_get_identifier_ref lex x strict.
 | |
| 
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Instantiation of arguments in function calls *)
 | |
| 
 | |
| Inductive arguments_from : list value -> list value -> Prop :=
 | |
|  | arguments_from_nil : forall Vs,
 | |
|       arguments_from Vs nil
 | |
|  | arguments_from_undef : forall Vs: list value,
 | |
|       arguments_from nil Vs ->
 | |
|       arguments_from nil (undef::Vs)
 | |
|  | arguments_from_cons : forall Vs1 Vs2 v,
 | |
|       arguments_from Vs1 Vs2 ->
 | |
|       arguments_from (v::Vs1) (v::Vs2).
 | |
| 
 | |
| Inductive arguments_first_and_rest : list value -> (value * list value) -> Prop :=
 | |
|  | arguments_f_a_r_from_nil  : arguments_first_and_rest nil (undef, nil)
 | |
|  | arguments_f_a_r_from_cons : forall v lv, 
 | |
|      arguments_first_and_rest (v :: lv) (v, lv).
 | |
| 
 | |
| Hint Constructors arguments_first_and_rest.
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Rules for delete_events. *)
 | |
| 
 | |
| (** [search_proto_chain S l x] returns the location l' of the first object 
 | |
|     in the prototype chain of l which contains property x. *)
 | |
| 
 | |
| Inductive search_proto_chain : state -> object_loc -> prop_name -> option object_loc -> Prop :=
 | |
|   | search_proto_chain_found : forall S l x,
 | |
|                                  object_has_property S l x ->
 | |
|                                  search_proto_chain S l x (Some l)
 | |
|   | search_proto_chain_not_found : forall S l x,
 | |
|                                      not (object_has_property S l x) ->
 | |
|                                      object_proto S l prim_null ->
 | |
|                                      search_proto_chain S l x None
 | |
|   | search_proto_chain_inductive : forall S l x v l' res,
 | |
|                                      not (object_has_property S l x) ->
 | |
|                                      object_proto S l (value_object l') ->
 | |
|                                      search_proto_chain S l' x res ->
 | |
|                                      search_proto_chain S l x res.
 | |
| 
 | |
| 
 | |
| (** [make_delete_event S l x ev] constructs a delete_event "ev" which
 | |
| records the deletion of the property (l,x) in the state S. *)
 | |
| 
 | |
| Inductive make_delete_event : state -> object_loc -> prop_name -> event -> Prop :=
 | |
|   | make_delete_event_intro : forall S l x res ev,
 | |
|                                 search_proto_chain S l x res ->
 | |
|                                 ev = delete_event l x res ->
 | |
|                                 make_delete_event S l x ev.
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Auxiliary definitions for the semantics of for-in. *)
 | |
| 
 | |
| (* LATER *)
 | |
| 
 | |
| 
 | |
| (**************************************************************)
 | |
| (** ** Implementation Defined Object *)
 | |
| 
 | |
| (** As stated in Section 2 of the ECMAScript specification, an
 | |
|   implementation can provide additionnal properties not described in
 | |
|   the specification. **)
 | |
| 
 | |
| (** As we are only describing the core of JavaScrip here, this
 | |
|   inductive shall be empty.  But one can found in the other branches
 | |
|   of this developpment some examples of non-empty instantiation of
 | |
|   this predicate. **)
 | |
| 
 | |
| Inductive implementation_prealloc : prealloc -> Prop :=
 | |
|   .
 | |
| 
 | |
| 
 | |
| (**************************************************************)
 | |
| (** Shorthand **)
 | |
| 
 | |
| Definition vret : state -> value -> specret value := ret (T:=value).
 | |
| Definition dret : state -> full_descriptor -> specret full_descriptor := ret (T:=full_descriptor).
 | |
| 
 |