-
Thomas Wood authoredThomas Wood authored
JsInterpreter.ml 193.82 KiB
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)