diff --git a/generator/TODO b/generator/TODO index f44a80038cf7d6d9bd0e7661d58c68c9924d38de..ab0b734433fa2ac56e48051bf3f2fa995336ed4d 100644 --- a/generator/TODO +++ b/generator/TODO @@ -1,3 +1,49 @@ + let%if_spec (s,x) = expr in cont +becomes + if_spec expr (fun s x -> cont) + +and in pseudo: + Let%spec x = expr in + cont + + +------------ + + + Let (x,y) = ... + + +------------ + + return ( + if_run( + convert_twice_string(Coq_value_prim(w1), Coq_value_prim(w2)), + function (ss) { + var s3 = ss[0], s4 = ss[1]; + return ( + res_out( + Coq_out_ter(s2, + res_val( + Coq_value_prim(Coq_prim_string(strappend(s3, s4))))))); + })); + + + + + let%run (s3,s4) = convert_twice_string(Coq_value_prim(w1), Coq_value_prim(w2)) in + if_run( + , + function (ss) { + var s3 = ss[0], s4 = ss[1]; + return ( + res_out( + Coq_out_ter(s2, + res_val( + Coq_value_prim(Coq_prim_string(strappend(s3, s4))))))); + })); + + + -------------- @@ -20,10 +66,6 @@ BECOMES IN PSEUDO ------------------ -enlever les mlloc - - diff --git a/generator/monad_ppx.ml b/generator/monad_ppx.ml index b3d529d9d98ba00265210ac506ec061ab688306b..7ff1572a014ab15db124c3ba12811d3bf58d2b09 100644 --- a/generator/monad_ppx.ml +++ b/generator/monad_ppx.ml @@ -30,6 +30,10 @@ becomes becomes if_spec expr (fun s x -> cont) +and in pseudo: + Let%spec x = expr in + cont + *) diff --git a/navig-driver.js b/navig-driver.js index 8fe663bbc045977d3afc2d903f2cf5e0bc249225..0a4702e5c50f06f163aed0b1bf7f19c472e51845 100644 --- a/navig-driver.js +++ b/navig-driver.js @@ -96,6 +96,8 @@ var source_files = [ 'eval("var x = { a : 1 };\\nx.b = 2;\\nx");', 'var f = function() {return "f"}; eval("var g = function() {return \\"g\\"}; eval(\\"var h = function() {return \\\\\\"h\\\\\\"}; f(); g(); h()\\"); h();"); g(); h(); f();', 'var t = {};\nfor (var i = 0; i < 3; i++) {\n t[i] = eval("i + " + i); \n};\nt; ', + 'function f() {\n var x = 2;\n function g() { var x = 3; return x; };\n return g(); \n};\nf()', + 'f()' // bug? return 0 on the value thrown ]; source_files.reduce((select, file_content) => { @@ -211,12 +213,20 @@ function jsvalue_of_value(v) { } function lookup_var_in_record_decl(name, env_record_decl) { - // TODO : replace with - // Heap.find name env_record_decl - /// --> mutability_flag * value - // return value - // si not found, return undefined - + var ro = Heap.read_option(string_eq, env_record_decl, name); + switch (ro.tag) { + case "None": + return undefined; + case "Some": + var r = ro.value; + var mutability = r[0]; + var value = r[1]; + return value; + default: + throw "unrecognized tag in lookup_var_in_record_decl"; + } +} + /* DEPRECATED, naive code for lookup_var_in_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]; @@ -227,7 +237,7 @@ function lookup_var_in_record_decl(name, env_record_decl) { } } return undefined; -} + */ function lookup_var_in_object(state, name, loc) { var obj_opt = JsCommonAux.object_binds_pickable_option(state, loc); @@ -261,53 +271,43 @@ function lookup_var_in_object(state, name, loc) { // 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); - // TODO: walk step by step the lexical env - /* var r = []; - while (list.tag == "::") { - r.push(list.head); - list = list.tail; - } - return r; - - function f() { - var x = 2; - var g = function() { - var x = 3; - breakpoint ==> S_core(x) == 3 - } - } - */ - for (var i = 0; i < env_loc_array.length; i++) { + /* DEPRECATED: naive processing of the loop + 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; - - 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; + */ + var list = lexical_env; + while (list.tag == "::") { + var env_loc = list.head; + list = list.tail; + 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; + + 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; } function evalPred(item, pred) { @@ -682,7 +682,7 @@ function string_of_any(v) { // --------------- Views for JS state/context ---------------- function array_of_heap(heap) { - var items_list = Heap.to_list(LibString.string_comparable, heap); + var items_list = Heap.to_list(string_eq, heap); return encoded_list_to_array(items_list); } @@ -1322,6 +1322,11 @@ function assignExtraInfosInTrace() { var t = binding.val; if (t.loc != undefined) { last_loc = t.loc; + /*console.log("found source loc: " + + last_loc.start.line + "," + + last_loc.start.column + " --> " + + last_loc.end.line + "," + + last_loc.end.column);*/ } } else if (interp_val_is_state(binding.val)) { // assuming: 'is an state object' iff 'has a state_object_heap field' @@ -1420,7 +1425,6 @@ readSourceParseAndRun(); // stepTo(2466); -// $("#reach_condition").val("S('x') == 2"); // button_reach_handler(); // $("#reach_condition").val("S_raw('x')"); // button_test_handler(); @@ -1430,7 +1434,9 @@ readSourceParseAndRun(); // //stepTo(5873); -setExample(3); +setExample(20); +$("#reach_condition").val("S('x') == 2"); + function showCurrent() { console.log(tracer_items[tracer_pos]);