wrap promises from external calls

This commit is contained in:
Dmitry Vasilev
2022-12-19 19:05:36 +08:00
parent 88295a526a
commit 1a55dbf619
2 changed files with 42 additions and 15 deletions

View File

@@ -372,6 +372,24 @@ export const eval_modules = (
}
}
const set_promise_status = value => {
if(value instanceof Promise.Original) {
// record stack for async calls, so expand calls works sync
set_record_call()
return value
.then(v => {
value.status = {ok: true, value: v}
return v
})
.catch(e => {
value.status = {ok: false, error: e}
throw e
})
} else {
return value
}
}
const __with_restore_children = async value => {
// children is an array of child calls for current function call. But it
// can be null to save one empty array allocation in case it has no child
@@ -421,20 +439,7 @@ export const eval_modules = (
try {
value = fn(...args)
ok = true
if(value instanceof Promise.Original) {
set_record_call()
return value
.then(v => {
value.status = {ok: true, value: v}
return v
})
.catch(e => {
value.status = {ok: false, error: e}
throw e
})
} else {
return value
}
return set_promise_status(value)
} catch(_error) {
ok = false
error = _error
@@ -534,7 +539,7 @@ export const eval_modules = (
value = undefined
}
ok = true
return value
return set_promise_status(value)
} catch(_error) {
ok = false
error = _error

View File

@@ -2767,7 +2767,29 @@ const y = x()`
assert_equal(logs, [1, 2])
}),
test('async/await external async fn', async () => {
await assert_code_evals_to_async(
`
const AsyncFunction =
new Function('return (async () => {}).constructor')()
const async_fn = new AsyncFunction('return 1')
await async_fn()
`,
1
)
}),
// TODO
/*
test('async/await Promise.then creates subcall', async () => {
const i = await test_initial_state_async(`
await Promise.resolve(1).then(x => {
})
`)
console.log('i', root_calltree_node(i))
}),
test('async/await bug', async () => {
const code = `
const f = async () => {