guard againt simultaneous execution

This commit is contained in:
Dmitry Vasilev
2023-01-03 01:27:43 +08:00
parent e577301215
commit de072d5ba5
5 changed files with 15 additions and 4 deletions

View File

@@ -216,11 +216,15 @@ const external_imports_loaded = (
}
}
} else {
return eval_modules_finished(state, result, node, toplevel)
return eval_modules_finished(state, state, result, node, toplevel)
}
}
const eval_modules_finished = (state, result, node, toplevel) => {
const eval_modules_finished = (state, prev_state, result, node, toplevel) => {
if(state.calltree_changed_token != prev_state.calltree_changed_token) {
// code was modified after prev vesion of code was executed, discard
return state
}
const next = apply_eval_result(state, result)
let active_calltree_node

7
src/effects.js vendored
View File

@@ -182,7 +182,12 @@ export const render_common_side_effects = async (prev, next, command, ui) => {
) {
const s = next.eval_modules_state
s.promise.then(result => {
exec('eval_modules_finished', result, s.node, s.toplevel)
exec('eval_modules_finished',
next, /* becomes prev_state */
result,
s.node,
s.toplevel
)
})
}

View File

@@ -85,7 +85,7 @@ const loaded = i
assert_equal(loaded.eval_modules_state != null, true)
const s = loaded.eval_modules_state
const result = await s.promise
const state = COMMANDS.eval_modules_finished(loaded , result, s.node, s.toplevel)
const state = COMMANDS.eval_modules_finished(loaded, loaded, result, s.node, s.toplevel)
const root = root_calltree_node(state)
const run = root.children[0]

View File

@@ -2876,6 +2876,7 @@ const y = x()`
const result = await after_edit.eval_modules_state.promise
const after_edit_finished = COMMANDS.eval_modules_finished(
after_edit,
after_edit,
result,
after_edit.eval_modules_state.node,
after_edit.eval_modules_state.toplevel

View File

@@ -71,6 +71,7 @@ export const test_initial_state_async = async code => {
const result = await s.eval_modules_state.promise
return COMMANDS.eval_modules_finished(
s,
s,
result,
s.eval_modules_state.node,
s.eval_modules_state.toplevel