Skip to content

Commit e1efba0

Browse files
Anna GringauzeCommit Queue
Anna Gringauze
authored and
Commit Queue
committed
[ddc] Fix exception on pausing in library with late globals
Closes: #53603 Change-Id: If2c9b62204dc00c5d0316e66ab34bf10855e9c92 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/327823 Reviewed-by: Nicholas Shahan <[email protected]> Commit-Queue: Anna Gringauze <[email protected]>
1 parent ec6def5 commit e1efba0

File tree

3 files changed

+349
-406
lines changed

3 files changed

+349
-406
lines changed

pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,14 @@ class ExpressionEvaluationTestDriver {
184184
var sound = ${setup.soundNullSafety};
185185
var sdk = dart_library.import('dart_sdk');
186186
187-
if (!sound) {
187+
if (sound) {
188+
sdk.dart.nativeNonNullAsserts(true);
189+
} else {
188190
sdk.dart.weakNullSafetyWarnings(false);
189191
sdk.dart.weakNullSafetyErrors(false);
192+
sdk.dart.nonNullAsserts(true);
190193
}
191-
sdk.dart.nonNullAsserts(true);
192-
sdk.dart.nativeNonNullAsserts(true);
194+
193195
sdk._debugger.registerDevtoolsFormatter();
194196
dart_library.start('$appName', '$uuid', '$moduleName', '$mainLibraryName',
195197
false);
@@ -235,12 +237,14 @@ class ExpressionEvaluationTestDriver {
235237
function(sdk, app) {
236238
'use strict';
237239
238-
if (!sound) {
239-
sdk.dart.weakNullSafetyWarnings(false);
240-
sdk.dart.weakNullSafetyErrors(false);
240+
if (sound) {
241+
sdk.dart.nativeNonNullAsserts(true);
242+
} else {
243+
sdk.dart.weakNullSafetyWarnings(false);
244+
sdk.dart.weakNullSafetyErrors(false);
245+
sdk.dart.nonNullAsserts(true);
241246
}
242-
sdk.dart.nonNullAsserts(true);
243-
sdk.dart.nativeNonNullAsserts(true);
247+
244248
sdk._debugger.registerDevtoolsFormatter();
245249
app.$mainLibraryName.main([]);
246250
});
@@ -479,14 +483,36 @@ class ExpressionEvaluationTestDriver {
479483
/// only primitive values, lists or maps, etc.
480484
///
481485
/// TODO(annagrin): Add recursive check for nested objects.
482-
Future<void> checkRuntime({
486+
Future<void> checkRuntimeInFrame({
483487
required String breakpointId,
484488
required String expression,
485-
required dynamic expectedResult,
489+
dynamic expectedError,
490+
dynamic expectedResult,
486491
}) async {
492+
assert(expectedError == null || expectedResult == null,
493+
'Cannot expect both an error and result.');
494+
487495
return await _onBreakpoint(breakpointId, onPause: (event) async {
488-
var actual = await _evaluateJsExpression(event, expression);
489-
expect(actual.json, expectedResult);
496+
var evalResult = await _evaluateJsExpression(event, expression);
497+
498+
var error = evalResult.json['error'];
499+
if (error != null) {
500+
expect(
501+
expectedError,
502+
isNotNull,
503+
reason: 'Unexpected expression evaluation failure:\n$error',
504+
);
505+
expect(error, _matches(expectedError!));
506+
} else {
507+
expect(
508+
expectedResult,
509+
isNotNull,
510+
reason:
511+
'Unexpected expression evaluation success:\n${evalResult.json}',
512+
);
513+
var actual = evalResult.value;
514+
expect(actual, _matches(equals(expectedResult!)));
515+
}
490516
});
491517
}
492518

@@ -577,24 +603,23 @@ class ExpressionEvaluationTestDriver {
577603
var frame = event.getCallFrames().first;
578604

579605
var jsExpression = '''
580-
(function () {
581-
try {
582-
var sdk = ${setup.loadModule}('dart_sdk');
583-
var dart = sdk.dart;
584-
var interceptors = sdk._interceptors;
585-
return $expression;
586-
} catch (error) {
587-
return "Runtime API call failed: " + error.name +
588-
": " + error.message + ": " + error.stack;
589-
}
590-
})()
606+
(function () {
607+
var sdk = ${setup.loadModule}('dart_sdk');
608+
var dart = sdk.dart;
609+
var interceptors = sdk._interceptors;
610+
return $expression;
611+
})()
591612
''';
592613

593-
return await debugger.evaluateOnCallFrame(
594-
frame.callFrameId,
595-
jsExpression,
596-
returnByValue: returnByValue,
597-
);
614+
try {
615+
return await debugger.evaluateOnCallFrame(
616+
frame.callFrameId,
617+
jsExpression,
618+
returnByValue: returnByValue,
619+
);
620+
} on wip.ExceptionDetails catch (e) {
621+
return _createRuntimeError(e);
622+
}
598623
}
599624

600625
Future<TestCompilationResult> _compileDartExpressionInFrame(
@@ -705,15 +730,20 @@ class ExpressionEvaluationTestDriver {
705730
if (obj.subtype == 'null') {
706731
return 'null';
707732
}
708-
var properties =
709-
await connection.runtime.getProperties(obj, ownProperties: true);
710-
var filteredProps = <String, String?>{};
711-
for (var prop in properties) {
712-
if (prop.value != null && prop.name != '__proto__') {
713-
filteredProps[prop.name] = await stringifyRemoteObject(prop.value!);
733+
try {
734+
var properties =
735+
await connection.runtime.getProperties(obj, ownProperties: true);
736+
var filteredProps = <String, String?>{};
737+
for (var prop in properties) {
738+
if (prop.value != null && prop.name != '__proto__') {
739+
filteredProps[prop.name] =
740+
await stringifyRemoteObject(prop.value!);
741+
}
714742
}
743+
str = '${obj.description} $filteredProps';
744+
} catch (e, s) {
745+
throw StateError('Failed to stringify remote object $obj: $e:$s');
715746
}
716-
str = '${obj.description} $filteredProps';
717747
break;
718748
default:
719749
str = '${obj.value}';
@@ -734,8 +764,8 @@ class ExpressionEvaluationTestDriver {
734764
.getProperties(scope.object, ownProperties: true);
735765
for (var prop in response) {
736766
var propKey = prop.name;
737-
var propValue = '${prop.value!.value}';
738-
if (prop.value!.type == 'string') {
767+
var propValue = '${prop.value?.value}';
768+
if (prop.value?.type == 'string') {
739769
propValue = "'$propValue'";
740770
} else if (propValue == 'null') {
741771
propValue = propKey;

0 commit comments

Comments
 (0)