mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 13:04:30 -08:00
fix bug
This commit is contained in:
16
src/eval.js
16
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 assignment_count = name_nodes.filter(n => {
|
||||||
const value = next_eval_cxt.scope[symbol_for_identifier(n, frame_cxt)]
|
const value = next_eval_cxt.scope[symbol_for_identifier(n, frame_cxt)]
|
||||||
return value instanceof LetMultiversion
|
return value instanceof LetMultiversion
|
||||||
}).length
|
}).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
|
// TODO fine-grained destructuring error, only for identifiers that failed
|
||||||
// destructuring
|
// destructuring
|
||||||
const name_node_with_result = map_tree(
|
const name_node_with_result = map_tree(
|
||||||
@@ -1048,12 +1054,12 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => {
|
|||||||
} else {
|
} else {
|
||||||
let value = next_scope[symbol_for_identifier(node, frame_cxt)]
|
let value = next_scope[symbol_for_identifier(node, frame_cxt)]
|
||||||
if(value instanceof LetMultiversion) {
|
if(value instanceof LetMultiversion) {
|
||||||
value = value.get_version(next_eval_cxt.version_number)
|
value = value.get_version(next_version_number)
|
||||||
}
|
}
|
||||||
result = {
|
result = {
|
||||||
ok,
|
ok,
|
||||||
value,
|
value,
|
||||||
version_number: next_eval_cxt.version_number,
|
version_number: next_version_number,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {...node, result}
|
return {...node, result}
|
||||||
@@ -1088,9 +1094,7 @@ const eval_decl_pair = (s, eval_cxt, frame_cxt, is_assignment) => {
|
|||||||
eval_cxt: {
|
eval_cxt: {
|
||||||
...next_eval_cxt,
|
...next_eval_cxt,
|
||||||
scope: {...next_eval_cxt.scope, ...next_scope},
|
scope: {...next_eval_cxt.scope, ...next_scope},
|
||||||
version_number: is_assignment
|
version_number: next_version_number,
|
||||||
? next_eval_cxt.version_number + assignment_count
|
|
||||||
: next_eval_cxt.version_number,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
test/test.js
12
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', () => {
|
test('let_versions', () => {
|
||||||
const code = `
|
const code = `
|
||||||
let x
|
let x
|
||||||
|
|||||||
Reference in New Issue
Block a user