Skip to content

Commit 1320130

Browse files
committed
various
1 parent b0a08f5 commit 1320130

File tree

8 files changed

+34
-31
lines changed

8 files changed

+34
-31
lines changed

packages/svelte/src/compiler/phases/2-analyze/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ export function analyze_module(ast, options) {
266266
immutable: true,
267267
tracing: analysis.tracing,
268268
async_deriveds: new Set(),
269-
blocking_awaits: new Set()
269+
suspenders: new Set()
270270
};
271271
}
272272

@@ -455,7 +455,7 @@ export function analyze_component(root, source, options) {
455455
snippets: new Set(),
456456
is_async: false,
457457
async_deriveds: new Set(),
458-
blocking_awaits: new Set()
458+
suspenders: new Set()
459459
};
460460

461461
if (!runes) {

packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function AwaitExpression(node, context) {
1414
throw new Error('TODO runes mode only');
1515
}
1616

17-
context.state.analysis.blocking_awaits.add(node);
17+
context.state.analysis.suspenders.add(node);
1818
}
1919

2020
if (context.state.expression) {

packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js

+3
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,9 @@ export function CallExpression(node, context) {
219219

220220
if (expression.is_async) {
221221
context.state.analysis.async_deriveds.add(node);
222+
223+
context.state.analysis.is_async ||=
224+
context.state.ast_type === 'instance' && context.state.function_depth === 1;
222225
}
223226
} else if (rune === '$inspect') {
224227
context.next({ ...context.state, function_depth: context.state.function_depth + 1 });

packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitExpression.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,21 @@ import * as b from '../../../../utils/builders.js';
77
* @param {ComponentContext} context
88
*/
99
export function AwaitExpression(node, context) {
10-
if (!context.state.analysis.runes) {
10+
const suspend = context.state.analysis.suspenders.has(node);
11+
12+
if (!suspend) {
1113
return context.next();
1214
}
1315

14-
const block = context.state.analysis.blocking_awaits.has(node);
15-
1616
return b.call(
1717
b.member(
1818
b.await(
1919
b.call(
20-
'$.preserve_context',
21-
node.argument && /** @type {Expression} */ (context.visit(node.argument)),
22-
block && b.true
20+
'$.suspend',
21+
node.argument && /** @type {Expression} */ (context.visit(node.argument))
2322
)
2423
),
25-
'read'
24+
'exit'
2625
)
2726
);
2827
}

packages/svelte/src/compiler/phases/types.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface Analysis {
4343
async_deriveds: Set<CallExpression>;
4444

4545
/** A set of `await` expressions that should trigger suspense */
46-
blocking_awaits: Set<AwaitExpression>;
46+
suspenders: Set<AwaitExpression>;
4747
}
4848

4949
export interface ComponentAnalysis extends Analysis {

packages/svelte/src/internal/client/dom/blocks/boundary.js

+16-17
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,14 @@ export function trigger_async_boundary(effect, trigger) {
247247
/**
248248
* @template T
249249
* @param {Promise<T>} promise
250-
* @param {boolean} block
251-
* @returns {Promise<{ read: () => T }>}
250+
* @returns {Promise<{ exit: () => T }>}
252251
*/
253-
export function preserve_context(promise, block = false) {
252+
export async function suspend(promise) {
254253
var previous_effect = active_effect;
255254
var previous_reaction = active_reaction;
256255
var previous_component_context = component_context;
257256

258-
let boundary = block ? active_effect : null;
257+
let boundary = active_effect;
259258
while (boundary !== null) {
260259
if ((boundary.f & BOUNDARY_EFFECT) !== 0) {
261260
break;
@@ -264,25 +263,25 @@ export function preserve_context(promise, block = false) {
264263
boundary = boundary.parent;
265264
}
266265

267-
if (block && boundary === null) {
266+
if (boundary === null) {
268267
throw new Error('cannot suspend outside a boundary');
269268
}
270269

271270
// @ts-ignore
272271
boundary?.fn(ASYNC_INCREMENT);
273272

274-
return promise.then((value) => {
275-
return {
276-
read() {
277-
set_active_effect(previous_effect);
278-
set_active_reaction(previous_reaction);
279-
set_component_context(previous_component_context);
273+
const value = await promise;
280274

281-
// @ts-ignore
282-
boundary?.fn(ASYNC_DECREMENT);
275+
return {
276+
exit() {
277+
set_active_effect(previous_effect);
278+
set_active_reaction(previous_reaction);
279+
set_component_context(previous_component_context);
283280

284-
return value;
285-
}
286-
};
287-
});
281+
// @ts-ignore
282+
boundary?.fn(ASYNC_DECREMENT);
283+
284+
return value;
285+
}
286+
};
288287
}

packages/svelte/src/internal/client/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export {
129129
update_store,
130130
mark_store_binding
131131
} from './reactivity/store.js';
132-
export { boundary, preserve_context } from './dom/blocks/boundary.js';
132+
export { boundary, suspend } from './dom/blocks/boundary.js';
133133
export { set_text } from './render.js';
134134
export {
135135
get,

packages/svelte/src/internal/client/reactivity/deriveds.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { destroy_effect, render_effect } from './effects.js';
2727
import { inspect_effects, internal_set, set_inspect_effects, source } from './sources.js';
2828
import { get_stack } from '../dev/tracing.js';
2929
import { tracing_mode_flag } from '../../flags/index.js';
30-
import { preserve_context } from '../dom/blocks/boundary.js';
30+
import { suspend } from '../dom/blocks/boundary.js';
3131

3232
/**
3333
* @template V
@@ -103,7 +103,9 @@ export async function async_derived(fn) {
103103
// TODO what happens when the promise rejects?
104104
});
105105

106-
(await preserve_context(promise)).read();
106+
// wait for the initial promise
107+
(await suspend(promise)).exit();
108+
107109
return () => get(value);
108110
}
109111

0 commit comments

Comments
 (0)