From f4e531d24c5b3dc592223bedf6f8cf55ed58fb35 Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Thu, 25 Jan 2024 20:00:11 +0800 Subject: [PATCH] fix bug --- src/eval.js | 16 ++++++++++------ test/test.js | 12 ++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/eval.js b/src/eval.js index 8fdd181..6407629 100644 --- a/src/eval.js +++ b/src/eval.js @@ -1027,12 +1027,18 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => { ] }) ) - + + // Currently assignment_count is always zero or one, because we do not allow + // destructuring assignment of let vars like `({foo, bar} = something)` const assignment_count = name_nodes.filter(n => { const value = next_eval_cxt.scope[symbol_for_identifier(n, frame_cxt)] return value instanceof LetMultiversion }).length + const next_version_number = is_assignment + ? next_eval_cxt.version_number + assignment_count + : next_eval_cxt.version_number + // TODO fine-grained destructuring error, only for identifiers that failed // destructuring const name_node_with_result = map_tree( @@ -1048,12 +1054,12 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => { } else { let value = next_scope[symbol_for_identifier(node, frame_cxt)] if(value instanceof LetMultiversion) { - value = value.get_version(next_eval_cxt.version_number) + value = value.get_version(next_version_number) } result = { ok, value, - version_number: next_eval_cxt.version_number, + version_number: next_version_number, } } return {...node, result} @@ -1088,9 +1094,7 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => { eval_cxt: { ...next_eval_cxt, scope: {...next_eval_cxt.scope, ...next_scope}, - version_number: is_assignment - ? next_eval_cxt.version_number + assignment_count - : next_eval_cxt.version_number, + version_number: next_version_number, } } } diff --git a/test/test.js b/test/test.js index ecc0b3b..c7d89bd 100644 --- a/test/test.js +++ b/test/test.js @@ -4320,6 +4320,18 @@ const y = x()` ) }), + test('let_versions assign to let variable', () => { + const code = ` + let result = 0 + function unused() { + result = 2 + } + result = 1 + ` + const i = test_initial_state(code, code.indexOf('result = 1')) + assert_value_explorer(i, 1) + }), + test('let_versions', () => { const code = ` let x