open Datatypes open JsCommon open JsCommonAux open JsInit open JsInterpreterMonads (*open JsNumber*) open JsPreliminary open JsSyntax open JsSyntaxAux open LibBool open LibFunc open LibList open LibOption open LibProd open LibReflect open LibString open LibTactics open List0 open Shared (*------------JS preliminary -----------*) (* open JsCommon open JsSyntax open JsSyntaxAux open LibReflect open LibString open Shared *) (** val convert_number_to_bool : number -> bool **) let convert_number_to_bool n = if or_decidable (number_comparable n JsNumber.zero) (or_decidable (number_comparable n JsNumber.neg_zero) (number_comparable n JsNumber.nan)) then false else true (** val convert_string_to_bool : string -> bool **) let convert_string_to_bool s = if string_comparable s "" then false else true (* Arthur hack string.empty *) (** val convert_prim_to_boolean : prim -> bool **) let convert_prim_to_boolean _foo_ = match _foo_ with | Coq_prim_undef -> false | Coq_prim_null -> false | Coq_prim_bool b -> b | Coq_prim_number n -> convert_number_to_bool n | Coq_prim_string s -> convert_string_to_bool s (** val convert_value_to_boolean : value -> bool **) let convert_value_to_boolean _foo_ = match _foo_ with | Coq_value_prim p -> convert_prim_to_boolean p | Coq_value_object o -> true (** val convert_prim_to_number : prim -> number **) let convert_prim_to_number _foo_ = match _foo_ with | Coq_prim_undef -> JsNumber.nan | Coq_prim_null -> JsNumber.zero | Coq_prim_bool b -> if b then JsNumber.one else JsNumber.zero | Coq_prim_number n -> n | Coq_prim_string s -> JsNumber.from_string s (** val convert_number_to_integer : number -> number **) let convert_number_to_integer n = if number_comparable n JsNumber.nan then JsNumber.zero else if or_decidable (number_comparable n JsNumber.zero) (or_decidable (number_comparable n JsNumber.neg_zero) (or_decidable (number_comparable n JsNumber.infinity) (number_comparable n JsNumber.neg_infinity))) then n else (JsNumber.sign n) *. (JsNumber.floor (JsNumber.absolute n)) (** val convert_bool_to_string : bool -> string **) let convert_bool_to_string _foo_ = match _foo_ with | true -> "true" | false -> "false" (** val convert_prim_to_string : prim -> string **) let convert_prim_to_string _foo_ = match _foo_ with | Coq_prim_undef -> "undefined" | Coq_prim_null -> "null" | Coq_prim_bool b -> convert_bool_to_string b | Coq_prim_number n -> JsNumber.to_string n | Coq_prim_string s -> s (** val equality_test_for_same_type : coq_type -> value -> value -> bool **) let equality_test_for_same_type ty v1 v2 = match ty with | Coq_type_undef -> true | Coq_type_null -> true | Coq_type_bool -> value_comparable v1 v2 | Coq_type_number -> (match v1 with | Coq_value_prim p -> (match p with | Coq_prim_undef -> false | Coq_prim_null -> false | Coq_prim_bool b -> false | Coq_prim_number n1 -> (match v2 with | Coq_value_prim p0 -> (match p0 with | Coq_prim_undef -> false | Coq_prim_null -> false | Coq_prim_bool b -> false | Coq_prim_number n2 -> if number_comparable n1 JsNumber.nan then false else if number_comparable n2 JsNumber.nan then false else if and_decidable (number_comparable n1 JsNumber.zero) (number_comparable n2 JsNumber.neg_zero) then true else if and_decidable (number_comparable n1 JsNumber.neg_zero) (number_comparable n2 JsNumber.zero) then true else number_comparable n1 n2 | Coq_prim_string s -> false) | Coq_value_object o -> false) | Coq_prim_string s -> false) | Coq_value_object o -> false) | Coq_type_string -> value_comparable v1 v2 | Coq_type_object -> value_comparable v1 v2 (** val strict_equality_test : value -> value -> bool **) let strict_equality_test v1 v2 = let ty1 = type_of v1 in let ty2 = type_of v2 in if type_comparable ty1 ty2 then equality_test_for_same_type ty1 v1 v2 else false (** val inequality_test_number : number -> number -> prim **) let inequality_test_number n1 n2 = if or_decidable (number_comparable n1 JsNumber.nan) (number_comparable n2 JsNumber.nan) then Coq_prim_undef else if number_comparable n1 n2 then Coq_prim_bool false else if and_decidable (number_comparable n1 JsNumber.zero) (number_comparable n2 JsNumber.neg_zero) then Coq_prim_bool false else if and_decidable (number_comparable n1 JsNumber.neg_zero) (number_comparable n2 JsNumber.zero) then Coq_prim_bool false else if number_comparable n1 JsNumber.infinity then Coq_prim_bool false else if number_comparable n2 JsNumber.infinity then Coq_prim_bool true else if number_comparable n2 JsNumber.neg_infinity then Coq_prim_bool false else if number_comparable n1 JsNumber.neg_infinity then Coq_prim_bool true else Coq_prim_bool (n1 < n2) (** val inequality_test_string : string -> string -> bool **) (* ARTHUR hack let rec inequality_test_string s1 s2 = match s1 with | [] -> (match s2 with | [] -> false | a::s -> true) | c1::s1_2 -> (match s2 with | [] -> false | c2::s2_2 -> if ascii_comparable c1 c2 then inequality_test_string s1_2 s2_2 else lt_int_decidable (int_of_char c1) (int_of_char c2)) *) let inequality_test_string s1 s2 = (not (string_eq s1 s2)) (** val inequality_test_primitive : prim -> prim -> prim **) let inequality_test_primitive w1 w2 = match w1 with | Coq_prim_undef -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_null -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_bool b -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_number n -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_string s1 -> (match w2 with | Coq_prim_undef -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_null -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_bool b -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_number n -> inequality_test_number (convert_prim_to_number w1) (convert_prim_to_number w2) | Coq_prim_string s2 -> Coq_prim_bool (inequality_test_string s1 s2)) (** val typeof_prim : prim -> string **) let typeof_prim _foo_ = match _foo_ with | Coq_prim_undef -> "undefined" | Coq_prim_null -> "object" | Coq_prim_bool b -> "boolean" | Coq_prim_number n -> "number" | Coq_prim_string s -> "string" (** val string_of_propname : propname -> prop_name **) let string_of_propname _foo_ = match _foo_ with | Coq_propname_identifier s -> s | Coq_propname_string s -> s | Coq_propname_number n -> JsNumber.to_string n (*---------------------------------*) type __ = unit let __ = () (** val build_error : state -> value -> value -> result **) let build_error s vproto vmsg = let o = object_new vproto ("Error") in let (l, s_2) = object_alloc s o in if value_comparable vmsg (Coq_value_prim Coq_prim_undef) then result_out (Coq_out_ter (s_2, (res_val (Coq_value_object l)))) else (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) ("Need [to_string] (this function shall be put in [runs_type].)") (** val run_error : state -> native_error -> 'a1 specres **) let run_error s ne = if_object (build_error s (Coq_value_object (Coq_object_loc_prealloc (Coq_prealloc_native_error_proto ne))) (Coq_value_prim Coq_prim_undef)) (fun s_2 l -> Coq_result_some (Coq_specret_out (Coq_out_ter (s_2, (res_throw (Coq_resvalue_value (Coq_value_object l))))))) (** val out_error_or_void : state -> strictness_flag -> native_error -> result **) let out_error_or_void s str ne = if str then run_error s ne else result_out (out_void s) (** val out_error_or_cst : state -> strictness_flag -> native_error -> value -> result **) let out_error_or_cst s str ne v = if str then run_error s ne else result_out (Coq_out_ter (s, (res_val v))) (** val run_object_method : (coq_object -> 'a1) -> state -> object_loc -> 'a1 option **) let run_object_method proj s l = LibOption.map proj (object_binds_pickable_option s l) (*---DEBUG let run_object_method proj s l = let opt = object_binds_pickable_option s l in begin match opt with | None -> Debug.run_object_method l | _ -> () end; LibOption.map proj opt *) (** val run_object_heap_set_extensible : bool -> state -> object_loc -> state option **) let run_object_heap_set_extensible b s l = LibOption.map (fun o -> object_write s l (object_set_extensible o b)) (object_binds_pickable_option s l) (* DEBUG let run_object_heap_set_extensible b s l = let opt = object_binds_pickable_option s l in begin match opt with | None -> Debug.run_object_heap_set_extensible l | _ -> () end; LibOption.map (fun o -> object_write s l (object_set_extensible o b)) opt *) (** val object_has_prop : state -> execution_ctx -> object_loc -> prop_name -> result **) let rec object_has_prop s c l x = if_some (run_object_method object_has_prop_ s l) (fun b -> match b with Coq_builtin_has_prop_default -> if_spec (run_object_get_prop s c l x) (fun s1 d -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool (not_decidable (full_descriptor_comparable d Coq_full_descriptor_undef))))))) (** val object_get_builtin : state -> execution_ctx -> builtin_get -> value -> object_loc -> prop_name -> result **) and object_get_builtin s c b vthis l x = let_binding (fun s0 l0 -> if_spec (run_object_get_prop s0 c l0 x) (fun s1 d -> match d with | Coq_full_descriptor_undef -> res_ter s1 (res_val (Coq_value_prim Coq_prim_undef)) | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of ad -> res_ter s1 (res_val ad.attributes_data_value) | Coq_attributes_accessor_of aa -> (match aa.attributes_accessor_get with | Coq_value_prim p -> (match p with | Coq_prim_undef -> res_ter s1 (res_val (Coq_value_prim Coq_prim_undef)) | Coq_prim_null -> Coq_result_impossible | Coq_prim_bool b0 -> Coq_result_impossible | Coq_prim_number n -> Coq_result_impossible | Coq_prim_string s2 -> Coq_result_impossible) | Coq_value_object lf -> run_call s1 c lf vthis [])))) (fun def -> let_binding (fun s0 -> if_value (def s0 l) (fun s_2 v -> if spec_function_get_error_case_dec s_2 x v then run_error s_2 Coq_native_error_type else res_ter s_2 (res_val v))) (fun function0 -> match b with | Coq_builtin_get_default -> def s l | Coq_builtin_get_function -> function0 s | Coq_builtin_get_args_obj -> if_some (run_object_method object_parameter_map_ s l) (fun lmapo -> if_some (lmapo) (fun lmap -> if_spec (run_object_get_own_prop s c lmap x) (fun s0 d -> match d with | Coq_full_descriptor_undef -> function0 s0 | Coq_full_descriptor_some a -> run_object_get s0 c lmap x))))) (** val run_object_get : state -> execution_ctx -> object_loc -> prop_name -> result **) and run_object_get s c l x = if_some (run_object_method object_get_ s l) (fun b -> object_get_builtin s c b (Coq_value_object l) l x) (** val run_object_get_prop : state -> execution_ctx -> object_loc -> prop_name -> full_descriptor specres **) and run_object_get_prop s c l x = if_some (run_object_method object_get_prop_ s l) (fun b -> match b with Coq_builtin_get_prop_default -> if_spec (run_object_get_own_prop s c l x) (fun s1 d -> if full_descriptor_comparable d Coq_full_descriptor_undef then if_some (run_object_method object_proto_ s1 l) (fun proto -> match proto with | Coq_value_prim p -> (match p with | Coq_prim_null -> res_spec s1 Coq_full_descriptor_undef | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Found a non-null primitive value as a prototype in [run_object_get_prop].")) | Coq_value_object lproto -> run_object_get_prop s1 c lproto x) else res_spec s1 d)) (** val object_proto_is_prototype_of : state -> object_loc -> object_loc -> result **) and object_proto_is_prototype_of s l0 l = if_some (run_object_method object_proto_ s l) (fun b -> match b with | Coq_value_prim p -> (match p with | Coq_prim_null -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[run_object_method] returned a primitive in [object_proto_is_prototype_of_body].")) | Coq_value_object l_2 -> if object_loc_comparable l_2 l0 then result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool true))))) else object_proto_is_prototype_of s l0 l_2) (** val object_default_value : state -> execution_ctx -> object_loc -> preftype option -> result **) and object_default_value s c l prefo = if_some (run_object_method object_default_value_ s l) (fun b -> match b with Coq_builtin_default_value_default -> let gpref = unsome_default Coq_preftype_number prefo in let lpref = other_preftypes gpref in let sub0 = (fun s_2 x k -> (* this was a let_binding *) if_value (run_object_get s_2 c l x) (fun s1 vfo -> if_some (run_callable s1 vfo) (fun co -> match co with | Some b0 -> if_object (result_out (Coq_out_ter (s1, (res_val vfo)))) (fun s2 lfunc -> if_value (run_call s2 c lfunc (Coq_value_object l) []) (fun s3 v -> match v with | Coq_value_prim w -> result_out (Coq_out_ter (s3, (res_val (Coq_value_prim w)))) | Coq_value_object l0 -> k s3)) | None -> k s1))) in let_binding (method_of_preftype gpref) (fun gmeth -> sub0 s gmeth (fun s_2 -> let lmeth = method_of_preftype lpref in sub0 s_2 lmeth (fun s_3 -> run_error s_3 Coq_native_error_type)))) (** val to_primitive : state -> execution_ctx -> value -> preftype option -> result **) and to_primitive s c v prefo = match v with | Coq_value_prim w -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim w)))) | Coq_value_object l -> if_prim (object_default_value s c l prefo) (fun s0 r -> res_ter s0 (res_val (Coq_value_prim r))) (** val to_number : state -> execution_ctx -> value -> result **) and to_number s c _foo_ = match _foo_ with | Coq_value_prim w -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_number (convert_prim_to_number w)))))) | Coq_value_object l -> if_prim (to_primitive s c (Coq_value_object l) (Some Coq_preftype_number)) (fun s1 w -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_number (convert_prim_to_number w))))) (** val to_integer : state -> execution_ctx -> value -> result **) and to_integer s c v = if_number (to_number s c v) (fun s1 n -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_number (convert_number_to_integer n))))) (** val to_int32 : state -> execution_ctx -> value -> float specres **) and to_int32 s c v = if_number (to_number s c v) (fun s_2 n -> res_spec s_2 (JsNumber.to_int32 n)) (** val to_uint32 : state -> execution_ctx -> value -> float specres **) and to_uint32 s c v = if_number (to_number s c v) (fun s_2 n -> res_spec s_2 (JsNumber.to_uint32 n)) (** val to_string : state -> execution_ctx -> value -> result **) and to_string s c _foo_ = match _foo_ with | Coq_value_prim w -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_string (convert_prim_to_string w)))))) | Coq_value_object l -> if_prim (to_primitive s c (Coq_value_object l) (Some Coq_preftype_string)) (fun s1 w -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (convert_prim_to_string w))))) (** val object_can_put : state -> execution_ctx -> object_loc -> prop_name -> result **) and object_can_put s c l x = if_some (run_object_method object_can_put_ s l) (fun b -> match b with Coq_builtin_can_put_default -> if_spec (run_object_get_own_prop s c l x) (fun s1 d -> match d with | Coq_full_descriptor_undef -> if_some (run_object_method object_proto_ s1 l) (fun vproto -> match vproto with | Coq_value_prim p -> (match p with | Coq_prim_null -> if_some (run_object_method object_extensible_ s1 l) (fun b0 -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool b0)))) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Non-null primitive get as a prototype value in [object_can_put].")) | Coq_value_object lproto -> if_spec (run_object_get_prop s1 c lproto x) (fun s2 d_2 -> match d_2 with | Coq_full_descriptor_undef -> if_some (run_object_method object_extensible_ s2 l) (fun b0 -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool b0)))) | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of ad -> if_some (run_object_method object_extensible_ s2 l) (fun ext -> res_ter s2 (if ext then res_val (Coq_value_prim (Coq_prim_bool ad.attributes_data_writable)) else res_val (Coq_value_prim (Coq_prim_bool false)))) | Coq_attributes_accessor_of aa -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool (not_decidable (value_comparable aa.attributes_accessor_set (Coq_value_prim Coq_prim_undef))))))))) | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of ad -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool ad.attributes_data_writable))) | Coq_attributes_accessor_of aa -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool (not_decidable (value_comparable aa.attributes_accessor_set (Coq_value_prim Coq_prim_undef))))))))) (** val run_object_define_own_prop_array_loop : state -> execution_ctx -> object_loc -> float -> float -> descriptor -> bool -> bool -> (state -> prop_name -> descriptor -> strictness_flag -> __ specres) -> result **) and run_object_define_own_prop_array_loop s c l newLen oldLen newLenDesc newWritable throwcont def = if newLen < oldLen then let_binding (oldLen -. 1.) (fun oldLen_2 -> if_string (to_string s c (Coq_value_prim (Coq_prim_number (of_int oldLen_2)))) (fun s0 slen -> if_bool (object_delete s0 c l slen false) (fun s1 deleteSucceeded -> if not_decidable (bool_decidable deleteSucceeded) then let_binding (descriptor_with_value newLenDesc (Some (Coq_value_prim (Coq_prim_number (of_int (oldLen_2 +. 1.)))))) (fun newLenDesc0 -> let_binding (if not_decidable (bool_decidable newWritable) then descriptor_with_writable newLenDesc0 (Some false) else newLenDesc0) (fun newLenDesc1 -> if_bool (def s1 ("length") newLenDesc1 false) (fun s2 x -> out_error_or_cst s2 throwcont Coq_native_error_type (Coq_value_prim (Coq_prim_bool false))))) else run_object_define_own_prop_array_loop s1 c l newLen oldLen_2 newLenDesc newWritable throwcont def))) else if not_decidable (bool_decidable newWritable) then def s ("length") { descriptor_value = None; descriptor_writable = (Some false); descriptor_get = None; descriptor_set = None; descriptor_enumerable = None; descriptor_configurable = None } false else res_ter s (res_val (Coq_value_prim (Coq_prim_bool true))) (** val object_define_own_prop : state -> execution_ctx -> object_loc -> prop_name -> descriptor -> strictness_flag -> result **) and object_define_own_prop s c l x desc throwcont = let_binding (fun s0 throwcont0 -> out_error_or_cst s0 throwcont0 Coq_native_error_type (Coq_value_prim (Coq_prim_bool false))) (fun reject -> let_binding (fun s0 x0 desc0 throwcont0 -> if_spec (run_object_get_own_prop s0 c l x0) (fun s1 d -> if_some (run_object_method object_extensible_ s1 l) (fun ext -> match d with | Coq_full_descriptor_undef -> if ext then let_binding (if or_decidable (descriptor_is_generic_dec desc0) (descriptor_is_data_dec desc0) then Coq_attributes_data_of (attributes_data_of_descriptor desc0) else Coq_attributes_accessor_of (attributes_accessor_of_descriptor desc0)) (fun a -> if_some (object_heap_map_properties_pickable_option s1 l (fun p -> Heap.write p x0 a)) (fun s2 -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool true))))) else reject s1 throwcont0 | Coq_full_descriptor_some a -> let_binding (fun s2 a0 -> let a_2 = attributes_update a0 desc0 in if_some (object_heap_map_properties_pickable_option s2 l (fun p -> Heap.write p x0 a_2)) (fun s3 -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool true))))) (fun object_define_own_prop_write -> if descriptor_contains_dec (descriptor_of_attributes a) desc0 then res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool true))) else if attributes_change_enumerable_on_non_configurable_dec a desc0 then reject s1 throwcont0 else if descriptor_is_generic_dec desc0 then object_define_own_prop_write s1 a else if not_decidable (prop_eq_decidable (attributes_is_data_dec a) (descriptor_is_data_dec desc0)) then if attributes_configurable a then let_binding (match a with | Coq_attributes_data_of ad -> Coq_attributes_accessor_of (attributes_accessor_of_attributes_data ad) | Coq_attributes_accessor_of aa -> Coq_attributes_data_of (attributes_data_of_attributes_accessor aa)) (fun a_2 -> if_some (object_heap_map_properties_pickable_option s1 l (fun p -> Heap.write p x0 a_2)) (fun s2 -> object_define_own_prop_write s2 a_2)) else reject s1 throwcont0 else if and_decidable (attributes_is_data_dec a) (descriptor_is_data_dec desc0) then (match a with | Coq_attributes_data_of ad -> if attributes_change_data_on_non_configurable_dec ad desc0 then reject s1 throwcont0 else object_define_own_prop_write s1 a | Coq_attributes_accessor_of a0 -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("data is not accessor in [defineOwnProperty]")) else if and_decidable (not_decidable (attributes_is_data_dec a)) (descriptor_is_accessor_dec desc0) then (match a with | Coq_attributes_data_of a0 -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("accessor is not data in [defineOwnProperty]") | Coq_attributes_accessor_of aa -> if attributes_change_accessor_on_non_configurable_dec aa desc0 then reject s1 throwcont0 else object_define_own_prop_write s1 a) else (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("cases are mutually exclusives in [defineOwnProperty]"))))) (fun def -> if_some (run_object_method object_define_own_prop_ s l) (fun b -> match b with | Coq_builtin_define_own_prop_default -> def s x desc throwcont | Coq_builtin_define_own_prop_array -> if_spec (run_object_get_own_prop s c l ("length")) (fun s0 d -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("Array length property descriptor cannot be undefined.") | Coq_full_descriptor_some attr -> (match attr with | Coq_attributes_data_of a -> let_binding a.attributes_data_value (fun oldLen -> match oldLen with | Coq_value_prim w -> let_binding (JsNumber.to_uint32 (convert_prim_to_number w)) (fun oldLen0 -> let_binding desc.descriptor_value (fun descValueOpt -> if string_comparable x ("length") then (match descValueOpt with | Some descValue -> if_spec (to_uint32 s0 c descValue) (fun s1 newLen -> if_number (to_number s1 c descValue) (fun s2 newLenN -> if not_decidable (number_comparable (of_int newLen) newLenN) then run_error s2 Coq_native_error_range else let_binding (descriptor_with_value desc (Some (Coq_value_prim (Coq_prim_number (of_int newLen))))) (fun newLenDesc -> if le_int_decidable oldLen0 newLen then def s2 ("length") newLenDesc throwcont else if not_decidable (bool_decidable a.attributes_data_writable) then reject s2 throwcont else let_binding (match newLenDesc.descriptor_writable with | Some b0 -> if b0 then true else false | None -> true) (fun newWritable -> let_binding (if not_decidable (bool_decidable newWritable) then descriptor_with_writable newLenDesc (Some true) else newLenDesc) (fun newLenDesc0 -> if_bool (def s2 ("length") newLenDesc0 throwcont) (fun s3 succ -> if not_decidable (bool_decidable succ) then res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool false))) else run_object_define_own_prop_array_loop s3 c l newLen oldLen0 newLenDesc0 newWritable throwcont def)))))) | None -> def s0 ("length") desc throwcont) else if_spec (to_uint32 s0 c (Coq_value_prim (Coq_prim_string x))) (fun s1 ilen -> if_string (to_string s1 c (Coq_value_prim (Coq_prim_number (of_int ilen)))) (fun s2 slen -> if and_decidable (string_comparable x slen) (not_decidable ( ilen = 4294967295.)) then if_spec (to_uint32 s2 c (Coq_value_prim (Coq_prim_string x))) (fun s3 index -> if and_decidable (le_int_decidable oldLen0 index) (not_decidable (bool_decidable a.attributes_data_writable)) then reject s3 throwcont else if_bool (def s3 x desc false) (fun s4 b0 -> if not_decidable (bool_decidable b0) then reject s4 throwcont else if le_int_decidable oldLen0 index then let a0 = descriptor_with_value (descriptor_of_attributes (Coq_attributes_data_of a)) (Some (Coq_value_prim (Coq_prim_number (of_int (index +. 1.))))) in def s4 ("length") a0 false else res_ter s4 (res_val (Coq_value_prim (Coq_prim_bool true))))) else def s2 x desc throwcont)))) | Coq_value_object l0 -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("Spec asserts length of array is number.")) | Coq_attributes_accessor_of a -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("Array length property descriptor cannot be accessor."))) | Coq_builtin_define_own_prop_args_obj -> if_some (run_object_method object_parameter_map_ s l) (fun lmapo -> if_some (lmapo) (fun lmap -> if_spec (run_object_get_own_prop s c lmap x) (fun s0 d -> if_bool (def s0 x desc false) (fun s1 b0 -> if b0 then let_binding (fun s2 -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool true)))) (fun follow -> match d with | Coq_full_descriptor_undef -> follow s1 | Coq_full_descriptor_some a -> if descriptor_is_accessor_dec desc then if_bool (object_delete s1 c lmap x false) (fun s2 x0 -> follow s2) else let_binding (fun s2 -> if option_comparable bool_comparable desc.descriptor_writable (Some false) then if_bool (object_delete s2 c lmap x false) (fun s3 x0 -> follow s3) else follow s2) (fun follow0 -> match desc.descriptor_value with | Some v -> if_void (object_put s1 c lmap x v throwcont) (fun s2 -> follow0 s2) | None -> follow0 s1)) else reject s1 throwcont))))))) (** val run_to_descriptor : state -> execution_ctx -> value -> descriptor specres **) and run_to_descriptor s c _foo_ = match _foo_ with | Coq_value_prim p -> throw_result (run_error s Coq_native_error_type) | Coq_value_object l -> let sub0 = fun s0 desc name conv k -> if_bool (object_has_prop s0 c l name) (fun s1 has -> if neg has then k s1 desc else if_value (run_object_get s1 c l name) (fun s2 v0 -> if_spec (conv s2 v0 desc) (fun s3 r -> k s3 r))) (*let%bool (s1,has) = object_has_prop s0 c l name in if neg has then k s1 desc else let%value (s2,v0) = run_object_get s1 c l name in let%spec (s3,r) = conv s2 v0 desc in k s3 r))*) in sub0 s descriptor_intro_empty ("enumerable") (fun s1 v1 desc -> let b = convert_value_to_boolean v1 in res_spec s1 (descriptor_with_enumerable desc (Some b))) (fun s1_2 desc -> sub0 s1_2 desc ("configurable") (fun s2 v2 desc0 -> let b = convert_value_to_boolean v2 in res_spec s2 (descriptor_with_configurable desc0 (Some b))) (fun s2_2 desc0 -> sub0 s2_2 desc0 ("value") (fun s3 v3 desc1 -> res_spec s3 (descriptor_with_value desc1 (Some v3))) (fun s3_2 desc1 -> sub0 s3_2 desc1 ("writable") (fun s4 v4 desc2 -> let b = convert_value_to_boolean v4 in res_spec s4 (descriptor_with_writable desc2 (Some b))) (fun s4_2 desc2 -> sub0 s4_2 desc2 ("get") (fun s5 v5 desc3 -> if and_decidable (prop_eq_decidable (is_callable_dec s5 v5) (bool_decidable false)) (not_decidable (value_comparable v5 (Coq_value_prim Coq_prim_undef))) then throw_result (run_error s5 Coq_native_error_type) else res_spec s5 (descriptor_with_get desc3 (Some v5))) (fun s5_2 desc3 -> sub0 s5_2 desc3 ("set") (fun s6 v6 desc4 -> if and_decidable (prop_eq_decidable (is_callable_dec s6 v6) (bool_decidable false)) (not_decidable (value_comparable v6 (Coq_value_prim Coq_prim_undef))) then throw_result (run_error s6 Coq_native_error_type) else res_spec s6 (descriptor_with_set desc4 (Some v6))) (fun s7 desc4 -> if and_decidable (or_decidable (not_decidable (option_comparable value_comparable desc4.descriptor_get None)) (not_decidable (option_comparable value_comparable desc4.descriptor_set None))) (or_decidable (not_decidable (option_comparable value_comparable desc4.descriptor_value None)) (not_decidable (option_comparable bool_comparable desc4.descriptor_writable None))) then throw_result (run_error s7 Coq_native_error_type) else res_spec s7 desc4)))))) (** val prim_new_object : state -> prim -> result **) and prim_new_object s _foo_ = match _foo_ with | Coq_prim_bool b -> result_out (let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_bool_proto)) ("Boolean")) (fun o1 -> let_binding (object_with_primitive_value o1 (Coq_value_prim (Coq_prim_bool b))) (fun o -> let (l, s1) = object_alloc s o in Coq_out_ter (s1, (res_val (Coq_value_object l)))))) | Coq_prim_number n -> result_out (let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_number_proto)) ("Number")) (fun o1 -> let_binding (object_with_primitive_value o1 (Coq_value_prim (Coq_prim_number n))) (fun o -> let (l, s1) = object_alloc s o in Coq_out_ter (s1, (res_val (Coq_value_object l)))))) | Coq_prim_string s0 -> let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_string_proto)) ("String")) (fun o2 -> let_binding (object_with_get_own_property o2 Coq_builtin_get_own_prop_string) (fun o1 -> let_binding (object_with_primitive_value o1 (Coq_value_prim (Coq_prim_string s0))) (fun o -> let (l, s1) = object_alloc s o in if_some (object_heap_map_properties_pickable_option s1 l (fun p -> Heap.write p ("length") (Coq_attributes_data_of (attributes_data_intro_constant (Coq_value_prim (Coq_prim_number (number_of_int (strlength s0)))))))) (fun s_2 -> res_ter s_2 (res_val (Coq_value_object l)))))) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[prim_new_object] received an null or undef.") (** val to_object : state -> value -> result **) and to_object s _foo_ = match _foo_ with | Coq_value_prim w -> (match w with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b -> prim_new_object s w | Coq_prim_number n -> prim_new_object s w | Coq_prim_string s0 -> prim_new_object s w) | Coq_value_object l -> result_out (Coq_out_ter (s, (res_val (Coq_value_object l)))) (** val run_object_prim_value : state -> object_loc -> result **) and run_object_prim_value s l = if_some (run_object_method object_prim_value_ s l) (fun ov -> if_some (ov) (fun v -> res_ter s (res_val v))) (** val prim_value_get : state -> execution_ctx -> value -> prop_name -> result **) and prim_value_get s c v x = if_object (to_object s v) (fun s_2 l -> object_get_builtin s_2 c Coq_builtin_get_default v l x) (** val env_record_has_binding : state -> execution_ctx -> env_loc -> prop_name -> result **) and env_record_has_binding s c l x = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool (Heap.indom_decidable string_comparable ed x)))))) | Coq_env_record_object (l0, pt) -> object_has_prop s c l0 x) (** val lexical_env_get_identifier_ref : state -> execution_ctx -> lexical_env -> prop_name -> strictness_flag -> ref specres **) and lexical_env_get_identifier_ref s c x x0 str = match x with | [] -> res_spec s (ref_create_value (Coq_value_prim Coq_prim_undef) x0 str) | l :: x_2 -> if_bool (env_record_has_binding s c l x0) (fun s1 has -> if has then res_spec s1 (ref_create_env_loc l x0 str) else lexical_env_get_identifier_ref s1 c x_2 x0 str) (** val object_delete_default : state -> execution_ctx -> object_loc -> prop_name -> strictness_flag -> result **) and object_delete_default s c l x str = if_spec (run_object_get_own_prop s c l x) (fun s1 d -> match d with | Coq_full_descriptor_undef -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool true))) | Coq_full_descriptor_some a -> if attributes_configurable a then if_some (object_heap_map_properties_pickable_option s1 l (fun p -> Heap.rem string_comparable p x)) (fun s_2 -> res_ter s_2 (res_val (Coq_value_prim (Coq_prim_bool true)))) else out_error_or_cst s1 str Coq_native_error_type (Coq_value_prim (Coq_prim_bool false))) (** val object_delete : state -> execution_ctx -> object_loc -> prop_name -> strictness_flag -> result **) and object_delete s c l x str = if_some (run_object_method object_delete_ s l) (fun b -> match b with | Coq_builtin_delete_default -> object_delete_default s c l x str | Coq_builtin_delete_args_obj -> if_some (run_object_method object_parameter_map_ s l) (fun mo -> if_some (mo) (fun m -> if_spec (run_object_get_own_prop s c m x) (fun s1 d -> if_bool (object_delete_default s1 c l x str) (fun s2 b0 -> if b0 then (match d with | Coq_full_descriptor_undef -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool b0))) | Coq_full_descriptor_some a -> if_bool (object_delete s2 c m x false) (fun s3 b_2 -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool b0))))) else res_ter s2 (res_val (Coq_value_prim (Coq_prim_bool b0)))))))) (** val env_record_delete_binding : state -> execution_ctx -> env_loc -> prop_name -> result **) and env_record_delete_binding s c l x = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> (match Heap.read_option string_comparable ed x with | Some p -> let (mu, v) = p in (match mu with | Coq_mutability_uninitialized_immutable -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_mutability_immutable -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_mutability_nondeletable -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_mutability_deletable -> let s_2 = env_record_write s l (Coq_env_record_decl (decl_env_record_rem ed x)) in result_out (Coq_out_ter (s_2, (res_val (Coq_value_prim (Coq_prim_bool true)))))) | None -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool true)))))) | Coq_env_record_object (l0, pt) -> object_delete s c l0 x throw_false) (** val env_record_implicit_this_value : state -> env_loc -> value option **) and env_record_implicit_this_value s l = if_some_or_default (env_record_binds_pickable_option s l) None (fun e -> Some (match e with | Coq_env_record_decl ed -> Coq_value_prim Coq_prim_undef | Coq_env_record_object (l0, provide_this) -> if provide_this then Coq_value_object l0 else Coq_value_prim Coq_prim_undef)) (** val identifier_resolution : state -> execution_ctx -> prop_name -> ref specres **) and identifier_resolution s c x = let x0 = c.execution_ctx_lexical_env in let str = c.execution_ctx_strict in lexical_env_get_identifier_ref s c x0 x str (** val env_record_get_binding_value : state -> execution_ctx -> env_loc -> prop_name -> strictness_flag -> result **) and env_record_get_binding_value s c l x str = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> if_some (Heap.read_option string_comparable ed x) (fun rm -> let (mu, v) = rm in if mutability_comparable mu Coq_mutability_uninitialized_immutable then out_error_or_cst s str Coq_native_error_ref (Coq_value_prim Coq_prim_undef) else res_ter s (res_val v)) | Coq_env_record_object (l0, pt) -> if_bool (object_has_prop s c l0 x) (fun s1 has -> if has then run_object_get s1 c l0 x else out_error_or_cst s1 str Coq_native_error_ref (Coq_value_prim Coq_prim_undef))) (** val ref_get_value : state -> execution_ctx -> resvalue -> value specres **) and ref_get_value s c _foo_ = match _foo_ with | Coq_resvalue_empty -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_get_value] received an empty result.") | Coq_resvalue_value v -> res_spec s v | Coq_resvalue_ref r -> let_binding (fun tt -> match r.ref_base with | Coq_ref_base_type_value v -> if ref_kind_comparable (ref_kind_of r) Coq_ref_kind_primitive_base then if_value (prim_value_get s c v r.ref_name) (fun s2 v -> res_spec s2 v) else (match v with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_get_value] received a primitive value whose kind is not primitive.") | Coq_value_object l -> if_value (run_object_get s c l r.ref_name) (fun s2 v -> res_spec s2 v)) | Coq_ref_base_type_env_loc l -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_get_value] received a reference to a value whose base type is an environnment record.")) (fun for_base_or_object -> match ref_kind_of r with | Coq_ref_kind_null -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_get_value] received a reference whose base is [null].") | Coq_ref_kind_undef -> throw_result (run_error s Coq_native_error_ref) | Coq_ref_kind_primitive_base -> for_base_or_object () | Coq_ref_kind_object -> for_base_or_object () | Coq_ref_kind_env_record -> (match r.ref_base with | Coq_ref_base_type_value v -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_get_value] received a reference to an environnment record whose base type is a value.") | Coq_ref_base_type_env_loc l -> if_value (env_record_get_binding_value s c l r.ref_name r.ref_strict) (fun s2 v -> res_spec s2 v))) (* DEBUG and ref_get_value runs s c r = let res = ref_get_value runs s c r in match res with | JsInterpreterMonads.Coq_result_some crs -> begin match crs with | (Coq_specret_val (_,rs)) -> begin match rs with | Coq_value_prim cvp -> begin match cvp with | Coq_prim_undef -> Debug.ref_get_value_2 r; res | _ -> res end | _ -> res end | _ -> res end | _ -> res *) (** val run_expr_get_value : state -> execution_ctx -> expr -> value specres **) and run_expr_get_value s c e = if_success (run_expr s c e) (fun s0 rv -> ref_get_value s0 c rv) (** val object_put_complete : builtin_put -> state -> execution_ctx -> value -> object_loc -> prop_name -> value -> strictness_flag -> result_void **) and object_put_complete b s c vthis l x v str = match b with Coq_builtin_put_default -> if_bool (object_can_put s c l x) (fun s1 b0 -> if b0 then if_spec (run_object_get_own_prop s1 c l x) (fun s2 d -> let_binding (fun x0 -> if_spec (run_object_get_prop s2 c l x) (fun s3 d_2 -> let_binding (fun x1 -> match vthis with | Coq_value_prim wthis -> out_error_or_void s3 str Coq_native_error_type | Coq_value_object lthis -> let_binding (descriptor_intro_data v true true true) (fun desc -> if_success (object_define_own_prop s3 c l x desc str) (fun s4 rv -> res_void s4))) (fun follow_2 -> match d_2 with | Coq_full_descriptor_undef -> follow_2 () | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of a0 -> follow_2 () | Coq_attributes_accessor_of aa_2 -> (match aa_2.attributes_accessor_set with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s3 ("[object_put_complete] found a primitive in an `set\' accessor.") | Coq_value_object lfsetter -> if_success (run_call s3 c lfsetter vthis (v :: [])) (fun s4 rv -> res_void s4)))))) (fun follow -> match d with | Coq_full_descriptor_undef -> follow () | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of ad -> (match vthis with | Coq_value_prim wthis -> out_error_or_void s2 str Coq_native_error_type | Coq_value_object lthis -> let_binding { descriptor_value = (Some v); descriptor_writable = None; descriptor_get = None; descriptor_set = None; descriptor_enumerable = None; descriptor_configurable = None } (fun desc -> if_success (object_define_own_prop s2 c l x desc str) (fun s3 rv -> res_void s3))) | Coq_attributes_accessor_of a0 -> follow ()))) else out_error_or_void s1 str Coq_native_error_type) (** val object_put : state -> execution_ctx -> object_loc -> prop_name -> value -> strictness_flag -> result_void **) and object_put s c l x v str = if_some (run_object_method object_put_ s l) (fun b -> object_put_complete b s c (Coq_value_object l) l x v str) (** val env_record_set_mutable_binding : state -> execution_ctx -> env_loc -> prop_name -> value -> strictness_flag -> result_void **) and env_record_set_mutable_binding s c l x v str = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> if_some (Heap.read_option string_comparable ed x) (fun rm -> let (mu, v_old) = rm in if not_decidable (mutability_comparable mu Coq_mutability_immutable) then res_void (env_record_write_decl_env s l x mu v) else out_error_or_void s str Coq_native_error_type) | Coq_env_record_object (l0, pt) -> object_put s c l0 x v str) (** val prim_value_put : state -> execution_ctx -> prim -> prop_name -> value -> strictness_flag -> result_void **) and prim_value_put s c w x v str = if_object (to_object s (Coq_value_prim w)) (fun s1 l -> object_put_complete Coq_builtin_put_default s1 c (Coq_value_prim w) l x v str) (** val ref_put_value : state -> execution_ctx -> resvalue -> value -> result_void **) and ref_put_value s c rv v = match rv with | Coq_resvalue_empty -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_put_value] received an empty result.") | Coq_resvalue_value v0 -> run_error s Coq_native_error_ref | Coq_resvalue_ref r -> if ref_kind_comparable (ref_kind_of r) Coq_ref_kind_undef then if r.ref_strict then run_error s Coq_native_error_ref else object_put s c (Coq_object_loc_prealloc Coq_prealloc_global) r.ref_name v throw_false else if or_decidable (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_primitive_base) (or_decidable (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_null) (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_object)) then (match r.ref_base with | Coq_ref_base_type_value v_2 -> if ref_kind_comparable (ref_kind_of r) Coq_ref_kind_primitive_base then (match v_2 with | Coq_value_prim w -> prim_value_put s c w r.ref_name v r.ref_strict | Coq_value_object o -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_put_value] impossible case")) else (match v_2 with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_put_value] impossible case") | Coq_value_object l -> object_put s c l r.ref_name v r.ref_strict) | Coq_ref_base_type_env_loc l -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_put_value] contradicts ref_is_property")) else (match r.ref_base with | Coq_ref_base_type_value v0 -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[ref_put_value] impossible spec") | Coq_ref_base_type_env_loc l -> env_record_set_mutable_binding s c l r.ref_name v r.ref_strict) (** val env_record_create_mutable_binding : state -> execution_ctx -> env_loc -> prop_name -> bool option -> result_void **) and env_record_create_mutable_binding s c l x deletable_opt = let_binding (unsome_default false deletable_opt) (fun deletable -> if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> if Heap.indom_decidable string_comparable ed x then (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Already declared environnment record in [env_record_create_mutable_binding].") else let_binding (env_record_write_decl_env s l x (mutability_of_bool deletable) (Coq_value_prim Coq_prim_undef)) (fun s_2 -> res_void s_2) | Coq_env_record_object (l0, pt) -> if_bool (object_has_prop s c l0 x) (fun s1 has -> if has then (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Already declared binding in [env_record_create_mutable_binding].") else let_binding { attributes_data_value = (Coq_value_prim Coq_prim_undef); attributes_data_writable = true; attributes_data_enumerable = true; attributes_data_configurable = deletable } (fun a -> if_success (object_define_own_prop s1 c l0 x (descriptor_of_attributes (Coq_attributes_data_of a)) throw_true) (fun s2 rv -> res_void s2))))) (** val env_record_create_set_mutable_binding : state -> execution_ctx -> env_loc -> prop_name -> bool option -> value -> strictness_flag -> result_void **) and env_record_create_set_mutable_binding s c l x deletable_opt v str = if_void (env_record_create_mutable_binding s c l x deletable_opt) (fun s0 -> env_record_set_mutable_binding s0 c l x v str) (** val env_record_create_immutable_binding : state -> env_loc -> prop_name -> result_void **) and env_record_create_immutable_binding s l x = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> if Heap.indom_decidable string_comparable ed x then (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Already declared environnment record in [env_record_create_immutable_binding].") else res_void (env_record_write_decl_env s l x Coq_mutability_uninitialized_immutable (Coq_value_prim Coq_prim_undef)) | Coq_env_record_object (o, p) -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[env_record_create_immutable_binding] received an environnment record object.")) (** val env_record_initialize_immutable_binding : state -> env_loc -> prop_name -> value -> result_void **) and env_record_initialize_immutable_binding s l x v = if_some (env_record_binds_pickable_option s l) (fun e -> match e with | Coq_env_record_decl ed -> if_some (decl_env_record_pickable_option ed x) (fun evs -> if prod_comparable mutability_comparable value_comparable evs (Coq_mutability_uninitialized_immutable, (Coq_value_prim Coq_prim_undef)) then let_binding (env_record_write_decl_env s l x Coq_mutability_immutable v) (fun s_2 -> res_void s_2) else (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Non suitable binding in [env_record_initialize_immutable_binding].")) | Coq_env_record_object (o, p) -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("[env_record_initialize_immutable_binding] received an environnment record object.")) (** val call_object_new : state -> value -> result **) and call_object_new s v = match type_of v with | Coq_type_undef -> result_out (let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_object_proto)) ("Object")) (fun o -> let_binding (object_alloc s o) (fun p -> let (l, s_2) = p in Coq_out_ter (s_2, (res_val (Coq_value_object l)))))) | Coq_type_null -> result_out (let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_object_proto)) ("Object")) (fun o -> let_binding (object_alloc s o) (fun p -> let (l, s_2) = p in Coq_out_ter (s_2, (res_val (Coq_value_object l)))))) | Coq_type_bool -> to_object s v | Coq_type_number -> to_object s v | Coq_type_string -> to_object s v | Coq_type_object -> result_out (Coq_out_ter (s, (res_val v))) (** val array_args_map_loop : state -> execution_ctx -> object_loc -> value list -> float -> result_void **) and array_args_map_loop s c l args ind = match args with | [] -> res_void s | h :: rest -> if_some (object_heap_map_properties_pickable_option s l (fun p -> Heap.write p (JsNumber.to_string (of_int ind)) (Coq_attributes_data_of (attributes_data_intro_all_true h)))) (fun s_2 -> array_args_map_loop s_2 c l rest (ind +. 1.)) (** val string_of_prealloc : prealloc -> string **) and string_of_prealloc _foo_ = match _foo_ with | Coq_prealloc_global -> "global" | Coq_prealloc_global_eval -> "global_eval" | Coq_prealloc_global_parse_int -> "global_parse_int" | Coq_prealloc_global_parse_float -> "global_parse_float" | Coq_prealloc_global_is_finite -> "global_is_finite" | Coq_prealloc_global_is_nan -> "global_is_nan" | Coq_prealloc_global_decode_uri -> "global_decode_uri" | Coq_prealloc_global_decode_uri_component -> "global_decode_uri_component" | Coq_prealloc_global_encode_uri -> "global_encode_uri" | Coq_prealloc_global_encode_uri_component -> "global_encode_uri_component" | Coq_prealloc_object -> "object" | Coq_prealloc_object_get_proto_of -> "object_get_proto_of" | Coq_prealloc_object_get_own_prop_descriptor -> "object_get_own_prop_descriptor" | Coq_prealloc_object_get_own_prop_name -> "object_get_own_prop_name" | Coq_prealloc_object_create -> "object_create" | Coq_prealloc_object_define_prop -> "object_define_prop" | Coq_prealloc_object_define_props -> "object_define_props" | Coq_prealloc_object_seal -> "object_seal" | Coq_prealloc_object_freeze -> "object_freeze" | Coq_prealloc_object_prevent_extensions -> "object_prevent_extensions" | Coq_prealloc_object_is_sealed -> "object_is_sealed" | Coq_prealloc_object_is_frozen -> "object_is_frozen" | Coq_prealloc_object_is_extensible -> "object_is_extensible" | Coq_prealloc_object_keys -> "object_keys" | Coq_prealloc_object_keys_call -> "object_keys_call" | Coq_prealloc_object_proto -> "object_proto_" | Coq_prealloc_object_proto_to_string -> "object_proto_to_string" | Coq_prealloc_object_proto_value_of -> "object_proto_value_of" | Coq_prealloc_object_proto_has_own_prop -> "object_proto_has_own_prop" | Coq_prealloc_object_proto_is_prototype_of -> "object_proto_is_prototype_of" | Coq_prealloc_object_proto_prop_is_enumerable -> "object_proto_prop_is_enumerable" | Coq_prealloc_function -> "function" | Coq_prealloc_function_proto -> "function_proto" | Coq_prealloc_function_proto_to_string -> "function_proto_to_string" | Coq_prealloc_function_proto_apply -> "function_proto_apply" | Coq_prealloc_function_proto_call -> "function_proto_call" | Coq_prealloc_function_proto_bind -> "function_proto_bind" | Coq_prealloc_bool -> "bool" | Coq_prealloc_bool_proto -> "bool_proto" | Coq_prealloc_bool_proto_to_string -> "bool_proto_to_string" | Coq_prealloc_bool_proto_value_of -> "bool_proto_value_of" | Coq_prealloc_number -> "number" | Coq_prealloc_number_proto -> "number_proto" | Coq_prealloc_number_proto_to_string -> "number_proto_to_string" | Coq_prealloc_number_proto_value_of -> "number_proto_value_of" | Coq_prealloc_number_proto_to_fixed -> "number_proto_to_fixed" | Coq_prealloc_number_proto_to_exponential -> "number_proto_to_exponential" | Coq_prealloc_number_proto_to_precision -> "number_proto_to_precision" | Coq_prealloc_array -> "array" | Coq_prealloc_array_is_array -> "array_is_array" | Coq_prealloc_array_proto -> "array_proto" | Coq_prealloc_array_proto_to_string -> "array_proto_to_string" | Coq_prealloc_array_proto_join -> "array_proto_join" | Coq_prealloc_array_proto_pop -> "array_proto_pop" | Coq_prealloc_array_proto_push -> "array_proto_push" | Coq_prealloc_string -> "string" | Coq_prealloc_string_proto -> "string_proto" | Coq_prealloc_string_proto_to_string -> "string_proto_to_string" | Coq_prealloc_string_proto_value_of -> "string_proto_value_of" | Coq_prealloc_string_proto_char_at -> "string_proto_char_at" | Coq_prealloc_string_proto_char_code_at -> "string_proto_char_code_at" | Coq_prealloc_math -> "math" | Coq_prealloc_mathop m -> "mathop" | Coq_prealloc_date -> "date" | Coq_prealloc_regexp -> "regexp" | Coq_prealloc_error -> "error" | Coq_prealloc_error_proto -> "error_proto" | Coq_prealloc_native_error n -> "native_error" | Coq_prealloc_native_error_proto n -> "native_error_proto" | Coq_prealloc_error_proto_to_string -> "error_proto_to_string" | Coq_prealloc_throw_type_error -> "throw_type_error" | Coq_prealloc_json -> "json" (** val run_construct_prealloc : state -> execution_ctx -> prealloc -> value list -> result **) and run_construct_prealloc s c b args = match b with | Coq_prealloc_object -> let_binding (get_arg 0 args) (fun v -> call_object_new s v) | Coq_prealloc_bool -> result_out (let_binding (get_arg 0 args) (fun v -> let_binding (convert_value_to_boolean v) (fun b0 -> let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_bool_proto)) ("Boolean")) (fun o1 -> let_binding (object_with_primitive_value o1 (Coq_value_prim (Coq_prim_bool b0))) (fun o -> let_binding (object_alloc s o) (fun p -> let (l, s_2) = p in Coq_out_ter (s_2, (res_val (Coq_value_object l))))))))) | Coq_prealloc_number -> let_binding (fun s_2 v -> let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_number_proto)) ("Number")) (fun o1 -> let_binding (object_with_primitive_value o1 v) (fun o -> let (l, s1) = object_alloc s_2 o in result_out (Coq_out_ter (s1, (res_val (Coq_value_object l))))))) (fun follow -> if list_eq_nil_decidable args then follow s (Coq_value_prim (Coq_prim_number JsNumber.zero)) else let_binding (get_arg 0 args) (fun v -> if_number (to_number s c v) (fun x x0 -> follow x (Coq_value_prim (Coq_prim_number x0))))) | Coq_prealloc_array -> let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_array_proto)) ("Array")) (fun o_2 -> let_binding (object_for_array o_2 Coq_builtin_define_own_prop_array) (fun o -> let_binding (object_alloc s o) (fun p -> let (l, s_2) = p in let_binding (fun s_3 length0 -> if_some (object_heap_map_properties_pickable_option s_3 l (fun p0 -> Heap.write p0 ("length") (Coq_attributes_data_of { attributes_data_value = (Coq_value_prim (Coq_prim_number (of_int length0))); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = false }))) (fun s0 -> res_ter s0 (res_val (Coq_value_object l)))) (fun follow -> let_binding (LibList.length args) (fun arg_len -> if nat_eq arg_len 1 then let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p0 -> (match p0 with | Coq_prim_undef -> if_some (object_heap_map_properties_pickable_option s_2 l (fun p1 -> Heap.write p1 ("0") (Coq_attributes_data_of (attributes_data_intro_all_true v)))) (fun s0 -> follow s0 1.0) | Coq_prim_null -> if_some (object_heap_map_properties_pickable_option s_2 l (fun p1 -> Heap.write p1 ("0") (Coq_attributes_data_of (attributes_data_intro_all_true v)))) (fun s0 -> follow s0 1.0) | Coq_prim_bool b0 -> if_some (object_heap_map_properties_pickable_option s_2 l (fun p1 -> Heap.write p1 ("0") (Coq_attributes_data_of (attributes_data_intro_all_true v)))) (fun s0 -> follow s0 1.0) | Coq_prim_number vlen -> if_spec (to_uint32 s_2 c (Coq_value_prim (Coq_prim_number vlen))) (fun s0 ilen -> if number_comparable (of_int ilen) vlen then follow s0 ilen else run_error s0 Coq_native_error_range) | Coq_prim_string s0 -> if_some (object_heap_map_properties_pickable_option s_2 l (fun p1 -> Heap.write p1 ("0") (Coq_attributes_data_of (attributes_data_intro_all_true v)))) (fun s1 -> follow s1 1.0)) | Coq_value_object o0 -> if_some (object_heap_map_properties_pickable_option s_2 l (fun p0 -> Heap.write p0 ("0") (Coq_attributes_data_of (attributes_data_intro_all_true v)))) (fun s0 -> follow s0 1.0)) else if_some (object_heap_map_properties_pickable_option s_2 l (fun p0 -> Heap.write p0 ("length") (Coq_attributes_data_of { attributes_data_value = (Coq_value_prim (Coq_prim_number (number_of_int arg_len))); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = false }))) (fun s0 -> if_void (array_args_map_loop s0 c l args 0.) (fun s1 -> res_ter s1 (res_val (Coq_value_object l))))))))) | Coq_prealloc_string -> let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_string_proto)) ("String")) (fun o2 -> let_binding (object_with_get_own_property o2 Coq_builtin_get_own_prop_string) (fun o1 -> let_binding (fun s0 s1 -> let_binding (object_with_primitive_value o1 (Coq_value_prim (Coq_prim_string s1))) (fun o -> let (l, s2) = object_alloc s0 o in let_binding (attributes_data_intro_constant (Coq_value_prim (Coq_prim_number (number_of_int (strlength s1))))) (fun lenDesc -> if_some (object_heap_map_properties_pickable_option s2 l (fun p -> Heap.write p ("length") (Coq_attributes_data_of lenDesc))) (fun s_2 -> res_ter s_2 (res_val (Coq_value_object l)))))) (fun follow -> let_binding (LibList.length args) (fun arg_len -> if nat_eq arg_len 0 then follow s "" else let_binding (get_arg 0 args) (fun arg -> if_string (to_string s c arg) (fun s0 s1 -> follow s0 s1)))))) | Coq_prealloc_error -> let_binding (get_arg 0 args) (fun v -> build_error s (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_error_proto)) v) | Coq_prealloc_native_error ne -> let_binding (get_arg 0 args) (fun v -> build_error s (Coq_value_object (Coq_object_loc_prealloc (Coq_prealloc_native_error_proto ne))) v) | _ -> (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) (strappend ("Construct prealloc_") (strappend (string_of_prealloc b) (" not yet implemented."))) (** val run_construct_default : state -> execution_ctx -> object_loc -> value list -> __ specres **) and run_construct_default s c l args = if_value (run_object_get s c l ("prototype")) (fun s1 v1 -> let_binding (if type_comparable (type_of v1) Coq_type_object then v1 else Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_object_proto)) (fun vproto -> let_binding (object_new vproto ("Object")) (fun o -> let_binding (object_alloc s1 o) (fun p -> let (l_2, s2) = p in if_value (run_call s2 c l (Coq_value_object l_2) args) (fun s3 v2 -> let_binding (if type_comparable (type_of v2) Coq_type_object then v2 else Coq_value_object l_2) (fun vr -> res_ter s3 (res_val vr))))))) (** val run_construct : state -> execution_ctx -> construct -> object_loc -> value list -> result **) and run_construct s c co l args = match co with | Coq_construct_default -> run_construct_default s c l args | Coq_construct_after_bind -> if_some (run_object_method object_target_function_ s l) (fun otrg -> if_some (otrg) (fun target -> if_some (run_object_method object_construct_ s target) (fun oco -> match oco with | Some co0 -> if_some (run_object_method object_bound_args_ s l) (fun oarg -> if_some (oarg) (fun boundArgs -> let_binding (LibList.append boundArgs args) (fun arguments_ -> run_construct s c co0 target arguments_))) | None -> run_error s Coq_native_error_type))) | Coq_construct_prealloc b -> run_construct_prealloc s c b args (** val run_call_default : state -> execution_ctx -> object_loc -> result **) and run_call_default s c lf = let_binding (result_out (Coq_out_ter (s, (res_val (Coq_value_prim Coq_prim_undef))))) (fun def -> if_some (run_object_method object_code_ s lf) (fun oC -> match oC with | Some bd -> if list_eq_nil_decidable (prog_elements (funcbody_prog bd)) then def else if_success_or_return (run_prog s c (funcbody_prog bd)) (fun s_2 -> result_out (Coq_out_ter (s_2, (res_val (Coq_value_prim Coq_prim_undef))))) (fun s_2 rv -> result_out (Coq_out_ter (s_2, (res_normal rv)))) | None -> def)) (** val creating_function_object_proto : state -> execution_ctx -> object_loc -> result **) and creating_function_object_proto s c l = if_object (run_construct_prealloc s c Coq_prealloc_object []) (fun s1 lproto -> let_binding { attributes_data_value = (Coq_value_object l); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = true } (fun a1 -> if_bool (object_define_own_prop s1 c lproto ("constructor") (descriptor_of_attributes (Coq_attributes_data_of a1)) false) (fun s2 b -> let_binding { attributes_data_value = (Coq_value_object lproto); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = false } (fun a2 -> object_define_own_prop s2 c l ("prototype") (descriptor_of_attributes (Coq_attributes_data_of a2)) false)))) (** val creating_function_object : state -> execution_ctx -> string list -> funcbody -> lexical_env -> strictness_flag -> result **) and creating_function_object s c names bd x str = let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_function_proto)) ("Function")) (fun o -> let_binding (object_with_get o Coq_builtin_get_function) (fun o1 -> let_binding (object_with_invokation o1 (Some Coq_construct_default) (Some Coq_call_default) (Some Coq_builtin_has_instance_function)) (fun o2 -> let_binding (object_with_details o2 (Some x) (Some names) (Some bd) None None None None) (fun o3 -> let_binding (object_alloc s o3) (fun p -> let (l, s1) = p in let_binding { attributes_data_value = (Coq_value_prim (Coq_prim_number (number_of_int (LibList.length names)))); attributes_data_writable = false; attributes_data_enumerable = false; attributes_data_configurable = false } (fun a1 -> if_bool (object_define_own_prop s1 c l ("length") (descriptor_of_attributes (Coq_attributes_data_of a1)) false) (fun s2 b2 -> if_bool (creating_function_object_proto s2 c l) (fun s3 b3 -> if negb str then res_ter s3 (res_val (Coq_value_object l)) else let_binding (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_throw_type_error)) (fun vthrower -> let_binding { attributes_accessor_get = vthrower; attributes_accessor_set = vthrower; attributes_accessor_enumerable = false; attributes_accessor_configurable = false } (fun a2 -> if_bool (object_define_own_prop s3 c l ("caller") (descriptor_of_attributes (Coq_attributes_accessor_of a2)) false) (fun s4 b4 -> if_bool (object_define_own_prop s4 c l ("arguments") (descriptor_of_attributes (Coq_attributes_accessor_of a2)) false) (fun s5 b5 -> res_ter s5 (res_val (Coq_value_object l)))))))))))))) (** val binding_inst_formal_params : state -> execution_ctx -> env_loc -> value list -> string list -> strictness_flag -> result_void **) and binding_inst_formal_params s c l args names str = match names with | [] -> res_void s | argname :: names_2 -> let_binding (hd (Coq_value_prim Coq_prim_undef) args) (fun v -> let_binding (tl args) (fun args_2 -> if_bool (env_record_has_binding s c l argname) (fun s1 hb -> let_binding (fun s_2 -> if_void (env_record_set_mutable_binding s_2 c l argname v str) (fun s_3 -> binding_inst_formal_params s_3 c l args_2 names_2 str)) (fun follow -> if hb then follow s1 else if_void (env_record_create_mutable_binding s1 c l argname None) (fun s2 -> follow s2))))) (** val binding_inst_function_decls : state -> execution_ctx -> env_loc -> funcdecl list -> strictness_flag -> bool -> result_void **) and binding_inst_function_decls s c l fds str bconfig = match fds with | [] -> res_void s | fd :: fds_2 -> let_binding fd.funcdecl_body (fun fbd -> let_binding (funcbody_is_strict fbd) (fun str_fd -> let_binding fd.funcdecl_parameters (fun fparams -> let_binding fd.funcdecl_name (fun fname -> if_object (creating_function_object s c fparams fbd c.execution_ctx_variable_env str_fd) (fun s1 fo -> let_binding (fun s2 -> if_void (env_record_set_mutable_binding s2 c l fname (Coq_value_object fo) str) (fun s3 -> binding_inst_function_decls s3 c l fds_2 str bconfig)) (fun follow -> if_bool (env_record_has_binding s1 c l fname) (fun s2 has -> if has then if nat_eq l env_loc_global_env_record then if_spec (run_object_get_prop s2 c (Coq_object_loc_prealloc Coq_prealloc_global) fname) (fun s3 d -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s3 ("Undefined full descriptor in [binding_inst_function_decls].") | Coq_full_descriptor_some a -> if bool_decidable (attributes_configurable a) then let_binding { attributes_data_value = (Coq_value_prim Coq_prim_undef); attributes_data_writable = true; attributes_data_enumerable = true; attributes_data_configurable = bconfig } (fun a_2 -> if_bool (object_define_own_prop s3 c (Coq_object_loc_prealloc Coq_prealloc_global) fname (descriptor_of_attributes (Coq_attributes_data_of a_2)) true) (fun s0 x -> follow s0)) else if or_decidable (descriptor_is_accessor_dec (descriptor_of_attributes a)) (or_decidable (bool_comparable (attributes_writable a) false) (bool_comparable (attributes_enumerable a) false)) then run_error s3 Coq_native_error_type else follow s3) else follow s2 else if_void (env_record_create_mutable_binding s2 c l fname (Some bconfig)) (fun s3 -> follow s3)))))))) (** val make_arg_getter : state -> execution_ctx -> prop_name -> lexical_env -> result **) and make_arg_getter s c x x0 = let xbd = strappend ("return ") (strappend x (";")) in let bd = Coq_funcbody_intro ((Coq_prog_intro (true, ((Coq_element_stat (Coq_stat_return (Some (Coq_expr_identifier x)))) :: []))), xbd) in creating_function_object s c [] bd x0 true (** val make_arg_setter : state -> execution_ctx -> prop_name -> lexical_env -> result **) and make_arg_setter s c x x0 = let xparam = strappend x ("_arg") in let xbd = strappend x (strappend (" = ") (strappend xparam ";")) in let bd = Coq_funcbody_intro ((Coq_prog_intro (true, ((Coq_element_stat (Coq_stat_expr (Coq_expr_assign ((Coq_expr_identifier x), None, (Coq_expr_identifier xparam))))) :: []))), xbd) in creating_function_object s c (xparam :: []) bd x0 true (** val arguments_object_map_loop : state -> execution_ctx -> object_loc -> string list -> int -> value list -> lexical_env -> strictness_flag -> object_loc -> string list -> result_void **) and arguments_object_map_loop s c l xs len args x str lmap xsmap = (fun fO fS n -> if int_eq n 0 then fO () else fS (n-1)) (fun _ -> if list_eq_nil_decidable xsmap then res_void s else if_some (object_binds_pickable_option s l) (fun o -> let_binding (object_for_args_object o lmap Coq_builtin_get_args_obj Coq_builtin_get_own_prop_args_obj Coq_builtin_define_own_prop_args_obj Coq_builtin_delete_args_obj) (fun o_2 -> res_void (object_write s l o_2)))) (fun len_2 -> let_binding (take_drop_last args) (fun tdl -> let (rmlargs, largs) = tdl in let_binding (fun s0 xsmap0 -> arguments_object_map_loop s0 c l xs len_2 rmlargs x str lmap xsmap0) (fun arguments_object_map_loop_2 -> let_binding (attributes_data_intro_all_true largs) (fun a -> if_bool (object_define_own_prop s c l (convert_prim_to_string (Coq_prim_number (number_of_int len_2))) (descriptor_of_attributes (Coq_attributes_data_of a)) false) (fun s1 b -> if ge_nat_decidable len_2 (LibList.length xs) then arguments_object_map_loop_2 s1 xsmap else let dummy = "" in let_binding (nth_def dummy len_2 xs) (fun x0 -> if or_decidable (bool_comparable str true) (coq_Mem_decidable string_comparable x0 xsmap) then arguments_object_map_loop_2 s1 xsmap else if_object (make_arg_getter s1 c x0 x) (fun s2 lgetter -> if_object (make_arg_setter s2 c x0 x) (fun s3 lsetter -> let_binding { attributes_accessor_get = (Coq_value_object lgetter); attributes_accessor_set = (Coq_value_object lsetter); attributes_accessor_enumerable = false; attributes_accessor_configurable = true } (fun a_2 -> if_bool (object_define_own_prop s3 c lmap (convert_prim_to_string (Coq_prim_number (number_of_int len_2))) (descriptor_of_attributes (Coq_attributes_accessor_of a_2)) false) (fun s4 b_2 -> arguments_object_map_loop_2 s4 (x0 :: xsmap))))))))))) len (** val arguments_object_map : state -> execution_ctx -> object_loc -> string list -> value list -> lexical_env -> strictness_flag -> result_void **) and arguments_object_map s c l xs args x str = if_object (run_construct_prealloc s c Coq_prealloc_object []) (fun s_2 lmap -> arguments_object_map_loop s_2 c l xs (LibList.length args) args x str lmap []) (** val create_arguments_object : state -> execution_ctx -> object_loc -> string list -> value list -> lexical_env -> strictness_flag -> result **) and create_arguments_object s c lf xs args x str = let_binding (object_create_builtin (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_object_proto)) ("Arguments") Heap.empty) (fun o -> let_binding (object_alloc s o) (fun p -> let (l, s_2) = p in let_binding { attributes_data_value = (Coq_value_prim (Coq_prim_number (number_of_int (LibList.length args)))); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = true } (fun a -> if_bool (object_define_own_prop s_2 c l ("length") (descriptor_of_attributes (Coq_attributes_data_of a)) false) (fun s1 b -> if_void (arguments_object_map s1 c l xs args x str) (fun s2 -> if str then let_binding (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_throw_type_error)) (fun vthrower -> let_binding { attributes_accessor_get = vthrower; attributes_accessor_set = vthrower; attributes_accessor_enumerable = false; attributes_accessor_configurable = false } (fun a0 -> if_bool (object_define_own_prop s2 c l ("caller") (descriptor_of_attributes (Coq_attributes_accessor_of a0)) false) (fun s3 b_2 -> if_bool (object_define_own_prop s3 c l ("callee") (descriptor_of_attributes (Coq_attributes_accessor_of a0)) false) (fun s4 b_3 -> res_ter s4 (res_val (Coq_value_object l)))))) else let_binding { attributes_data_value = (Coq_value_object lf); attributes_data_writable = true; attributes_data_enumerable = false; attributes_data_configurable = true } (fun a0 -> if_bool (object_define_own_prop s2 c l ("callee") (descriptor_of_attributes (Coq_attributes_data_of a0)) false) (fun s3 b_2 -> res_ter s3 (res_val (Coq_value_object l))))))))) (** val binding_inst_arg_obj : state -> execution_ctx -> object_loc -> prog -> string list -> value list -> env_loc -> result_void **) and binding_inst_arg_obj s c lf p xs args l = let arguments_ = "arguments" in let_binding (prog_intro_strictness p) (fun str -> if_object (create_arguments_object s c lf xs args c.execution_ctx_variable_env str) (fun s1 largs -> if str then if_void (env_record_create_immutable_binding s1 l arguments_) (fun s2 -> env_record_initialize_immutable_binding s2 l arguments_ (Coq_value_object largs)) else env_record_create_set_mutable_binding s1 c l arguments_ None (Coq_value_object largs) false)) (** val binding_inst_var_decls : state -> execution_ctx -> env_loc -> string list -> bool -> strictness_flag -> result_void **) and binding_inst_var_decls s c l vds bconfig str = match vds with | [] -> res_void s | vd :: vds_2 -> let_binding (fun s0 -> binding_inst_var_decls s0 c l vds_2 bconfig str) (fun bivd -> if_bool (env_record_has_binding s c l vd) (fun s1 has -> if has then bivd s1 else if_void (env_record_create_set_mutable_binding s1 c l vd (Some bconfig) (Coq_value_prim Coq_prim_undef) str) (fun s2 -> bivd s2))) (** val execution_ctx_binding_inst : state -> execution_ctx -> codetype -> object_loc option -> prog -> value list -> result_void **) and execution_ctx_binding_inst s c ct funco p args = match c.execution_ctx_variable_env with | [] -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Empty [execution_ctx_variable_env] in [execution_ctx_binding_inst].") | l :: l0 -> let_binding (prog_intro_strictness p) (fun str -> let_binding (fun s_2 names -> let_binding (codetype_comparable ct Coq_codetype_eval) (fun bconfig -> let_binding (prog_funcdecl p) (fun fds -> if_void (binding_inst_function_decls s_2 c l fds str bconfig) (fun s1 -> if_bool (env_record_has_binding s1 c l ("arguments")) (fun s2 bdefined -> let_binding (fun s10 -> let vds = prog_vardecl p in binding_inst_var_decls s10 c l vds bconfig str) (fun follow2 -> match ct with | Coq_codetype_func -> (match funco with | Some func -> if bdefined then follow2 s2 else if_void (binding_inst_arg_obj s2 c func p names args l) (fun s3 -> follow2 s3) | None -> if bdefined then follow2 s2 else (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s2 ("Weird `arguments\' object in [execution_ctx_binding_inst].")) | Coq_codetype_global -> follow2 s2 | Coq_codetype_eval -> follow2 s2)))))) (fun follow -> match ct with | Coq_codetype_func -> (match funco with | Some func -> if_some (run_object_method object_formal_parameters_ s func) (fun nameso -> if_some (nameso) (fun names -> if_void (binding_inst_formal_params s c l args names str) (fun s_2 -> follow s_2 names))) | None -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Non coherent functionnal code type in [execution_ctx_binding_inst].")) | Coq_codetype_global -> (match funco with | Some o -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Non coherent non-functionnal code type in [execution_ctx_binding_inst].") | None -> follow s []) | Coq_codetype_eval -> (match funco with | Some o -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Non coherent non-functionnal code type in [execution_ctx_binding_inst].") | None -> follow s []))) (** val entering_func_code : state -> execution_ctx -> object_loc -> value -> value list -> result **) and entering_func_code s c lf vthis args = if_some (run_object_method object_code_ s lf) (fun bdo -> if_some (bdo) (fun bd -> let_binding (funcbody_is_strict bd) (fun str -> let_binding (fun s_2 vthis_2 -> if_some (run_object_method object_scope_ s_2 lf) (fun lexo -> if_some (lexo) (fun lex -> let_binding (lexical_env_alloc_decl s_2 lex) (fun p -> let (lex_2, s1) = p in let_binding (execution_ctx_intro_same lex_2 vthis_2 str) (fun c_2 -> if_void (execution_ctx_binding_inst s1 c_2 Coq_codetype_func (Some lf) (funcbody_prog bd) args) (fun s2 -> run_call_default s2 c_2 lf)))))) (fun follow -> if str then follow s vthis else (match vthis with | Coq_value_prim p -> (match p with | Coq_prim_undef -> follow s (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_global)) | Coq_prim_null -> follow s (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_global)) | Coq_prim_bool b -> if_value (to_object s vthis) (fun s2 v -> follow s2 v) | Coq_prim_number n -> if_value (to_object s vthis) (fun s2 v -> follow s2 v) | Coq_prim_string s0 -> if_value (to_object s vthis) (fun s2 v -> follow s2 v)) | Coq_value_object lthis -> follow s vthis))))) (** val run_object_get_own_prop : state -> execution_ctx -> object_loc -> prop_name -> full_descriptor specres **) and run_object_get_own_prop s c l x = if_some (run_object_method object_get_own_prop_ s l) (fun b -> let_binding (fun s_2 -> if_some (run_object_method object_properties_ s_2 l) (fun p -> res_spec s_2 (if_some_or_default (convert_option_attributes (Heap.read_option string_comparable p x)) Coq_full_descriptor_undef id))) (fun def -> match b with | Coq_builtin_get_own_prop_default -> def s | Coq_builtin_get_own_prop_args_obj -> if_spec (def s) (fun s1 d -> match d with | Coq_full_descriptor_undef -> res_spec s1 Coq_full_descriptor_undef | Coq_full_descriptor_some a -> if_some (run_object_method object_parameter_map_ s1 l) (fun lmapo -> if_some (lmapo) (fun lmap -> if_spec (run_object_get_own_prop s1 c lmap x) (fun s2 d0 -> let_binding (fun s_2 a0 -> res_spec s_2 (Coq_full_descriptor_some a0)) (fun follow -> match d0 with | Coq_full_descriptor_undef -> follow s2 a | Coq_full_descriptor_some amap -> if_value (run_object_get s2 c lmap x) (fun s3 v -> match a with | Coq_attributes_data_of ad -> follow s3 (Coq_attributes_data_of (attributes_data_with_value ad v)) | Coq_attributes_accessor_of aa -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s3 ("[run_object_get_own_prop]: received an accessor property descriptor in a point where the specification suppose it never happens."))))))) | Coq_builtin_get_own_prop_string -> if_spec (def s) (fun s0 d -> match d with | Coq_full_descriptor_undef -> if_spec (to_int32 s0 c (Coq_value_prim (Coq_prim_string x))) (fun s1 k -> if_string (to_string s1 c (Coq_value_prim (Coq_prim_number (JsNumber.absolute k)))) (fun s2 s3 -> if not_decidable (string_comparable x s3) then res_spec s2 Coq_full_descriptor_undef else if_string (run_object_prim_value s2 l) (fun s4 str -> if_spec (to_int32 s4 c (Coq_value_prim (Coq_prim_string x))) (fun s5 k0 -> let_binding (number_of_int (strlength str)) (fun len -> if le_int_decidable len k0 then res_spec s5 Coq_full_descriptor_undef else let resultStr = string_sub str (int_of_float k0) 1 (* TODO: check k0 is not negative *) in let a = { attributes_data_value = (Coq_value_prim (Coq_prim_string resultStr)); attributes_data_writable = false; attributes_data_enumerable = true; attributes_data_configurable = false } in res_spec s5 (Coq_full_descriptor_some (Coq_attributes_data_of a))))))) | Coq_full_descriptor_some a -> res_spec s0 d))) (** val run_function_has_instance : state -> object_loc -> value -> result **) and run_function_has_instance s lv _foo_ = match _foo_ with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object lo -> if_some (run_object_method object_proto_ s lv) (fun vproto -> match vproto with | Coq_value_prim p -> (match p with | Coq_prim_null -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool false))) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Primitive found in the prototype chain in [run_object_has_instance_loop].")) | Coq_value_object proto -> if object_loc_comparable proto lo then res_ter s (res_val (Coq_value_prim (Coq_prim_bool true))) else run_function_has_instance s proto (Coq_value_object lo)) (** val run_object_has_instance : state -> execution_ctx -> builtin_has_instance -> object_loc -> value -> result **) and run_object_has_instance s c b l v = match b with | Coq_builtin_has_instance_function -> (match v with | Coq_value_prim w -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_value_object lv -> if_value (run_object_get s c l ("prototype")) (fun s1 vproto -> match vproto with | Coq_value_prim p -> run_error s1 Coq_native_error_type | Coq_value_object lproto -> run_function_has_instance s1 lv (Coq_value_object lproto))) | Coq_builtin_has_instance_after_bind -> if_some (run_object_method object_target_function_ s l) (fun ol -> if_some (ol) (fun l0 -> if_some (run_object_method object_has_instance_ s l0) (fun ob -> match ob with | Some b0 -> run_object_has_instance s c b0 l0 v | None -> run_error s Coq_native_error_type))) (** val from_prop_descriptor : state -> execution_ctx -> full_descriptor -> result **) and from_prop_descriptor s c _foo_ = match _foo_ with | Coq_full_descriptor_undef -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim Coq_prim_undef)))) | Coq_full_descriptor_some a -> if_object (run_construct_prealloc s c Coq_prealloc_object []) (fun s1 l -> let_binding (fun s0 x -> let_binding (attributes_data_intro_all_true (Coq_value_prim (Coq_prim_bool (attributes_enumerable a)))) (fun a1 -> if_bool (object_define_own_prop s0 c l ("enumerable") (descriptor_of_attributes (Coq_attributes_data_of a1)) throw_false) (fun s0_2 x0 -> let_binding (attributes_data_intro_all_true (Coq_value_prim (Coq_prim_bool (attributes_configurable a)))) (fun a2 -> if_bool (object_define_own_prop s0_2 c l ("configurable") (descriptor_of_attributes (Coq_attributes_data_of a2)) throw_false) (fun s_2 x1 -> res_ter s_2 (res_val (Coq_value_object l))))))) (fun follow -> match a with | Coq_attributes_data_of ad -> let_binding (attributes_data_intro_all_true ad.attributes_data_value) (fun a1 -> if_bool (object_define_own_prop s1 c l ("value") (descriptor_of_attributes (Coq_attributes_data_of a1)) throw_false) (fun s2 x -> let_binding (attributes_data_intro_all_true (Coq_value_prim (Coq_prim_bool ad.attributes_data_writable))) (fun a2 -> if_bool (object_define_own_prop s2 c l ("writable") (descriptor_of_attributes (Coq_attributes_data_of a2)) throw_false) (fun s3 v -> follow s3 v)))) | Coq_attributes_accessor_of aa -> let_binding (attributes_data_intro_all_true aa.attributes_accessor_get) (fun a1 -> if_bool (object_define_own_prop s1 c l ("get") (descriptor_of_attributes (Coq_attributes_data_of a1)) throw_false) (fun s2 x -> let_binding (attributes_data_intro_all_true aa.attributes_accessor_set) (fun a2 -> if_bool (object_define_own_prop s2 c l ("set") (descriptor_of_attributes (Coq_attributes_data_of a2)) throw_false) (fun s3 v -> follow s3 v)))) )) (** val is_lazy_op : binary_op -> bool option **) and is_lazy_op _foo_ = match _foo_ with | Coq_binary_op_mult -> None | Coq_binary_op_div -> None | Coq_binary_op_mod -> None | Coq_binary_op_add -> None | Coq_binary_op_sub -> None | Coq_binary_op_left_shift -> None | Coq_binary_op_right_shift -> None | Coq_binary_op_unsigned_right_shift -> None | Coq_binary_op_lt -> None | Coq_binary_op_gt -> None | Coq_binary_op_le -> None | Coq_binary_op_ge -> None | Coq_binary_op_instanceof -> None | Coq_binary_op_in -> None | Coq_binary_op_equal -> None | Coq_binary_op_disequal -> None | Coq_binary_op_strict_equal -> None | Coq_binary_op_strict_disequal -> None | Coq_binary_op_bitwise_and -> None | Coq_binary_op_bitwise_or -> None | Coq_binary_op_bitwise_xor -> None | Coq_binary_op_and -> Some false | Coq_binary_op_or -> Some true | Coq_binary_op_coma -> None (** val get_puremath_op : binary_op -> (number -> number -> number) option **) and get_puremath_op _foo_ = match _foo_ with | Coq_binary_op_mult -> Some (fun x y -> x *. y) | Coq_binary_op_div -> Some (fun x y -> x /. y) | Coq_binary_op_mod -> Some JsNumber.fmod | Coq_binary_op_add -> None | Coq_binary_op_sub -> Some (fun x y -> x -. y) | Coq_binary_op_left_shift -> None | Coq_binary_op_right_shift -> None | Coq_binary_op_unsigned_right_shift -> None | Coq_binary_op_lt -> None | Coq_binary_op_gt -> None | Coq_binary_op_le -> None | Coq_binary_op_ge -> None | Coq_binary_op_instanceof -> None | Coq_binary_op_in -> None | Coq_binary_op_equal -> None | Coq_binary_op_disequal -> None | Coq_binary_op_strict_equal -> None | Coq_binary_op_strict_disequal -> None | Coq_binary_op_bitwise_and -> None | Coq_binary_op_bitwise_or -> None | Coq_binary_op_bitwise_xor -> None | Coq_binary_op_and -> None | Coq_binary_op_or -> None | Coq_binary_op_coma -> None (** val get_inequality_op : binary_op -> (bool * bool) option **) and get_inequality_op _foo_ = match _foo_ with | Coq_binary_op_mult -> None | Coq_binary_op_div -> None | Coq_binary_op_mod -> None | Coq_binary_op_add -> None | Coq_binary_op_sub -> None | Coq_binary_op_left_shift -> None | Coq_binary_op_right_shift -> None | Coq_binary_op_unsigned_right_shift -> None | Coq_binary_op_lt -> Some (false, false) | Coq_binary_op_gt -> Some (true, false) | Coq_binary_op_le -> Some (true, true) | Coq_binary_op_ge -> Some (false, true) | Coq_binary_op_instanceof -> None | Coq_binary_op_in -> None | Coq_binary_op_equal -> None | Coq_binary_op_disequal -> None | Coq_binary_op_strict_equal -> None | Coq_binary_op_strict_disequal -> None | Coq_binary_op_bitwise_and -> None | Coq_binary_op_bitwise_or -> None | Coq_binary_op_bitwise_xor -> None | Coq_binary_op_and -> None | Coq_binary_op_or -> None | Coq_binary_op_coma -> None (** val get_shift_op : binary_op -> (bool * (float -> float -> float)) option **) and get_shift_op _foo_ = match _foo_ with | Coq_binary_op_mult -> None | Coq_binary_op_div -> None | Coq_binary_op_mod -> None | Coq_binary_op_add -> None | Coq_binary_op_sub -> None | Coq_binary_op_left_shift -> Some (false, JsNumber.int32_left_shift) | Coq_binary_op_right_shift -> Some (false, JsNumber.int32_right_shift) | Coq_binary_op_unsigned_right_shift -> Some (true, JsNumber.uint32_right_shift) | Coq_binary_op_lt -> None | Coq_binary_op_gt -> None | Coq_binary_op_le -> None | Coq_binary_op_ge -> None | Coq_binary_op_instanceof -> None | Coq_binary_op_in -> None | Coq_binary_op_equal -> None | Coq_binary_op_disequal -> None | Coq_binary_op_strict_equal -> None | Coq_binary_op_strict_disequal -> None | Coq_binary_op_bitwise_and -> None | Coq_binary_op_bitwise_or -> None | Coq_binary_op_bitwise_xor -> None | Coq_binary_op_and -> None | Coq_binary_op_or -> None | Coq_binary_op_coma -> None (** val get_bitwise_op : binary_op -> (float -> float -> float) option **) and get_bitwise_op _foo_ = match _foo_ with | Coq_binary_op_mult -> None | Coq_binary_op_div -> None | Coq_binary_op_mod -> None | Coq_binary_op_add -> None | Coq_binary_op_sub -> None | Coq_binary_op_left_shift -> None | Coq_binary_op_right_shift -> None | Coq_binary_op_unsigned_right_shift -> None | Coq_binary_op_lt -> None | Coq_binary_op_gt -> None | Coq_binary_op_le -> None | Coq_binary_op_ge -> None | Coq_binary_op_instanceof -> None | Coq_binary_op_in -> None | Coq_binary_op_equal -> None | Coq_binary_op_disequal -> None | Coq_binary_op_strict_equal -> None | Coq_binary_op_strict_disequal -> None | Coq_binary_op_bitwise_and -> Some JsNumber.int32_bitwise_and | Coq_binary_op_bitwise_or -> Some JsNumber.int32_bitwise_or | Coq_binary_op_bitwise_xor -> Some JsNumber.int32_bitwise_xor | Coq_binary_op_and -> None | Coq_binary_op_or -> None | Coq_binary_op_coma -> None (** val run_equal : state -> execution_ctx -> value -> value -> result **) and run_equal s c v1 v2 = let conv_number = fun s0 v -> to_number s0 c v in let conv_primitive = fun s0 v -> to_primitive s0 c v None in let_binding (fun s0 v3 v4 k -> let ty1 = type_of v3 in let ty2 = type_of v4 in if type_comparable ty1 ty2 then result_out (Coq_out_ter (s0, (res_val (Coq_value_prim (Coq_prim_bool (equality_test_for_same_type ty1 v3 v4)))))) else k ty1 ty2) (fun checkTypesThen -> checkTypesThen s v1 v2 (fun ty1 ty2 -> let_binding (fun v3 f v4 -> if_value (f s v4) (fun s0 v2_2 -> run_equal s0 c v3 v2_2)) (fun dc_conv -> let so = fun b -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool b))))) in if and_decidable (type_comparable ty1 Coq_type_null) (type_comparable ty2 Coq_type_undef) then so true else if and_decidable (type_comparable ty1 Coq_type_undef) (type_comparable ty2 Coq_type_null) then so true else if and_decidable (type_comparable ty1 Coq_type_number) (type_comparable ty2 Coq_type_string) then dc_conv v1 conv_number v2 else if and_decidable (type_comparable ty1 Coq_type_string) (type_comparable ty2 Coq_type_number) then dc_conv v2 conv_number v1 else if type_comparable ty1 Coq_type_bool then dc_conv v2 conv_number v1 else if type_comparable ty2 Coq_type_bool then dc_conv v1 conv_number v2 else if and_decidable (or_decidable (type_comparable ty1 Coq_type_string) (type_comparable ty1 Coq_type_number)) (type_comparable ty2 Coq_type_object) then dc_conv v1 conv_primitive v2 else if and_decidable (type_comparable ty1 Coq_type_object) (or_decidable (type_comparable ty2 Coq_type_string) (type_comparable ty2 Coq_type_number)) then dc_conv v2 conv_primitive v1 else so false))) (** val convert_twice : ('a2 resultof -> (state -> 'a1 -> ('a1 * 'a1) specres) -> ('a1 * 'a1) specres) -> (state -> value -> 'a2 resultof) -> state -> value -> value -> ('a1 * 'a1) specres **) and convert_twice : 'a1 'a2 . ('a2 resultof -> (state -> 'a1 -> ('a1 * 'a1) specres) -> ('a1 * 'a1) specres) -> (state -> value -> 'a2 resultof) -> state -> value -> value -> ('a1 * 'a1) specres = fun ifv kC s v1 v2 -> ifv (kC s v1) (fun s1 vc1 -> ifv (kC s1 v2) (fun s2 vc2 -> res_spec s2 (vc1, vc2))) (** val convert_twice_primitive : state -> execution_ctx -> value -> value -> (prim * prim) specres **) and convert_twice_primitive s c v1 v2 = convert_twice ifx_prim (fun s0 v -> to_primitive s0 c v None) s v1 v2 (** val convert_twice_number : state -> execution_ctx -> value -> value -> (number * number) specres **) and convert_twice_number s c v1 v2 = convert_twice ifx_number (fun s0 v -> to_number s0 c v) s v1 v2 (** val convert_twice_string : state -> execution_ctx -> value -> value -> (string * string) specres **) and convert_twice_string s c v1 v2 = convert_twice ifx_string (fun s0 v -> to_string s0 c v) s v1 v2 (** val issome : 'a1 option -> bool **) and issome : 'a1 . 'a1 option -> bool = fun _foo_ -> match _foo_ with | Some t -> true | None -> false (** val run_binary_op : state -> execution_ctx -> binary_op -> value -> value -> result **) and run_binary_op s c op v1 v2 = if binary_op_comparable op Coq_binary_op_add then if_spec (convert_twice_primitive s c v1 v2) (fun s1 ww -> (* let%spec (s1,ww) = convert_twice_primitive s c v1 v2 in *) let (w1, w2) = ww in if or_decidable (type_comparable (type_of (Coq_value_prim w1)) Coq_type_string) (type_comparable (type_of (Coq_value_prim w2)) Coq_type_string) then if_spec (convert_twice_string s1 c (Coq_value_prim w1) (Coq_value_prim w2)) (fun s2 ss -> let (s3, s4) = ss in res_out (Coq_out_ter (s2, (res_val (Coq_value_prim (Coq_prim_string (strappend s3 s4))))))) else if_spec (convert_twice_number s1 c (Coq_value_prim w1) (Coq_value_prim w2)) (fun s2 nn -> let (n1, n2) = nn in res_out (Coq_out_ter (s2, (res_val (Coq_value_prim (Coq_prim_number (n1 +. n2)))))))) else if issome (get_puremath_op op) then if_some (get_puremath_op op) (fun mop -> if_spec (convert_twice_number s c v1 v2) (fun s1 nn -> let (n1, n2) = nn in res_out (Coq_out_ter (s1, (res_val (Coq_value_prim (Coq_prim_number (mop n1 n2)))))))) else if issome (get_shift_op op) then if_some (get_shift_op op) (fun so -> let (b_unsigned, f) = so in if_spec ((if b_unsigned then to_uint32 else to_int32) s c v1) (fun s1 k1 -> if_spec (to_uint32 s1 c v2) (fun s2 k2 -> let k2_2 = JsNumber.modulo_32 k2 in res_ter s2 (res_val (Coq_value_prim (Coq_prim_number (of_int (f k1 k2_2)))))))) else if issome (get_bitwise_op op) then if_some (get_bitwise_op op) (fun bo -> if_spec (to_int32 s c v1) (fun s1 k1 -> if_spec (to_int32 s1 c v2) (fun s2 k2 -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_number (of_int (bo k1 k2)))))))) else if issome (get_inequality_op op) then if_some (get_inequality_op op) (fun io -> let (b_swap, b_neg) = io in if_spec (convert_twice_primitive s c v1 v2) (fun s1 ww -> let (w1, w2) = ww in let_binding (if b_swap then (w2, w1) else (w1, w2)) (fun p -> let (wa, wb) = p in let wr = inequality_test_primitive wa wb in res_out (Coq_out_ter (s1, (if prim_comparable wr Coq_prim_undef then res_val (Coq_value_prim (Coq_prim_bool false)) else if and_decidable (bool_comparable b_neg true) (prim_comparable wr (Coq_prim_bool true)) then res_val (Coq_value_prim (Coq_prim_bool false)) else if and_decidable (bool_comparable b_neg true) (prim_comparable wr (Coq_prim_bool false)) then res_val (Coq_value_prim (Coq_prim_bool true)) else res_val (Coq_value_prim wr))))))) else if binary_op_comparable op Coq_binary_op_instanceof then (match v2 with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_has_instance_ s l) (fun b -> option_case (fun x -> run_error s Coq_native_error_type) (fun has_instance_id x -> run_object_has_instance s c has_instance_id l v1) b ())) else if binary_op_comparable op Coq_binary_op_in then (match v2 with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_string (to_string s c v1) (fun s2 x -> object_has_prop s2 c l x)) else if binary_op_comparable op Coq_binary_op_equal then run_equal s c v1 v2 else if binary_op_comparable op Coq_binary_op_disequal then if_bool (run_equal s c v1 v2) (fun s0 b0 -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool (negb b0))))) else if binary_op_comparable op Coq_binary_op_strict_equal then result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool (strict_equality_test v1 v2)))))) else if binary_op_comparable op Coq_binary_op_strict_disequal then result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool (negb (strict_equality_test v1 v2))))))) else if binary_op_comparable op Coq_binary_op_coma then result_out (Coq_out_ter (s, (res_val v2))) else (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Undealt lazy operator in [run_binary_op].") (** val run_prepost_op : unary_op -> ((number -> number) * bool) option **) and run_prepost_op _foo_ = match _foo_ with | Coq_unary_op_delete -> None | Coq_unary_op_void -> None | Coq_unary_op_typeof -> None | Coq_unary_op_post_incr -> Some (add_one, false) | Coq_unary_op_post_decr -> Some (sub_one, false) | Coq_unary_op_pre_incr -> Some (add_one, true) | Coq_unary_op_pre_decr -> Some (sub_one, true) | Coq_unary_op_add -> None | Coq_unary_op_neg -> None | Coq_unary_op_bitwise_not -> None | Coq_unary_op_not -> None (** val run_typeof_value : state -> value -> string **) and run_typeof_value s _foo_ = match _foo_ with | Coq_value_prim w -> typeof_prim w | Coq_value_object l -> if is_callable_dec s (Coq_value_object l) then "function" else "object" (** val run_unary_op : state -> execution_ctx -> unary_op -> expr -> result **) and run_unary_op s c op e = if prepost_unary_op_dec op then if_success (run_expr s c e) (fun s1 rv1 -> if_spec (ref_get_value s1 c rv1) (fun s2 v2 -> if_number (to_number s2 c v2) (fun s3 n1 -> if_some (run_prepost_op op) (fun po -> let (number_op, is_pre) = po in let_binding (number_op n1) (fun n2 -> let_binding (Coq_prim_number (if is_pre then n2 else n1)) (fun v -> if_void (ref_put_value s3 c rv1 (Coq_value_prim (Coq_prim_number n2))) (fun s4 -> result_out (Coq_out_ter (s4, (res_val (Coq_value_prim v))))))))))) else (match op with | Coq_unary_op_delete -> if_success (run_expr s c e) (fun s0 rv -> match rv with | Coq_resvalue_empty -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool true))) | Coq_resvalue_value v -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool true))) | Coq_resvalue_ref r -> if ref_kind_comparable (ref_kind_of r) Coq_ref_kind_undef then if r.ref_strict then run_error s0 Coq_native_error_syntax else res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool true))) else (match r.ref_base with | Coq_ref_base_type_value v -> if_object (to_object s0 v) (fun s1 l -> object_delete s1 c l r.ref_name r.ref_strict) | Coq_ref_base_type_env_loc l -> if r.ref_strict then run_error s0 Coq_native_error_syntax else env_record_delete_binding s0 c l r.ref_name)) | Coq_unary_op_typeof -> if_success (run_expr s c e) (fun s1 rv -> match rv with | Coq_resvalue_empty -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Empty result for a `typeof\' in [run_unary_op].") | Coq_resvalue_value v -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (run_typeof_value s1 v)))) | Coq_resvalue_ref r -> if ref_kind_comparable (ref_kind_of r) Coq_ref_kind_undef then res_ter s1 (res_val (Coq_value_prim (Coq_prim_string ("undefined")))) else if_spec (ref_get_value s1 c (Coq_resvalue_ref r)) (fun s2 v -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_string (run_typeof_value s2 v)))))) | _ -> if_spec (run_expr_get_value s c e) (fun s1 v -> match op with | Coq_unary_op_void -> res_ter s1 (res_val (Coq_value_prim Coq_prim_undef)) | Coq_unary_op_add -> to_number s1 c v | Coq_unary_op_neg -> if_number (to_number s1 c v) (fun s2 n -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_number (JsNumber.neg n))))) | Coq_unary_op_bitwise_not -> if_spec (to_int32 s1 c v) (fun s2 k -> res_ter s2 (res_val (Coq_value_prim (Coq_prim_number (of_int (JsNumber.int32_bitwise_not k)))))) | Coq_unary_op_not -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_bool (neg (convert_value_to_boolean v))))) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Undealt regular operator in [run_unary_op]."))) (** val create_new_function_in : state -> execution_ctx -> string list -> funcbody -> result **) and create_new_function_in s c args bd = creating_function_object s c args bd c.execution_ctx_lexical_env c.execution_ctx_strict (** val init_object : state -> execution_ctx -> object_loc -> propdefs -> result **) and init_object s c l _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_val (Coq_value_object l)))) | p :: pds_2 -> let (pn, pb) = p in let_binding (string_of_propname pn) (fun x -> let_binding (fun s1 desc -> if_success (object_define_own_prop s1 c l x desc false) (fun s2 rv -> init_object s2 c l pds_2)) (fun follows -> match pb with | Coq_propbody_val e0 -> if_spec (run_expr_get_value s c e0) (fun s1 v0 -> let desc = { descriptor_value = (Some v0); descriptor_writable = (Some true); descriptor_get = None; descriptor_set = None; descriptor_enumerable = (Some true); descriptor_configurable = (Some true) } in follows s1 desc) | Coq_propbody_get bd -> if_value (create_new_function_in s c [] bd) (fun s1 v0 -> let desc = { descriptor_value = None; descriptor_writable = None; descriptor_get = (Some v0); descriptor_set = None; descriptor_enumerable = (Some true); descriptor_configurable = (Some true) } in follows s1 desc) | Coq_propbody_set (args, bd) -> if_value (create_new_function_in s c args bd) (fun s1 v0 -> let desc = { descriptor_value = None; descriptor_writable = None; descriptor_get = None; descriptor_set = (Some v0); descriptor_enumerable = (Some true); descriptor_configurable = (Some true) } in follows s1 desc))) (** val run_array_element_list : state -> execution_ctx -> object_loc -> expr option list -> float -> result **) and run_array_element_list s c l oes n = match oes with | [] -> result_out (Coq_out_ter (s, (res_val (Coq_value_object l)))) | o :: oes_2 -> (match o with | Some e -> let_binding (fun s0 -> run_array_element_list s0 c l oes_2 0.) (fun loop_result -> if_spec (run_expr_get_value s c e) (fun s0 v -> if_value (run_object_get s0 c l ("length")) (fun s1 vlen -> if_spec (to_uint32 s1 c vlen) (fun s2 ilen -> if_string (to_string s2 c (Coq_value_prim (Coq_prim_number (ilen +. n)))) (fun s3 slen -> let_binding { attributes_data_value = v; attributes_data_writable = true; attributes_data_enumerable = true; attributes_data_configurable = true } (fun desc -> if_bool (object_define_own_prop s3 c l slen (descriptor_of_attributes (Coq_attributes_data_of desc)) false) (fun s4 x -> if_object (loop_result s4) (fun s5 l0 -> res_ter s5 (res_val (Coq_value_object l0)))))))))) | None -> let_binding (elision_head_count (None :: oes_2)) (fun firstIndex -> run_array_element_list s c l (elision_head_remove (None :: oes_2)) (number_of_int firstIndex))) (** val init_array : state -> execution_ctx -> object_loc -> expr option list -> result **) and init_array s c l oes = let_binding (elision_tail_remove oes) (fun elementList -> let_binding (elision_tail_count oes) (fun elisionLength -> if_object (run_array_element_list s c l elementList 0.) (fun s0 l0 -> if_value (run_object_get s0 c l0 ("length")) (fun s1 vlen -> if_spec (to_uint32 s1 c vlen) (fun s2 ilen -> if_spec (to_uint32 s2 c (Coq_value_prim (Coq_prim_number (ilen +. number_of_int elisionLength)))) (fun s3 len -> if_not_throw (object_put s3 c l0 ("length") (Coq_value_prim (Coq_prim_number (of_int len))) throw_false) (fun s4 x -> result_out (Coq_out_ter (s4, (res_val (Coq_value_object l0))))))))))) (** val run_var_decl_item : state -> execution_ctx -> prop_name -> expr option -> result **) and run_var_decl_item s c x _foo_ = match _foo_ with | Some e -> if_spec (identifier_resolution s c x) (fun s1 ir -> if_spec (run_expr_get_value s1 c e) (fun s2 v -> if_void (ref_put_value s2 c (Coq_resvalue_ref ir) v) (fun s3 -> result_out (Coq_out_ter (s3, (res_val (Coq_value_prim (Coq_prim_string x)))))))) | None -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_string x))))) (** val run_var_decl : state -> execution_ctx -> (prop_name * expr option) list -> result **) and run_var_decl s c _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, res_empty)) | y :: xeos_2 -> let (x, eo) = y in if_value (run_var_decl_item s c x eo) (fun s1 vname -> run_var_decl s1 c xeos_2) (** val run_list_expr : state -> execution_ctx -> value list -> expr list -> value list specres **) and run_list_expr s1 c vs _foo_ = match _foo_ with | [] -> res_spec s1 (rev vs) | e :: es_2 -> if_spec (run_expr_get_value s1 c e) (fun s2 v -> run_list_expr s2 c (v :: vs) es_2) (** val run_block : state -> execution_ctx -> stat list -> result **) and run_block s c _foo_ = match _foo_ with | [] -> res_ter s (res_normal Coq_resvalue_empty) | t :: ts_rev_2 -> if_success (run_block s c ts_rev_2) (fun s0 rv0 -> ifx_success_state rv0 (run_stat s0 c t) (fun x x0 -> result_out (Coq_out_ter (x, (res_normal x0))))) (** val run_expr_binary_op : state -> execution_ctx -> binary_op -> expr -> expr -> result **) and run_expr_binary_op s c op e1 e2 = match is_lazy_op op with | Some b_ret -> if_spec (run_expr_get_value s c e1) (fun s1 v1 -> let_binding (convert_value_to_boolean v1) (fun b1 -> if bool_comparable b1 b_ret then res_ter s1 (res_val v1) else if_spec (run_expr_get_value s1 c e2) (fun s2 v -> res_ter s2 (res_val v)))) | None -> if_spec (run_expr_get_value s c e1) (fun s1 v1 -> if_spec (run_expr_get_value s1 c e2) (fun s2 v2 -> run_binary_op s2 c op v1 v2)) (** val run_expr_access : state -> execution_ctx -> expr -> expr -> result **) and run_expr_access s c e1 e2 = if_spec (run_expr_get_value s c e1) (fun s1 v1 -> if_spec (run_expr_get_value s1 c e2) (fun s2 v2 -> if or_decidable (value_comparable v1 (Coq_value_prim Coq_prim_undef)) (value_comparable v1 (Coq_value_prim Coq_prim_null)) then run_error s2 Coq_native_error_type else if_string (to_string s2 c v2) (fun s3 x -> res_ter s3 (res_ref (ref_create_value v1 x c.execution_ctx_strict))))) (** val run_expr_assign : state -> execution_ctx -> binary_op option -> expr -> expr -> result **) and run_expr_assign s c opo e1 e2 = if_success (run_expr s c e1) (fun s1 rv1 -> let_binding (fun s0 rv_2 -> match rv_2 with | Coq_resvalue_empty -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("Non-value result in [run_expr_assign].") | Coq_resvalue_value v -> if_void (ref_put_value s0 c rv1 v) (fun s_2 -> result_out (Coq_out_ter (s_2, (res_val v)))) | Coq_resvalue_ref r -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("Non-value result in [run_expr_assign].")) (fun follow -> match opo with | Some op -> if_spec (ref_get_value s1 c rv1) (fun s2 v1 -> if_spec (run_expr_get_value s2 c e2) (fun s3 v2 -> if_success (run_binary_op s3 c op v1 v2) (fun s4 v -> follow s4 v))) | None -> if_spec (run_expr_get_value s1 c e2) (fun x x0 -> follow x (Coq_resvalue_value x0)))) (** val run_expr_function : state -> execution_ctx -> prop_name option -> string list -> funcbody -> result **) and run_expr_function s c fo args bd = match fo with | Some fn -> let_binding (lexical_env_alloc_decl s c.execution_ctx_lexical_env) (fun p -> let (lex_2, s_2) = p in let follow = fun l -> if_some (env_record_binds_pickable_option s_2 l) (fun e -> if_void (env_record_create_immutable_binding s_2 l fn) (fun s1 -> if_object (creating_function_object s1 c args bd lex_2 (funcbody_is_strict bd)) (fun s2 l0 -> if_void (env_record_initialize_immutable_binding s2 l fn (Coq_value_object l0)) (fun s3 -> result_out (Coq_out_ter (s3, (res_val (Coq_value_object l0)))))))) in destr_list lex_2 (fun x -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s_2 ("Empty lexical environnment allocated in [run_expr_function].")) (fun l x -> follow l) ()) | None -> let lex = c.execution_ctx_lexical_env in creating_function_object s c args bd lex (funcbody_is_strict bd) (** val entering_eval_code : state -> execution_ctx -> bool -> funcbody -> (state -> execution_ctx -> result) -> result **) and entering_eval_code s c direct bd k = let_binding (coq_or (funcbody_is_strict bd) ( direct && c.execution_ctx_strict)) (fun str -> let_binding (if direct then c else execution_ctx_initial str) (fun c_2 -> let_binding (if str then lexical_env_alloc_decl s c_2.execution_ctx_lexical_env else (c_2.execution_ctx_lexical_env, s)) (fun p -> let (lex, s_2) = p in let_binding (if str then execution_ctx_with_lex_same c_2 lex else c_2) (fun c1 -> let_binding (funcbody_prog bd) (fun p0 -> if_void (execution_ctx_binding_inst s_2 c1 Coq_codetype_eval None p0 []) (fun s1 -> k s1 c1)))))) (** val run_eval : state -> execution_ctx -> bool -> value list -> result **) and run_eval s c is_direct_call vs = match get_arg 0 vs with | Coq_value_prim p -> (match p with | Coq_prim_undef -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim Coq_prim_undef)))) | Coq_prim_null -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim Coq_prim_null)))) | Coq_prim_bool b -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool b))))) | Coq_prim_number n -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_number n))))) | Coq_prim_string s0 -> let_binding (coq_and is_direct_call c.execution_ctx_strict) (fun str -> match parse_pickable s0 str with | Some p0 -> entering_eval_code s c is_direct_call (Coq_funcbody_intro (p0, s0)) (fun s1 c_2 -> if_ter (run_prog s1 c_2 p0) (fun s2 r -> match r.res_type with | Coq_restype_normal -> if_empty_label s2 r (fun x -> match r.res_value with | Coq_resvalue_empty -> res_ter s2 (res_val (Coq_value_prim Coq_prim_undef)) | Coq_resvalue_value v -> res_ter s2 (res_val v) | Coq_resvalue_ref r0 -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s2 ("Reference found in the result of an `eval\' in [run_eval].")) | Coq_restype_throw -> res_ter s2 (res_throw r.res_value) | _ -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s2 ("Forbidden result type returned by an `eval\' in [run_eval]."))) | None -> run_error s Coq_native_error_syntax)) | Coq_value_object o -> result_out (Coq_out_ter (s, (res_val (Coq_value_object o)))) (** val run_expr_call : state -> execution_ctx -> expr -> expr list -> result **) and run_expr_call s c e1 e2s = let_binding (is_syntactic_eval e1) (fun is_eval_direct -> if_success (run_expr s c e1) (fun s1 rv -> if_spec (ref_get_value s1 c rv) (fun s2 f -> if_spec (run_list_expr s2 c [] e2s) (fun s3 vs -> match f with | Coq_value_prim p -> run_error s3 Coq_native_error_type | Coq_value_object l -> if is_callable_dec s3 (Coq_value_object l) then let_binding (fun vthis -> if object_loc_comparable l (Coq_object_loc_prealloc Coq_prealloc_global_eval) then run_eval s3 c is_eval_direct vs else run_call s3 c l vthis vs) (fun follow -> match rv with | Coq_resvalue_empty -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s3 ("[run_expr_call] unable to call an empty result.") | Coq_resvalue_value v -> follow (Coq_value_prim Coq_prim_undef) | Coq_resvalue_ref r -> (match r.ref_base with | Coq_ref_base_type_value v -> if or_decidable (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_primitive_base) (or_decidable (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_null) (ref_kind_comparable (ref_kind_of r) Coq_ref_kind_object)) then follow v else (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s3 ("[run_expr_call] unable to call a non-property function.") | Coq_ref_base_type_env_loc l0 -> if_some (env_record_implicit_this_value s3 l0) (fun v -> follow v))) else run_error s3 Coq_native_error_type)))) (** val run_expr_conditionnal : state -> execution_ctx -> expr -> expr -> expr -> result **) and run_expr_conditionnal s c e1 e2 e3 = if_spec (run_expr_get_value s c e1) (fun s1 v1 -> let_binding (convert_value_to_boolean v1) (fun b -> let_binding (if b then e2 else e3) (fun e -> if_spec (run_expr_get_value s1 c e) (fun s0 r -> res_ter s0 (res_val r))))) (** val run_expr_new : state -> execution_ctx -> expr -> expr list -> result **) and run_expr_new s c e1 e2s = if_spec (run_expr_get_value s c e1) (fun s1 v -> if_spec (run_list_expr s1 c [] e2s) (fun s2 args -> match v with | Coq_value_prim p -> run_error s2 Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_construct_ s2 l) (fun coo -> match coo with | Some co -> run_construct s2 c co l args | None -> run_error s2 Coq_native_error_type))) (** val run_stat_label : state -> execution_ctx -> label -> stat -> result **) and run_stat_label s c lab t = if_break (run_stat s c t) (fun s1 r1 -> result_out (Coq_out_ter (s1, (if label_comparable r1.res_label lab then res_normal r1.res_value else r1)))) (** val run_stat_with : state -> execution_ctx -> expr -> stat -> result **) and run_stat_with s c e1 t2 = if_spec (run_expr_get_value s c e1) (fun s1 v1 -> if_object (to_object s1 v1) (fun s2 l -> let_binding c.execution_ctx_lexical_env (fun lex -> let_binding (lexical_env_alloc_object s2 lex l provide_this_true) (fun p -> let (lex_2, s3) = p in let_binding (execution_ctx_with_lex c lex_2) (fun c_2 -> run_stat s3 c_2 t2))))) (** val run_stat_if : state -> execution_ctx -> expr -> stat -> stat option -> result **) and run_stat_if s c e1 t2 to0 = if_spec (run_expr_get_value s c e1) (fun s1 v1 -> let_binding (convert_value_to_boolean v1) (fun b -> if b then run_stat s1 c t2 else (match to0 with | Some t3 -> run_stat s1 c t3 | None -> result_out (Coq_out_ter (s1, (res_normal Coq_resvalue_empty)))))) (** val run_stat_while : state -> execution_ctx -> resvalue -> label_set -> expr -> stat -> result **) and run_stat_while s c rv labs e1 t2 = if_spec (run_expr_get_value s c e1) (fun s1 v1 -> let_binding (convert_value_to_boolean v1) (fun b -> if b then if_ter (run_stat s1 c t2) (fun s2 r -> let_binding (if not_decidable (resvalue_comparable r.res_value Coq_resvalue_empty) then r.res_value else rv) (fun rv_2 -> let_binding (fun x -> run_stat_while s2 c rv_2 labs e1 t2) (fun loop -> if or_decidable (not_decidable (restype_comparable r.res_type Coq_restype_continue)) (not_decidable (bool_decidable (res_label_in r labs))) then if and_decidable (restype_comparable r.res_type Coq_restype_break) (bool_decidable (res_label_in r labs)) then res_ter s2 (res_normal rv_2) else if not_decidable (restype_comparable r.res_type Coq_restype_normal) then res_ter s2 r else loop () else loop ()))) else res_ter s1 (res_normal rv))) (** val run_stat_switch_end : state -> execution_ctx -> resvalue -> switchclause list -> result **) and run_stat_switch_end s c rv _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_normal rv))) | y :: scs_2 -> match y with Coq_switchclause_intro (e, ts) -> ifx_success_state rv (run_block s c (rev ts)) (fun s1 rv1 -> run_stat_switch_end s1 c rv1 scs_2) (** val run_stat_switch_no_default : state -> execution_ctx -> value -> resvalue -> switchclause list -> result **) and run_stat_switch_no_default s c vi rv _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_normal rv))) | y :: scs_2 -> match y with Coq_switchclause_intro (e, ts) -> if_spec (run_expr_get_value s c e) (fun s1 v1 -> let_binding (strict_equality_test v1 vi) (fun b -> if b then if_success (run_block s1 c (rev ts)) (fun s2 rv2 -> run_stat_switch_end s2 c rv2 scs_2) else run_stat_switch_no_default s1 c vi rv scs_2)) (** val run_stat_switch_with_default_default : state -> execution_ctx -> stat list -> switchclause list -> result **) and run_stat_switch_with_default_default s c ts scs = if_success (run_block s c (rev ts)) (fun s1 rv -> run_stat_switch_end s1 c rv scs) (** val run_stat_switch_with_default_B : state -> execution_ctx -> value -> resvalue -> stat list -> switchclause list -> result **) and run_stat_switch_with_default_B s c vi rv ts0 scs = match scs with | [] -> run_stat_switch_with_default_default s c ts0 scs | y :: scs_2 -> match y with Coq_switchclause_intro (e, ts) -> if_spec (run_expr_get_value s c e) (fun s1 v1 -> let_binding (strict_equality_test v1 vi) (fun b -> if b then if_success (run_block s1 c (rev ts)) (fun s2 rv2 -> run_stat_switch_end s2 c rv2 scs_2) else run_stat_switch_with_default_B s1 c vi rv ts0 scs_2)) (** val run_stat_switch_with_default_A : state -> execution_ctx -> bool -> value -> resvalue -> switchclause list -> stat list -> switchclause list -> result **) and run_stat_switch_with_default_A s c found vi rv scs1 ts0 scs2 = match scs1 with | [] -> if found then run_stat_switch_with_default_default s c ts0 scs2 else run_stat_switch_with_default_B s c vi rv ts0 scs2 | y :: scs_2 -> match y with Coq_switchclause_intro (e, ts) -> let_binding (fun s0 -> ifx_success_state rv (run_block s0 c (rev ts)) (fun s1 rv0 -> run_stat_switch_with_default_A s1 c true vi rv0 scs_2 ts0 scs2)) (fun follow -> if found then follow s else if_spec (run_expr_get_value s c e) (fun s1 v1 -> let_binding (strict_equality_test v1 vi) (fun b -> if b then follow s1 else run_stat_switch_with_default_A s1 c false vi rv scs_2 ts0 scs2))) (** val run_stat_switch : state -> execution_ctx -> label_set -> expr -> switchbody -> result **) and run_stat_switch s c labs e sb = if_spec (run_expr_get_value s c e) (fun s1 vi -> let_binding (fun w -> if_success (if_break w (fun s2 r -> if res_label_in r labs then result_out (Coq_out_ter (s2, (res_normal r.res_value))) else result_out (Coq_out_ter (s2, r)))) (fun s0 r -> res_ter s0 (res_normal r))) (fun follow -> match sb with | Coq_switchbody_nodefault scs -> follow (run_stat_switch_no_default s1 c vi Coq_resvalue_empty scs) | Coq_switchbody_withdefault (scs1, ts, scs2) -> follow (run_stat_switch_with_default_A s1 c false vi Coq_resvalue_empty scs1 ts scs2))) (** val run_stat_do_while : state -> execution_ctx -> resvalue -> label_set -> expr -> stat -> result **) and run_stat_do_while s c rv labs e1 t2 = if_ter (run_stat s c t2) (fun s1 r -> let_binding (if resvalue_comparable r.res_value Coq_resvalue_empty then rv else r.res_value) (fun rv_2 -> let_binding (fun x -> if_spec (run_expr_get_value s1 c e1) (fun s2 v1 -> let_binding (convert_value_to_boolean v1) (fun b -> if b then run_stat_do_while s2 c rv_2 labs e1 t2 else res_ter s2 (res_normal rv_2)))) (fun loop -> if and_decidable (restype_comparable r.res_type Coq_restype_continue) (bool_decidable (res_label_in r labs)) then loop () else if and_decidable (restype_comparable r.res_type Coq_restype_break) (bool_decidable (res_label_in r labs)) then res_ter s1 (res_normal rv_2) else if not_decidable (restype_comparable r.res_type Coq_restype_normal) then res_ter s1 r else loop ()))) (** val run_stat_try : state -> execution_ctx -> stat -> (prop_name * stat) option -> stat option -> result **) and run_stat_try s c t1 t2o t3o = let_binding (fun s1 r -> match t3o with | Some t3 -> if_success (run_stat s1 c t3) (fun s2 rv_2 -> res_ter s2 r) | None -> res_ter s1 r) (fun finallycont -> if_any_or_throw (run_stat s c t1) finallycont (fun s1 v -> match t2o with | Some y -> let (x, t2) = y in let_binding c.execution_ctx_lexical_env (fun lex -> let_binding (lexical_env_alloc_decl s1 lex) (fun p -> let (lex_2, s_2) = p in (match lex_2 with | [] -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s_2 ("Empty lexical environnment in [run_stat_try].") | l :: oldlex -> if_void (env_record_create_set_mutable_binding s_2 c l x None v throw_irrelevant) (fun s2 -> let c_2 = execution_ctx_with_lex c lex_2 in if_ter (run_stat s2 c_2 t2) (fun s3 r -> finallycont s3 r))))) | None -> finallycont s1 (res_throw (Coq_resvalue_value v)))) (** val run_stat_throw : state -> execution_ctx -> expr -> result **) and run_stat_throw s c e = if_spec (run_expr_get_value s c e) (fun s1 v1 -> res_ter s1 (res_throw (Coq_resvalue_value v1))) (** val run_stat_return : state -> execution_ctx -> expr option -> result **) and run_stat_return s c _foo_ = match _foo_ with | Some e -> if_spec (run_expr_get_value s c e) (fun s1 v1 -> res_ter s1 (res_return (Coq_resvalue_value v1))) | None -> result_out (Coq_out_ter (s, (res_return (Coq_resvalue_value (Coq_value_prim Coq_prim_undef))))) (** val run_stat_for_loop : state -> execution_ctx -> label_set -> resvalue -> expr option -> expr option -> stat -> result **) and run_stat_for_loop s c labs rv eo2 eo3 t = let_binding (fun s0 -> if_ter (run_stat s0 c t) (fun s1 r -> let_binding (if not_decidable (resvalue_comparable r.res_value Coq_resvalue_empty) then r.res_value else rv) (fun rv_2 -> let_binding (fun s2 -> run_stat_for_loop s2 c labs rv_2 eo2 eo3 t) (fun loop -> if and_decidable (restype_comparable r.res_type Coq_restype_break) (bool_decidable (res_label_in r labs)) then res_ter s1 (res_normal rv_2) else if or_decidable (restype_comparable r.res_type Coq_restype_normal) (and_decidable (restype_comparable r.res_type Coq_restype_continue) (bool_decidable (res_label_in r labs))) then (match eo3 with | Some e3 -> if_spec (run_expr_get_value s1 c e3) (fun s2 v3 -> loop s2) | None -> loop s1) else res_ter s1 r)))) (fun follows -> match eo2 with | Some e2 -> if_spec (run_expr_get_value s c e2) (fun s0 v2 -> let_binding (convert_value_to_boolean v2) (fun b -> if b then follows s0 else res_ter s0 (res_normal rv))) | None -> follows s) (** val run_stat_for : state -> execution_ctx -> label_set -> expr option -> expr option -> expr option -> stat -> result **) and run_stat_for s c labs eo1 eo2 eo3 t = let follows = fun s0 -> run_stat_for_loop s0 c labs Coq_resvalue_empty eo2 eo3 t in (match eo1 with | Some e1 -> if_spec (run_expr_get_value s c e1) (fun s0 v1 -> follows s0) | None -> follows s) (** val run_stat_for_var : state -> execution_ctx -> label_set -> (string * expr option) list -> expr option -> expr option -> stat -> result **) and run_stat_for_var s c labs ds eo2 eo3 t = if_ter (run_stat s c (Coq_stat_var_decl ds)) (fun s0 r -> run_stat_for_loop s0 c labs Coq_resvalue_empty eo2 eo3 t) (** val run_expr : state -> execution_ctx -> expr -> result **) and run_expr s c _term_ = match _term_ with | Coq_expr_this -> result_out (Coq_out_ter (s, (res_val c.execution_ctx_this_binding))) | Coq_expr_identifier x -> if_spec (identifier_resolution s c x) (fun s0 r -> res_ter s0 (res_ref r)) | Coq_expr_literal i -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (convert_literal_to_prim i))))) | Coq_expr_object pds -> if_object (run_construct_prealloc s c Coq_prealloc_object []) (fun s1 l -> init_object s1 c l pds) | Coq_expr_array oes -> if_object (run_construct_prealloc s c Coq_prealloc_array []) (fun s1 l -> init_array s1 c l oes) | Coq_expr_function (fo, args, bd) -> run_expr_function s c fo args bd | Coq_expr_access (e1, e2) -> run_expr_access s c e1 e2 | Coq_expr_member (e1, f) -> run_expr s c (Coq_expr_access (e1, (Coq_expr_literal (Coq_literal_string f)))) | Coq_expr_new (e1, e2s) -> run_expr_new s c e1 e2s | Coq_expr_call (e1, e2s) -> run_expr_call s c e1 e2s | Coq_expr_unary_op (op, e0) -> run_unary_op s c op e0 | Coq_expr_binary_op (e1, op, e2) -> run_expr_binary_op s c op e1 e2 | Coq_expr_conditional (e1, e2, e3) -> run_expr_conditionnal s c e1 e2 e3 | Coq_expr_assign (e1, opo, e2) -> run_expr_assign s c opo e1 e2 (** val run_stat : state -> execution_ctx -> stat -> result **) and run_stat s c _term_ = match _term_ with | Coq_stat_expr e -> if_spec (run_expr_get_value s c e) (fun s0 r -> res_ter s0 (res_val r)) | Coq_stat_label (lab, t0) -> run_stat_label s c (Coq_label_string lab) t0 | Coq_stat_block ts -> run_block s c (rev ts) | Coq_stat_var_decl xeos -> run_var_decl s c xeos | Coq_stat_if (e1, t2, to0) -> run_stat_if s c e1 t2 to0 | Coq_stat_do_while (ls, t1, e2) -> run_stat_do_while s c Coq_resvalue_empty ls e2 t1 | Coq_stat_while (ls, e1, t2) -> run_stat_while s c Coq_resvalue_empty ls e1 t2 | Coq_stat_with (e1, t2) -> run_stat_with s c e1 t2 | Coq_stat_throw e -> run_stat_throw s c e | Coq_stat_return eo -> run_stat_return s c eo | Coq_stat_break so -> result_out (Coq_out_ter (s, (res_break so))) | Coq_stat_continue so -> result_out (Coq_out_ter (s, (res_continue so))) | Coq_stat_try (t1, t2o, t3o) -> run_stat_try s c t1 t2o t3o | Coq_stat_for (ls, eo1, eo2, eo3, s0) -> run_stat_for s c ls eo1 eo2 eo3 s0 | Coq_stat_for_var (ls, ds, eo2, eo3, s0) -> run_stat_for_var s c ls ds eo2 eo3 s0 | Coq_stat_for_in (ls, e1, e2, s0) -> (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) ("stat_for_in") | Coq_stat_for_in_var (ls, x, e1o, e2, s0) -> (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) ("stat_for_in_var") | Coq_stat_debugger -> result_out (Coq_out_ter (s, res_empty)) | Coq_stat_switch (labs, e, sb) -> run_stat_switch s c labs e sb (** val run_elements : state -> execution_ctx -> elements -> result **) and run_elements s c _foo_ = match _foo_ with | [] -> result_out (Coq_out_ter (s, (res_normal Coq_resvalue_empty))) | el :: els_rev_2 -> if_success (run_elements s c els_rev_2) (fun s0 rv0 -> match el with | Coq_element_stat t -> if_ter (run_stat s0 c t) (fun s1 r1 -> let r2 = res_overwrite_value_if_empty rv0 r1 in res_out (Coq_out_ter (s1, r2))) | Coq_element_func_decl (name, args, bd) -> res_ter s0 (res_normal rv0)) (** val run_prog : state -> execution_ctx -> prog -> result **) and run_prog s c _term_ = match _term_ with | Coq_prog_intro (str, els) -> run_elements s c (rev els) (** val push : state -> execution_ctx -> object_loc -> value list -> float -> result **) and push s c l args ilen = let_binding (of_int ilen) (fun vlen -> match args with | [] -> if_not_throw (object_put s c l ("length") (Coq_value_prim (Coq_prim_number vlen)) throw_true) (fun s0 x -> result_out (Coq_out_ter (s0, (res_val (Coq_value_prim (Coq_prim_number vlen)))))) | v :: vs -> if_string (to_string s c (Coq_value_prim (Coq_prim_number vlen))) (fun s0 slen -> if_not_throw (object_put s0 c l slen v throw_true) (fun s1 x -> push s1 c l vs (ilen +. 1.)))) (** val run_object_is_sealed : state -> execution_ctx -> object_loc -> prop_name list -> result **) and run_object_is_sealed s c l _foo_ = match _foo_ with | [] -> if_some (run_object_method object_extensible_ s l) (fun ext -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool (neg ext))))) | x :: xs_2 -> if_spec (run_object_get_own_prop s c l x) (fun s0 d -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("[run_object_is_sealed]: Undefined descriptor found in a place where it shouldn\'t.") | Coq_full_descriptor_some a -> if attributes_configurable a then res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool false))) else run_object_is_sealed s0 c l xs_2) (** val run_object_seal : state -> execution_ctx -> object_loc -> prop_name list -> result **) and run_object_seal s c l _foo_ = match _foo_ with | [] -> if_some (run_object_heap_set_extensible false s l) (fun s0 -> res_ter s0 (res_val (Coq_value_object l))) | x :: xs_2 -> if_spec (run_object_get_own_prop s c l x) (fun s0 d -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("[run_object_seal]: Undefined descriptor found in a place where it shouldn\'t.") | Coq_full_descriptor_some a -> let a_2 = if attributes_configurable a then let desc = { descriptor_value = None; descriptor_writable = None; descriptor_get = None; descriptor_set = None; descriptor_enumerable = None; descriptor_configurable = (Some false) } in attributes_update a desc else a in if_bool (object_define_own_prop s0 c l x (descriptor_of_attributes a_2) true) (fun s1 x0 -> run_object_seal s1 c l xs_2)) (** val run_object_freeze : state -> execution_ctx -> object_loc -> prop_name list -> result **) and run_object_freeze s c l _foo_ = match _foo_ with | [] -> if_some (run_object_heap_set_extensible false s l) (fun s0 -> res_ter s0 (res_val (Coq_value_object l))) | x :: xs_2 -> if_spec (run_object_get_own_prop s c l x) (fun s0 d -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("[run_object_freeze]: Undefined descriptor found in a place where it shouldn\'t.") | Coq_full_descriptor_some a -> let a_2 = if and_decidable (attributes_is_data_dec a) (bool_decidable (attributes_writable a)) then let desc = { descriptor_value = None; descriptor_writable = (Some false); descriptor_get = None; descriptor_set = None; descriptor_enumerable = None; descriptor_configurable = None } in attributes_update a desc else a in let a_3 = if attributes_configurable a_2 then let desc = { descriptor_value = None; descriptor_writable = None; descriptor_get = None; descriptor_set = None; descriptor_enumerable = None; descriptor_configurable = (Some false) } in attributes_update a_2 desc else a_2 in if_bool (object_define_own_prop s0 c l x (descriptor_of_attributes a_3) true) (fun s1 x0 -> run_object_freeze s1 c l xs_2)) (** val run_object_is_frozen : state -> execution_ctx -> object_loc -> prop_name list -> result **) and run_object_is_frozen s c l _foo_ = match _foo_ with | [] -> if_some (run_object_method object_extensible_ s l) (fun ext -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool (neg ext))))) | x :: xs_2 -> if_spec (run_object_get_own_prop s c l x) (fun s0 d -> let_binding (fun a -> if attributes_configurable a then res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool false))) else run_object_is_frozen s0 c l xs_2) (fun check_configurable -> match d with | Coq_full_descriptor_undef -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s0 ("[run_object_is_frozen]: Undefined descriptor found in a place where it shouldn\'t.") | Coq_full_descriptor_some a -> (match a with | Coq_attributes_data_of ad -> if attributes_writable (Coq_attributes_data_of ad) then res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool false))) else check_configurable (Coq_attributes_data_of ad) | Coq_attributes_accessor_of aa -> check_configurable (Coq_attributes_accessor_of aa)))) (** val run_get_args_for_apply : state -> execution_ctx -> object_loc -> float -> float -> value list specres **) and run_get_args_for_apply s c l index n = if index < n then if_string (to_string s c (Coq_value_prim (Coq_prim_number (of_int index)))) (fun s0 sindex -> if_value (run_object_get s0 c l sindex) (fun s1 v -> let_binding (run_get_args_for_apply s1 c l (index +. 1.) n) (fun tail_args -> if_spec (tail_args) (fun s2 tail -> res_spec s2 (v :: tail))))) else res_spec s [] (** val valueToStringForJoin : state -> execution_ctx -> object_loc -> float -> string specres **) and valueToStringForJoin s c l k = if_string (to_string s c (Coq_value_prim (Coq_prim_number (of_int k)))) (fun s0 prop -> if_value (run_object_get s0 c l prop) (fun s1 v -> match v with | Coq_value_prim p -> (match p with | Coq_prim_undef -> res_spec s1 "" | Coq_prim_null -> res_spec s1 "" | Coq_prim_bool b -> if_string (to_string s1 c v) (fun s2 s3 -> res_spec s2 s3) | Coq_prim_number n -> if_string (to_string s1 c v) (fun s2 s3 -> res_spec s2 s3) | Coq_prim_string s2 -> if_string (to_string s1 c v) (fun s3 s4 -> res_spec s3 s4)) | Coq_value_object o -> if_string (to_string s1 c v) (fun s2 s3 -> res_spec s2 s3))) (** val run_array_join_elements : state -> execution_ctx -> object_loc -> float -> float -> string -> string -> result **) and run_array_join_elements s c l k length0 sep sR = if k < length0 then let_binding (strappend sR sep) (fun ss -> let_binding (valueToStringForJoin s c l k) (fun sE -> if_spec (sE) (fun s0 element -> let_binding (strappend ss element) (fun sR0 -> run_array_join_elements s0 c l (k +. 1.) length0 sep sR0)))) else res_ter s (res_val (Coq_value_prim (Coq_prim_string sR))) (** val run_call_prealloc : state -> execution_ctx -> prealloc -> value -> value list -> result **) and run_call_prealloc s c b vthis args = match b with | Coq_prealloc_global_is_finite -> let_binding (get_arg 0 args) (fun v -> if_number (to_number s c v) (fun s0 n -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool (neg (or_decidable (number_comparable n JsNumber.nan) (or_decidable (number_comparable n JsNumber.infinity) (number_comparable n JsNumber.neg_infinity))))))))) | Coq_prealloc_global_is_nan -> let_binding (get_arg 0 args) (fun v -> if_number (to_number s c v) (fun s0 n -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_bool (number_comparable n JsNumber.nan)))))) | Coq_prealloc_object -> let_binding (get_arg 0 args) (fun value0 -> match value0 with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_construct_prealloc s c b args | Coq_prim_null -> run_construct_prealloc s c b args | Coq_prim_bool b0 -> to_object s value0 | Coq_prim_number n -> to_object s value0 | Coq_prim_string s0 -> to_object s value0) | Coq_value_object o -> to_object s value0) | Coq_prealloc_object_get_proto_of -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_proto_ s l) (fun proto -> res_ter s (res_val proto))) | Coq_prealloc_object_get_own_prop_descriptor -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_string (to_string s c (get_arg 1 args)) (fun s1 x -> if_spec (run_object_get_own_prop s1 c l x) (fun s2 d -> from_prop_descriptor s2 c d))) | Coq_prealloc_object_define_prop -> let_binding (get_arg 0 args) (fun o -> let_binding (get_arg 1 args) (fun p -> let_binding (get_arg 2 args) (fun attr -> match o with | Coq_value_prim p0 -> run_error s Coq_native_error_type | Coq_value_object l -> if_string (to_string s c p) (fun s1 name -> if_spec (run_to_descriptor s1 c attr) (fun s2 desc -> if_bool (object_define_own_prop s2 c l name desc true) (fun s3 x -> res_ter s3 (res_val (Coq_value_object l)))))))) | Coq_prealloc_object_seal -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (object_properties_keys_as_list_pickable_option s l) (fun _x_ -> run_object_seal s c l _x_)) | Coq_prealloc_object_freeze -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (object_properties_keys_as_list_pickable_option s l) (fun _x_ -> run_object_freeze s c l _x_)) | Coq_prealloc_object_prevent_extensions -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (object_binds_pickable_option s l) (fun o -> let o1 = object_with_extension o false in let s_2 = object_write s l o1 in res_ter s_2 (res_val (Coq_value_object l)))) | Coq_prealloc_object_is_sealed -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (object_properties_keys_as_list_pickable_option s l) (fun _x_ -> run_object_is_sealed s c l _x_)) | Coq_prealloc_object_is_frozen -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (object_properties_keys_as_list_pickable_option s l) (fun _x_ -> run_object_is_frozen s c l _x_)) | Coq_prealloc_object_is_extensible -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> run_error s Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_extensible_ s l) (fun r -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool r))))) | Coq_prealloc_object_proto_to_string -> (match vthis with | Coq_value_prim p -> (match p with | Coq_prim_undef -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_string ("[object Undefined]")))))) | Coq_prim_null -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_string ("[object Null]")))))) | Coq_prim_bool b0 -> if_object (to_object s vthis) (fun s1 l -> if_some (run_object_method object_class_ s1 l) (fun s0 -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (strappend ("[object ") (strappend s0 ("]")))))))) | Coq_prim_number n -> if_object (to_object s vthis) (fun s1 l -> if_some (run_object_method object_class_ s1 l) (fun s0 -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (strappend ("[object ") (strappend s0 ("]")))))))) | Coq_prim_string s0 -> if_object (to_object s vthis) (fun s1 l -> if_some (run_object_method object_class_ s1 l) (fun s2 -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (strappend ("[object ") (strappend s2 ("]"))))))))) | Coq_value_object o -> if_object (to_object s vthis) (fun s1 l -> if_some (run_object_method object_class_ s1 l) (fun s0 -> res_ter s1 (res_val (Coq_value_prim (Coq_prim_string (strappend ("[object ") (strappend s0 ("]"))))))))) | Coq_prealloc_object_proto_value_of -> to_object s vthis | Coq_prealloc_object_proto_has_own_prop -> let_binding (get_arg 0 args) (fun v -> if_string (to_string s c v) (fun s1 x -> if_object (to_object s1 vthis) (fun s2 l -> if_spec (run_object_get_own_prop s2 c l x) (fun s3 d -> match d with | Coq_full_descriptor_undef -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool false))) | Coq_full_descriptor_some a -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool true))))))) | Coq_prealloc_object_proto_is_prototype_of -> let_binding (get_arg 0 args) (fun v -> match v with | Coq_value_prim p -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_value_object l -> if_object (to_object s vthis) (fun s1 lo -> object_proto_is_prototype_of s1 lo l)) | Coq_prealloc_object_proto_prop_is_enumerable -> let_binding (get_arg 0 args) (fun v -> if_string (to_string s c v) (fun s1 x -> if_object (to_object s1 vthis) (fun s2 l -> if_spec (run_object_get_own_prop s2 c l x) (fun s3 d -> match d with | Coq_full_descriptor_undef -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool false))) | Coq_full_descriptor_some a -> res_ter s3 (res_val (Coq_value_prim (Coq_prim_bool (attributes_enumerable a)))))))) | Coq_prealloc_function_proto -> result_out (Coq_out_ter (s, (res_val (Coq_value_prim Coq_prim_undef)))) | Coq_prealloc_function_proto_to_string -> if is_callable_dec s vthis then (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) ("Function.prototype.toString() is implementation dependent.") else run_error s Coq_native_error_type | Coq_prealloc_function_proto_apply -> let_binding (get_arg 0 args) (fun thisArg -> let_binding (get_arg 1 args) (fun argArray -> if is_callable_dec s vthis then (match vthis with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Value is callable, but isn\'t an object.") | Coq_value_object thisobj -> (match argArray with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_call s c thisobj thisArg [] | Coq_prim_null -> run_call s c thisobj thisArg [] | Coq_prim_bool b0 -> run_error s Coq_native_error_type | Coq_prim_number n -> run_error s Coq_native_error_type | Coq_prim_string s0 -> run_error s Coq_native_error_type) | Coq_value_object array -> if_value (run_object_get s c array ("length")) (fun s0 v -> if_spec (to_uint32 s0 c v) (fun s1 ilen -> if_spec (run_get_args_for_apply s1 c array 0. ilen) (fun s2 arguments_ -> run_call s2 c thisobj thisArg arguments_))))) else run_error s Coq_native_error_type)) | Coq_prealloc_function_proto_call -> if is_callable_dec s vthis then (match vthis with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Value is callable, but isn\'t an object.") | Coq_value_object thisobj -> let (thisArg, a) = get_arg_first_and_rest args in run_call s c thisobj thisArg a) else run_error s Coq_native_error_type | Coq_prealloc_function_proto_bind -> if is_callable_dec s vthis then (match vthis with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s ("Value is callable, but isn\'t an object.") | Coq_value_object thisobj -> let (vthisArg, a) = get_arg_first_and_rest args in let_binding (object_new (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_object_proto)) ("Object")) (fun o1 -> let_binding (object_with_get o1 Coq_builtin_get_function) (fun o2 -> let_binding (object_with_details o2 None None None (Some thisobj) (Some vthisArg) (Some a) None) (fun o3 -> let_binding (object_set_class o3 ("Function")) (fun o4 -> let_binding (object_set_proto o4 (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_function_proto))) (fun o5 -> let_binding (object_with_invokation o5 (Some Coq_construct_after_bind) (Some Coq_call_after_bind) (Some Coq_builtin_has_instance_after_bind)) (fun o6 -> let_binding (object_set_extensible o6 true) (fun o7 -> let (l, s_2) = object_alloc s o7 in let_binding (if_some (run_object_method object_class_ s_2 thisobj) (fun class0 -> if string_comparable class0 ("Function") then if_number (run_object_get s_2 c thisobj ("length")) (fun s10 n -> if_spec (to_int32 s10 c (Coq_value_prim (Coq_prim_number n))) (fun s11 ilen -> if ilen < (number_of_int (LibList.length a)) then res_spec s11 0. else res_spec s11 (ilen -. (number_of_int (LibList.length a))))) else res_spec s_2 0.)) (fun vlength -> if_spec (vlength) (fun s10 length0 -> let_binding { attributes_data_value = (Coq_value_prim (Coq_prim_number (of_int length0))); attributes_data_writable = false; attributes_data_enumerable = false; attributes_data_configurable = false } (fun a0 -> if_some (object_heap_map_properties_pickable_option s10 l (fun p -> Heap.write p ("length") (Coq_attributes_data_of a0))) (fun s11 -> let_binding (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_throw_type_error)) (fun vthrower -> let_binding { attributes_accessor_get = vthrower; attributes_accessor_set = vthrower; attributes_accessor_enumerable = false; attributes_accessor_configurable = false } (fun a1 -> if_bool (object_define_own_prop s11 c l ("caller") (descriptor_of_attributes (Coq_attributes_accessor_of a1)) false) (fun s12 x -> if_bool (object_define_own_prop s12 c l ("arguments") (descriptor_of_attributes (Coq_attributes_accessor_of a1)) false) (fun s13 x0 -> res_ter s13 (res_val (Coq_value_object l)))))))))))))))))) else run_error s Coq_native_error_type | Coq_prealloc_bool -> result_out (let_binding (get_arg 0 args) (fun v -> Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_bool (convert_value_to_boolean v))))))) | Coq_prealloc_bool_proto_to_string -> (match vthis with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> res_ter s (res_val (Coq_value_prim (Coq_prim_string (convert_bool_to_string b0)))) | Coq_prim_number n -> run_error s Coq_native_error_type | Coq_prim_string s0 -> run_error s Coq_native_error_type) | Coq_value_object l -> if_some_or_default (run_object_method object_class_ s l) (run_error s Coq_native_error_type) (fun s0 -> if string_comparable s0 ("Boolean") then if_some_or_default (run_object_method object_prim_value_ s l) (run_error s Coq_native_error_type) (fun wo -> match wo with | Some v -> (match v with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> res_ter s (res_val (Coq_value_prim (Coq_prim_string (convert_bool_to_string b0)))) | Coq_prim_number n -> run_error s Coq_native_error_type | Coq_prim_string s1 -> run_error s Coq_native_error_type) | Coq_value_object o -> run_error s Coq_native_error_type) | None -> run_error s Coq_native_error_type) else run_error s Coq_native_error_type)) | Coq_prealloc_bool_proto_value_of -> (match vthis with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool b0))) | Coq_prim_number n -> run_error s Coq_native_error_type | Coq_prim_string s0 -> run_error s Coq_native_error_type) | Coq_value_object l -> if_some_or_default (run_object_method object_class_ s l) (run_error s Coq_native_error_type) (fun s0 -> if string_comparable s0 ("Boolean") then if_some_or_default (run_object_method object_prim_value_ s l) (run_error s Coq_native_error_type) (fun wo -> match wo with | Some v -> (match v with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool b0))) | Coq_prim_number n -> run_error s Coq_native_error_type | Coq_prim_string s1 -> run_error s Coq_native_error_type) | Coq_value_object o -> run_error s Coq_native_error_type) | None -> run_error s Coq_native_error_type) else run_error s Coq_native_error_type)) | Coq_prealloc_number -> if list_eq_nil_decidable args then result_out (Coq_out_ter (s, (res_val (Coq_value_prim (Coq_prim_number JsNumber.zero))))) else let v = get_arg 0 args in to_number s c v | Coq_prealloc_number_proto_value_of -> (match vthis with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> run_error s Coq_native_error_type | Coq_prim_number n -> res_ter s (res_val (Coq_value_prim (Coq_prim_number n))) | Coq_prim_string s0 -> run_error s Coq_native_error_type) | Coq_value_object l -> if_some_or_default (run_object_method object_class_ s l) (run_error s Coq_native_error_type) (fun s0 -> if string_comparable s0 ("Number") then if_some_or_default (run_object_method object_prim_value_ s l) (run_error s Coq_native_error_type) (fun wo -> match wo with | Some v -> (match v with | Coq_value_prim p -> (match p with | Coq_prim_undef -> run_error s Coq_native_error_type | Coq_prim_null -> run_error s Coq_native_error_type | Coq_prim_bool b0 -> run_error s Coq_native_error_type | Coq_prim_number n -> res_ter s (res_val (Coq_value_prim (Coq_prim_number n))) | Coq_prim_string s1 -> run_error s Coq_native_error_type) | Coq_value_object o -> run_error s Coq_native_error_type) | None -> run_error s Coq_native_error_type) else run_error s Coq_native_error_type)) | Coq_prealloc_array -> run_construct_prealloc s c Coq_prealloc_array args | Coq_prealloc_array_is_array -> let_binding (get_arg 0 args) (fun arg -> match arg with | Coq_value_prim p -> res_ter s (res_val (Coq_value_prim (Coq_prim_bool false))) | Coq_value_object arg0 -> if_some (run_object_method object_class_ s arg0) (fun class0 -> if string_comparable class0 ("Array") then res_ter s (res_val (Coq_value_prim (Coq_prim_bool true))) else res_ter s (res_val (Coq_value_prim (Coq_prim_bool false))))) | Coq_prealloc_array_proto_to_string -> if_object (to_object s vthis) (fun s0 array -> if_value (run_object_get s0 c array ("join")) (fun s1 vfunc -> if is_callable_dec s1 vfunc then (match vfunc with | Coq_value_prim p -> (fun s m -> Debug.impossible_with_heap_because __LOC__ s m; Coq_result_impossible) s1 ("Value is callable, but isn\'t an object.") | Coq_value_object func -> run_call s1 c func (Coq_value_object array) []) else run_call_prealloc s1 c Coq_prealloc_object_proto_to_string (Coq_value_object array) [])) | Coq_prealloc_array_proto_join -> let_binding (get_arg 0 args) (fun vsep -> if_object (to_object s vthis) (fun s0 l -> if_value (run_object_get s0 c l ("length")) (fun s1 vlen -> if_spec (to_uint32 s1 c vlen) (fun s2 ilen -> let_binding (if not_decidable (value_comparable vsep (Coq_value_prim Coq_prim_undef)) then vsep else Coq_value_prim (Coq_prim_string (","))) (fun rsep -> if_string (to_string s2 c rsep) (fun s3 sep -> if ilen = 0.0 then res_ter s3 (res_val (Coq_value_prim (Coq_prim_string ""))) else let_binding (valueToStringForJoin s3 c l 0.) (fun sR -> if_spec (sR) (fun s4 sR0 -> run_array_join_elements s4 c l 1. ilen sep sR0)))))))) | Coq_prealloc_array_proto_pop -> if_object (to_object s vthis) (fun s0 l -> if_value (run_object_get s0 c l ("length")) (fun s1 vlen -> if_spec (to_uint32 s1 c vlen) (fun s2 ilen -> if ilen = 0.0 then if_not_throw (object_put s2 c l ("length") (Coq_value_prim (Coq_prim_number JsNumber.zero)) throw_true) (fun s3 x -> result_out (Coq_out_ter (s3, (res_val (Coq_value_prim Coq_prim_undef))))) else if_string (to_string s2 c (Coq_value_prim (Coq_prim_number (of_int (ilen -. 1.))))) (fun s3 sindx -> if_value (run_object_get s3 c l sindx) (fun s4 velem -> if_not_throw (object_delete_default s4 c l sindx throw_true) (fun s5 x -> if_not_throw (object_put s5 c l ("length") (Coq_value_prim (Coq_prim_string sindx)) throw_true) (fun s6 x0 -> result_out (Coq_out_ter (s6, (res_val velem)))))))))) | Coq_prealloc_array_proto_push -> if_object (to_object s vthis) (fun s0 l -> if_value (run_object_get s0 c l ("length")) (fun s1 vlen -> if_spec (to_uint32 s1 c vlen) (fun s2 ilen -> push s2 c l args ilen))) | Coq_prealloc_string -> if list_eq_nil_decidable args then res_ter s (res_val (Coq_value_prim (Coq_prim_string ""))) else let_binding (get_arg 0 args) (fun value0 -> if_string (to_string s c value0) (fun s0 s1 -> res_ter s0 (res_val (Coq_value_prim (Coq_prim_string s1))))) | Coq_prealloc_string_proto_to_string -> (match vthis with | Coq_value_prim p -> if type_comparable (type_of vthis) Coq_type_string then res_ter s (res_val vthis) else run_error s Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_class_ s l) (fun s0 -> if string_comparable s0 ("String") then run_object_prim_value s l else run_error s Coq_native_error_type)) | Coq_prealloc_string_proto_value_of -> (match vthis with | Coq_value_prim p -> if type_comparable (type_of vthis) Coq_type_string then res_ter s (res_val vthis) else run_error s Coq_native_error_type | Coq_value_object l -> if_some (run_object_method object_class_ s l) (fun s0 -> if string_comparable s0 ("String") then run_object_prim_value s l else run_error s Coq_native_error_type)) | Coq_prealloc_error -> let_binding (get_arg 0 args) (fun v -> build_error s (Coq_value_object (Coq_object_loc_prealloc Coq_prealloc_error_proto)) v) | Coq_prealloc_native_error ne -> let_binding (get_arg 0 args) (fun v -> build_error s (Coq_value_object (Coq_object_loc_prealloc (Coq_prealloc_native_error_proto ne))) v) | Coq_prealloc_throw_type_error -> run_error s Coq_native_error_type | _ -> (fun s -> Debug.not_yet_implemented_because __LOC__ s; Coq_result_impossible) (strappend ("Call prealloc_") (strappend (string_of_prealloc b) (" not yet implemented"))) (** val run_call : state -> execution_ctx -> object_loc -> value -> value list -> result **) and run_call s c l vthis args = if_some (run_object_method object_call_ s l) (fun co -> if_some (co) (fun c0 -> match c0 with | Coq_call_default -> entering_func_code s c l vthis args | Coq_call_after_bind -> if_some (run_object_method object_bound_args_ s l) (fun oarg -> if_some (oarg) (fun boundArgs -> if_some (run_object_method object_bound_this_ s l) (fun obnd -> if_some (obnd) (fun boundThis -> if_some (run_object_method object_target_function_ s l) (fun otrg -> if_some (otrg) (fun target -> let_binding (LibList.append boundArgs args) (fun arguments_ -> run_call s c target boundThis arguments_))))))) | Coq_call_prealloc b -> run_call_prealloc s c b vthis args)) (** val run_javascript : prog -> result **) and run_javascript p = let c = execution_ctx_initial (prog_intro_strictness p) in if_void (execution_ctx_binding_inst state_initial c Coq_codetype_global None p []) (fun s_2 -> run_prog s_2 c p)