Skip to content

Commit 4f2902c

Browse files
authored
Implement deterministic collapse of 'await' in 'await using' (#262)
1 parent a280d4b commit 4f2902c

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

tslib.es6.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,17 +327,22 @@ export function __disposeResources(env) {
327327
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
328328
env.hasError = true;
329329
}
330+
var r, s = 0;
330331
function next() {
331-
while (env.stack.length) {
332-
var rec = env.stack.pop();
332+
while (r = env.stack.pop()) {
333333
try {
334-
var result = rec.dispose && rec.dispose.call(rec.value);
335-
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
334+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
335+
if (r.dispose) {
336+
var result = r.dispose.call(r.value);
337+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
338+
}
339+
else s |= 1;
336340
}
337341
catch (e) {
338342
fail(e);
339343
}
340344
}
345+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
341346
if (env.hasError) throw env.error;
342347
}
343348
return next();

tslib.es6.mjs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,17 +326,22 @@ export function __disposeResources(env) {
326326
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
327327
env.hasError = true;
328328
}
329+
var r, s = 0;
329330
function next() {
330-
while (env.stack.length) {
331-
var rec = env.stack.pop();
331+
while (r = env.stack.pop()) {
332332
try {
333-
var result = rec.dispose && rec.dispose.call(rec.value);
334-
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
333+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
334+
if (r.dispose) {
335+
var result = r.dispose.call(r.value);
336+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
337+
}
338+
else s |= 1;
335339
}
336340
catch (e) {
337-
fail(e);
341+
fail(e);
338342
}
339343
}
344+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
340345
if (env.hasError) throw env.error;
341346
}
342347
return next();

tslib.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,17 +374,22 @@ var __disposeResources;
374374
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
375375
env.hasError = true;
376376
}
377+
var r, s = 0;
377378
function next() {
378-
while (env.stack.length) {
379-
var rec = env.stack.pop();
379+
while (r = env.stack.pop()) {
380380
try {
381-
var result = rec.dispose && rec.dispose.call(rec.value);
382-
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
381+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
382+
if (r.dispose) {
383+
var result = r.dispose.call(r.value);
384+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
385+
}
386+
else s |= 1;
383387
}
384388
catch (e) {
385389
fail(e);
386390
}
387391
}
392+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
388393
if (env.hasError) throw env.error;
389394
}
390395
return next();

0 commit comments

Comments
 (0)