From dbe17eb5d4e408e9708efd780e367a90f1c57f02 Mon Sep 17 00:00:00 2001 From: charguer <arthur@chargueraud.org> Date: Wed, 6 Apr 2016 11:06:49 +0200 Subject: [PATCH] work --- driver.html | 75 +- generator/Makefile | 2 +- generator/tests/jsref/JsInterpreter.ml | 2 +- generator/tests/jsref/JsInterpreterMonads.ml | 4 +- generator/tests/jsref/JsInterpreterSrc.ml | 4590 +++++++++++++++++ .../tests/jsref/convert_monads_to_ppx.php | 4 +- navig-driver.js | 310 +- 7 files changed, 4895 insertions(+), 92 deletions(-) create mode 100644 generator/tests/jsref/JsInterpreterSrc.ml diff --git a/driver.html b/driver.html index 8535d50..85e83c9 100644 --- a/driver.html +++ b/driver.html @@ -74,6 +74,10 @@ margin-top: 0.5em; } +#disp_env_pane { + height: 150px; +} + .CodeMirror-selected { background: #F3F781; } .CodeMirror-focused .CodeMirror-selected { background: #F3F781; } @@ -84,63 +88,69 @@ height: 300px; overflow: auto; } +.hint { + display: none; +} </style> </head> <body> -<h2>Interactive Debugger for the JavaScript Specification</h2> - - -<div class='source_div'> - JavaScript code to run: - <select id='select_source_code'><option disabled selected>Examples</option></select><br /> - Or load: <input type='file' accept='.js' id='select_file' /> -<table id='main_table'><tr> -<td> - <textarea id='source_code' class='source' rows='6' cols='60'>source code here</textarea> -</td> -<td width='600'> - <div id='disp_env_pane' class="scroll-pane" style="height: 15em"> - <div id='disp_env'>ctx here</div> - </div> -</td> -</tr></table> +<h2 class="hint">Interactive Debugger for the JavaScript Specification</h2> + + +<div class='source_div' style=""> + Load example: + <select id='select_source_code'><option disabled selected>Examples</option></select> + Load file: <input type='file' accept='.js' id='select_file' /> + <table id='main_table'><tr> + <td> + <textarea id='source_code' class='source' rows='6' cols='60'>source code here</textarea> + </td> + <td width='600'> + <div id='disp_env_pane' class="scroll-pane"> + <div id='disp_env'>ctx here</div> + </div> + </td> + </tr></table> </div> -<br/> -<div> +<div style="margin-top:0.2em"> <input type="button" id="button_run" value="RUN" /> Navigation: <input type="textbox" id='navigation_step' style="width:3em" value="0"/> / <span id="navigation_total"></span> -<input type="button" id='button_reset' value="Reset" /> -<input type="button" id='button_backward' value="Backward" />(4) -<input type="button" id='button_forward' value="Forward" />(6) +<input type="button" id='button_reset' value="Restart" /> +<input type="button" id='button_backward' value="Backward" /><div class="hint">(4)</div> +<input type="button" id='button_forward' value="Forward" /><div class="hint">(6)</div> <span style="width:3em"> </span> -<input type="button" id='button_previous' value="Prev" />(8) -<input type="button" id='button_next' value="Next" />(2) -<input type="button" id='button_finish' value="Finish" />(3) +<input type="button" id='button_previous' value="Prev" /><div class="hint">(8)</div> +<input type="button" id='button_next' value="Next" /><div class="hint">(2)</div> +<input type="button" id='button_finish' value="Finish" /><div class="hint">(3)</div> <span style="width:3em"> </span> -<input type="button" id='button_cursor' value="Cursor" />(7) - -<br/>Reach condition: -<input type="textbox" id='text_condition' style="width:15em" /> -<input type="button" id='button_reach' value="Reach" /> +<input type="button" id='button_srcprevious' value="Source Prev" /><div class="hint">(7)</div> +<input type="button" id='button_srcnext' value="Source Next" /><div class="hint">(7)</div> +<input type="button" id='button_cursor' value="Source Cursor" /><div class="hint">(7)</div> +<!--<input type="button" id='button_selection' value="ReachSelection" /><div class="hint">(7)</div>--> + +<div style="margin-top: 0.2em">Condition: +<input type="textbox" id='reach_condition' style="width:20em" /> +<input type="button" id='button_reach_condition' value="Reach" /> +<input type="button" id='button_test_condition' value="Test" /> <span id="reach_output"></span> </div> +</div> <div id="action_output"></div> -<br/> <div class='source_div'> <table id='main_table'><tr> <td> <div id='file_list'></div> - <textarea id='interpreter_code' class='source' rows='30' cols='60'></textarea> + <textarea id='interpreter_code' class='source' rows='15' cols='60'></textarea> </td> <!--<td width='600'> <div id='disp_ctx'></div> @@ -211,3 +221,4 @@ t[0](); 3 --> + diff --git a/generator/Makefile b/generator/Makefile index c50ea4b..81cc290 100644 --- a/generator/Makefile +++ b/generator/Makefile @@ -16,7 +16,7 @@ STDLIB_DIR := stdlib_ml TESTS_DIR := tests JSREF_DIR := jsref JSREF_PATH := $(TESTS_DIR)/$(JSREF_DIR) -JSREF_ML := $(wildcard $(JSREF_PATH)/*.ml) +JSREF_ML := $(filter-out JsOutput.ml,$(wildcard $(JSREF_PATH)/*.ml)) JSREF_MLI := $(wildcard $(JSREF_PATH)/*.mli) diff --git a/generator/tests/jsref/JsInterpreter.ml b/generator/tests/jsref/JsInterpreter.ml index 458c6c0..c69bb8b 100644 --- a/generator/tests/jsref/JsInterpreter.ml +++ b/generator/tests/jsref/JsInterpreter.ml @@ -3397,7 +3397,7 @@ and run_expr_call s c e1 e2s = 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 s4 v -> follow s4 v))) + 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 : diff --git a/generator/tests/jsref/JsInterpreterMonads.ml b/generator/tests/jsref/JsInterpreterMonads.ml index 15e0a29..1c87e56 100644 --- a/generator/tests/jsref/JsInterpreterMonads.ml +++ b/generator/tests/jsref/JsInterpreterMonads.ml @@ -385,6 +385,6 @@ let if_spec w k = let ifx_prim w k = if_prim w k -let ifx_number w k = ifx_number w k -let ifx_string w k = ifx_string w k +let ifx_number w k = if_number w k +let ifx_string w k = if_string w k let ifx_success_state a b c = if_success_state a b c diff --git a/generator/tests/jsref/JsInterpreterSrc.ml b/generator/tests/jsref/JsInterpreterSrc.ml new file mode 100644 index 0000000..458c6c0 --- /dev/null +++ b/generator/tests/jsref/JsInterpreterSrc.ml @@ -0,0 +1,4590 @@ +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 = + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + ((fun p -> 1. +. (2. *. p)) + 1.))))))))))))))))))))))))))))))))) + 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 s4 v -> follow s4 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) diff --git a/generator/tests/jsref/convert_monads_to_ppx.php b/generator/tests/jsref/convert_monads_to_ppx.php index f9db8ff..5b8e07d 100644 --- a/generator/tests/jsref/convert_monads_to_ppx.php +++ b/generator/tests/jsref/convert_monads_to_ppx.php @@ -12,8 +12,8 @@ printf("%s %s\n", $x, $y); */ -$input = "JsInterpreter.ml"; -$output = "JsOutput.ml"; +$input = "JsInterpreterSrc.ml"; +$output = "JsInterpreterOut.ml"; $sinput = file_get_contents($input); /* diff --git a/navig-driver.js b/navig-driver.js index 44f39a8..e032148 100644 --- a/navig-driver.js +++ b/navig-driver.js @@ -75,17 +75,17 @@ var interpreter = null; // Initial source code var source_files = [ + 'var x = 1;\nx++;\nx', 'var x = 2;\nx', - ' var t = {}; for (var i = 0; i < 3; i++) { t[i] = function() { return i; } }; t[0](); ', - '{}', + 'var t = {};\nfor (var i = 0; i < 3; i++) {\n t[i] = function() { return i; } \n};\nt[0](); ', '{} + {}', + '(+{}+[])[+!![]]', 'var x = { a : 1, b : 2 }; ', - 'x = 1;\nx = 2;\nx = 3', 'var x = { a : 1 };\n x.b = 2;\nx', 'var x = { a : { c: 1 } };\n x.a.b = 2;\nx', '(function (x) {return 1;})()', '(function (x) {\nreturn 1;\n})({a:{b:2}})', - 'eval("var x = { a : 1 }; x.b = 2; x");', +// 'eval("var x = { a : 1 }; x.b = 2; x");', ]; source_files.reduce((select, file_content) => { @@ -116,70 +116,209 @@ $('#select_file').change(e => { // WARNING: do not move this initialization further down in the file // source code displayed initially -setSourceCode(source_files[source_files.length - 1]); +//source_files.length - 1 +setSourceCode(source_files[0]); // --------------- Predicate search ---------------- -// Take a predicate in form of a JavaScript code (string) and returns either true or an error message (string). -function goToPred(pred) { +function jsvalue_of_prim(v) { + switch (v.tag) { + case "Coq_prim_undef": + return undefined; + case "Coq_prim_null": + return null; + case "Coq_prim_bool": + return (v.value) ? true : false; + case "Coq_prim_number": + return v.value; + case "Coq_prim_string": + return v.value; + default: + throw "unrecognized tag in jsvalue_of_prim"; + } +} - function check(i){ - var item = tracer_items[i]; - var state = item.state; - // the goal here is to take the environment and make it available to the - // user - var obj = env_to_jsobject(state, item.env); - // the goal here is to take the local variable of the interpreter and make - // them available to the user - var objX = {}; - if (item.ctx !== undefined){ - objX = ctx_to_jsobject(state, item.ctx); - } - // TODO bind loc - objX.line = item.loc.start.line; - objX.type = item.type; - // TODO bind other fields of the state - objX.heap = state.object_heap; - obj.X = objX; // If we want to change the “X†identifier, just change this line. - try { - if (check_pred(pred, obj)){ - stepTo(i); - return true; - } - } catch(e){ - error++; +function jsvalue_of_value(v) { + switch (v.tag) { + case "Coq_value_prim": + return jsvalue_of_prim(v.value); + case "Coq_value_object": + return v.value; // TODO: reflect + default: + throw "unrecognized tag in jsvalue_of_value"; + } +} + +function lookup_var_in_record_decl(name, env_record_decl) { + var items_array = array_of_heap(env_record_decl); + for (var i = 0; i < items_array.length; i++) { + var var_name = items_array[i][0]; + // var mutability = items_array[i][1][0]; + var value = items_array[i][1][1]; + if (var_name === name) { + return value; + } } + return undefined; +} - return false; - } +function lookup_var_in_object(state, name, loc) { + var obj_opt = JsCommonAux.object_binds_pickable_option(state, loc); + if (obj_opt.tag != "Some") throw "show_object: unbound object"; + var obj = obj_opt.value; + var props = obj.object_properties_; + var key_value_pair_array = array_of_heap(props); + for (var i = 0; i < key_value_pair_array.length; i++) { + var prop_name = key_value_pair_array[i][0]; + if (prop_name !== name) { + continue; + } + var attribute = key_value_pair_array[i][1]; + switch (attribute.tag) { + case "Coq_attributes_data_of": + var attr = attribute.value; + var prop_value = attr.attributes_data_value; + return prop_value; + break; + case "Coq_attributes_accessor_of": + // raise error + break; + default: + throw "invalid attribute.tag"; + } + } + return undefined; +} - var error = 0; - if (tracer_items.length === 0) - return false; +// todo : handle objects +function lookup_var_in_lexical_env(state, name, lexical_env) { + // var env_record_heap = state.state_env_record_heap; + var env_loc_array = encoded_list_to_array(lexical_env); + for (var i = 0; i < env_loc_array.length; i++) { + var env_loc = env_loc_array[i]; + var env_record_opt = JsCommonAux.env_record_binds_pickable_option(state, env_loc); + if (env_record_opt.tag != "Some") throw "show_object: unbound object"; + var env_record = env_record_opt.value; - for (var i = (tracer_pos + 1) % tracer_items.length, current = tracer_pos; - i !== current; - i++, i %= tracer_items.length) - if (check(i)) - return true; + switch (env_record.tag) { + case "Coq_env_record_decl": + var env_record_decl = env_record.value; + var r = lookup_var_in_record_decl(name, env_record_decl); + if (r !== undefined) { + return r; + } + break; + case "Coq_env_record_object": + var object_loc = env_record.value; + var r = lookup_var_in_object(state, name, object_loc); + if (r !== undefined) { + return r; + } + /* + var obj_value = { tag: "Coq_value_object", value: object_loc }; + var provide_this = env_record.provide_this; + */ + break; + default: + throw "invalid env_record.tag"; + } + } + return undefined; +} - if (check(tracer_pos)) - return true; +function evalPred(item, pred) { + var I = function(name) { + var a = ctx_to_array(item.ctx); + for (var i = 0; i < a.length; i++) { + var key = a[i].key; + if (key !== name) { + continue; + } + var val = a[i].val; + return val; + } + return undefined; + } + /*var interp_val = function(name) { + return interp_raw(name); + }*/ + var I_line = function () { + var locByExt = item.locByExt; + if (locByExt === undefined) { + return -1; + } + var ext = get_file_extension(curfile); + var loc = locByExt[ext]; + if (loc === undefined) { + return -1; + } + return loc.start.line; + }; + var S_line = function () { + var loc = item.source_loc; + if (loc === undefined) { + return -1; + } + return loc.start.line; + }; + var S_core = function(name) { + var execution_ctx = item.execution_ctx; + var state = item.state; + if (execution_ctx === undefined || state === undefined) { + return undefined; + } + return lookup_var_in_lexical_env(state, name, execution_ctx.execution_ctx_lexical_env); + }; + var S_raw = function(name) { + var v = S_core(name); + return JSON.stringify(v); + }; + var S = function(name) { + var v = S_core(name); + if (v === undefined) { + return undefined; + } + return jsvalue_of_value(v); + }; + return eval(pred); +} - if (error === tracer_items.length) - return "There was an execution error at every execution of your condition: are you sure that this is a valid JavaScript code?"; +function itemSatisfiesPred(item, pred) { + var ok = evalPred(item, pred); + return (ok === true) ? true : false; + // forces to return a boolean even if "pred" does not +} - return "Not found"; +function goToPred(pred) { + for (var k = 1; k < tracer_length+1; k++) { + var i = (tracer_pos + k) % tracer_length; + if (itemSatisfiesPred(tracer_items[i], pred)) { + stepTo(i); + return; + } + } + $("#action_output").html("Could not find an event matching the reach condition."); + var timeoutID = window.setTimeout(function() { $("#action_output").html(""); }, 1000); } // --------------- Trace navigation buttons ---------------- +function button_test_handler() { + var pred = $("#reach_condition").val(); + var r = evalPred(tracer_items[tracer_pos], pred); + // $("#disp_infos").html(r); + if (r === undefined) { + r = "undefined"; + } + $("#action_output").html(r); + var timeoutID = window.setTimeout(function() { $("#action_output").html(""); }, 3000); +} function button_reach_handler() { - var pred = $("#text_condition").val(); + var pred = $("#reach_condition").val(); var res = goToPred(pred); if (res !== true){ $("#action_output").html(res); @@ -196,7 +335,8 @@ $('#text_condition').keypress(function(e){ } }); -$("#button_reach").click(button_reach_handler); +$("#button_reach_condition").click(button_reach_handler); +$("#button_test_condition").click(button_test_handler); $("#navigation_step").change(function(e) { @@ -220,11 +360,15 @@ $("#button_backward").click(function() { backward(); }); $("#button_forward").click(function() { forward() }); // stepTo(Math.min(tracer_length-1, tracer_pos+1)); +$("#button_srcprevious").click(function() { src_previous() }); +$("#button_srcnext").click(function() { src_next() }); + $("#button_previous").click(function() { previous() }); $("#button_next").click(function() { next() }); $("#button_finish").click(function() { finish() }); $("#button_cursor").click(function() { cursor() }); +$("#button_selection").click(function() { selection() }); @@ -287,6 +431,25 @@ function shared_next(dir, target) { } } +function src_shared_next(dir) { + var cur_item = tracer_items[tracer_pos]; + var cur_loc = cur_item.source_loc; + var i = tracer_pos += dir; + // for (var k = 1; k < tracer_length; k++) { + // var i = (tracer_pos + tracer_length + dir * k) % tracer_length; + while (i >= 0 && i < tracer_length) { + var next_item = tracer_items[i]; + var next_loc = next_item.source_loc; + if (next_loc !== cur_loc) { + stepTo(i); + return; + } + i += dir; + } + // $("#action_output").html("Distinct loc event not found"); + // var timeoutID = window.setTimeout(function() { $("#action_output").html(""); }, 1000); +} + function reset() { tracer_pos = 0; updateSelection(); } function forward() { shared_step(+1); } @@ -296,6 +459,34 @@ function previous() { shared_next(-1, 0); } function next() { shared_next(+1, 0); } function finish() { shared_next(+1, -1); } +function src_previous() { src_shared_next(-1); } +function src_next() { src_shared_next(+1); } + + +/* +function selection() { + // jump to the last event that contains the source location + var pos = source.getSelection(); + console.log(source); + var line = pos.line + 1; // adding 1 because Codemirror counts from 0 + var column = pos.ch; + // for (var i = 0; i < tracer_length; i++) { + for (var i = tracer_length-1; i >= 0; i--) { + var loc = tracer_items[i].source_loc; + if (loc === undefined) continue; + if (loc.start.line <= line && + loc.start.column <= column && + loc.end.line >= line && + loc.end.column >= column) { + stepTo(i); + return; + } + } + $("#action_output").html("Event covering cursor not found"); + var timeoutID = window.setTimeout(function() { $("#action_output").html(""); }, 1000); +}; +*/ + function cursor() { // jump to the last event that contains the source location var pos = source.getCursor(); @@ -785,7 +976,8 @@ function show_interp_ctx(state, ctx, target) { var depth = 1000; var t = $("#" + target); var a = ctx_to_array(ctx); - for (var i = 0; i < a.length; i++) { + // for (var i = 0; i < a.length; i++) { + for (var i = a.length-1; i >= 0; i--) { var key = a[i].key; var val = a[i].val; var targetsub = fresh_id(); @@ -882,7 +1074,7 @@ function updateSelection() { if (item !== undefined) { // console.log(item); - $("#disp_infos").html(itemToHtml(item)); + // $("#disp_infos").html(itemToHtml(item)); if (item.source_loc === undefined) { console.log("Error: missing line in log event"); @@ -950,7 +1142,7 @@ interpreter = CodeMirror.fromTextArea(document.getElementById('interpreter_code' '3': function(cm) { finish(); } }, }); -interpreter.setSize(800,400); +interpreter.setSize(800,250); /* ==> try in new version of codemirror*/ @@ -1064,7 +1256,8 @@ function run() { tracer_length = tracer_items.length; assignExtraInfosInTrace(); $("#navigation_total").html(tracer_length - 1); - stepTo(tracer_length-1); + // stepTo(tracer_length-1); + stepTo(0); return (success) ? "Run successful!" : "Error during the run!"; } @@ -1114,7 +1307,16 @@ function testLineof(filename, token) { // for easy debugging, launch at startup: readSourceParseAndRun(); -stepTo(1700); + +stepTo(2466); + +// $("#reach_condition").val("S('x') == 2"); +// button_reach_handler(); +// $("#reach_condition").val("S_raw('x')"); +// button_test_handler(); + +// $("#reach_condition").val("I_line()"); +// button_test_handler(); function showCurrent() { -- GitLab