Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions dwds/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 16.0.2+1

- Handle the case where `list.objectId` is `null` in
`batched_expression_evaluator` to fix crash on Flutter 3.7.0:
https://github.com/flutter/flutter/issues/119084

## 16.0.2
- Don't complete an already completed `Completer` in `ChromeProxyService` to fix
Flutter tools crash: https://github.com/dart-lang/webdev/pull/1862
Expand Down
26 changes: 17 additions & 9 deletions dwds/lib/src/services/batched_expression_evaluator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,23 @@ class BatchedExpressionEvaluator extends ExpressionEvaluator {
final request = requests[i];
if (request.completer.isCompleted) continue;
_logger.fine('Getting result out of a batch for ${request.expression}');
_debugger
.getProperties(list.objectId!,
offset: i, count: 1, length: requests.length)
.then((v) {
final result = v.first.value;
_logger.fine(
'Got result out of a batch for ${request.expression}: $result');
request.completer.complete(result);
});
final listId = list.objectId;
if (listId == null) {
final error = RemoteObject(<String, String>{
'type': '${ErrorKind.internal}',
'value': 'No batch result object ID.'
});
request.completer.complete(error);
} else {
_debugger
.getProperties(listId, offset: i, count: 1, length: requests.length)
.then((v) {
final result = v.first.value;
_logger.fine(
'Got result out of a batch for ${request.expression}: $result');
request.completer.complete(result);
});
}
}
}
}
26 changes: 26 additions & 0 deletions dwds/test/evaluate_common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,32 @@ void testAll({
(instance) => instance.valueAsString, 'valueAsString', '1'));
});

test('in parallel (in a batch) handles errors', () async {
final library = isolate.rootLib!;
final missingLibId = '';
final evaluation1 = setup.service
.evaluate(isolateId, missingLibId, 'MainClass(0).toString()');
final evaluation2 = setup.service
.evaluate(isolateId, library.id!, 'MainClass(1).toString()');

final results = await Future.wait([evaluation1, evaluation2]);

expect(
results[0],
isA<ErrorRef>().having(
(instance) => instance.message,
'message',
contains('No batch result object ID'),
));
expect(
results[1],
isA<ErrorRef>().having(
(instance) => instance.message,
'message',
contains('No batch result object ID'),
));
});

test('with scope override', () async {
final library = isolate.rootLib!;
final object = await setup.service
Expand Down