Skip to content

Commit b8d25b7

Browse files
mkustermannCommit Queue
authored andcommitted
[dart2wasm] Make slow path call StackTrace.current on null errors
For throwing normal exceptions we already outlined obtaining the current stack. We can do this for null check errors as well. Change-Id: Ie0505bfd99ff9c6738040c47b07e542439ee74a5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419161 Reviewed-by: Ömer Ağacan <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent 90aecc4 commit b8d25b7

File tree

5 files changed

+28
-9
lines changed

5 files changed

+28
-9
lines changed

pkg/dart2wasm/lib/async.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,15 @@ class AsyncStateMachineCodeGenerator extends StateMachineCodeGenerator {
274274
b.return_();
275275
}
276276

277+
void callCompleteErrorWithCurrentStack() {
278+
b.local_get(_suspendStateLocal);
279+
b.struct_get(
280+
asyncSuspendStateInfo.struct, FieldIndex.asyncSuspendStateCompleter);
281+
b.local_get(exceptionLocal);
282+
call(translator.completerCompleteErrorWithCurrentStack.reference);
283+
b.return_();
284+
}
285+
277286
// Handle Dart exceptions.
278287
b.catch_legacy(translator.getExceptionTag(b.module));
279288
b.local_set(stackTraceLocal);
@@ -289,10 +298,7 @@ class AsyncStateMachineCodeGenerator extends StateMachineCodeGenerator {
289298

290299
// JS exceptions won't have a Dart stack trace, so we attach the current
291300
// Dart stack trace.
292-
call(translator.stackTraceCurrent.reference);
293-
b.local_set(stackTraceLocal);
294-
295-
callCompleteError();
301+
callCompleteErrorWithCurrentStack();
296302

297303
b.end(); // try
298304

pkg/dart2wasm/lib/code_generator.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2651,8 +2651,7 @@ abstract class AstCodeGenerator
26512651
// We lower a null check to a br_on_non_null, throwing a [TypeError] in
26522652
// the null case.
26532653
b.br_on_non_null(nullCheckBlock);
2654-
call(translator.stackTraceCurrent.reference);
2655-
call(translator.throwNullCheckError.reference);
2654+
call(translator.throwNullCheckErrorWithCurrentStack.reference);
26562655
b.unreachable();
26572656
b.end();
26582657
return nonNullOperandType;

pkg/dart2wasm/lib/kernel_nodes.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ mixin KernelNodes {
147147
index.getField("dart:async", "_Completer", "future");
148148
late final Procedure completerComplete =
149149
index.getProcedure("dart:async", "_AsyncCompleter", "complete");
150+
late final Procedure completerCompleteErrorWithCurrentStack =
151+
index.getProcedure(
152+
"dart:async", "_AsyncCompleter", "_completeErrorWithCurrentStack");
150153
late final Procedure completerCompleteError =
151154
index.getProcedure("dart:async", "_Completer", "completeError");
152155
late final Procedure awaitHelper =
@@ -290,8 +293,8 @@ mixin KernelNodes {
290293
"_throwUnimplementedExternalMemberError");
291294
late final Procedure stackTraceCurrent =
292295
index.getProcedure("dart:core", "StackTrace", "get:current");
293-
late final Procedure throwNullCheckError =
294-
index.getProcedure("dart:core", "_TypeError", "_throwNullCheckError");
296+
late final Procedure throwNullCheckErrorWithCurrentStack = index.getProcedure(
297+
"dart:core", "_TypeError", "_throwNullCheckErrorWithCurrentStack");
295298
late final Procedure throwAsCheckError =
296299
index.getProcedure("dart:core", "_TypeError", "_throwAsCheckError");
297300
late final Procedure throwInterfaceTypeAsCheckError1 = index

sdk/lib/_internal/wasm/lib/async_patch.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ _AsyncSuspendState _newAsyncSuspendState(
8484
@pragma("wasm:entry-point")
8585
_AsyncCompleter<T> _makeAsyncCompleter<T>() => _AsyncCompleter<T>();
8686

87+
@patch
88+
@pragma("wasm:entry-point")
89+
class _AsyncCompleter<T> extends _Completer<T> {
90+
@pragma("wasm:entry-point")
91+
void _completeErrorWithCurrentStack(Object error) {
92+
completeError(error, StackTrace.current);
93+
}
94+
}
95+
8796
@pragma("wasm:entry-point")
8897
void _awaitHelper(_AsyncSuspendState suspendState, Object? operand) {
8998
if (operand is! Future) {

sdk/lib/_internal/wasm/lib/errors_patch.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ class _TypeError extends _Error implements TypeError {
7373
}
7474

7575
@pragma("wasm:entry-point")
76-
static Never _throwNullCheckError(StackTrace stackTrace) {
76+
@pragma("wasm:never-inline")
77+
static Never _throwNullCheckErrorWithCurrentStack() {
78+
final stackTrace = StackTrace.current;
7779
final typeError = _TypeError.fromMessageAndStackTrace(
7880
"Null check operator used on a null value",
7981
stackTrace,

0 commit comments

Comments
 (0)