Avoid permanently paused isolates

These tests have some exceptions caused by missing fields on the
dynamic variable. The exceptions cause the `isolate.resume()` call to
not run, which also cause the test body to not complete.

Currently this is masked by the test runner, which immediately ignores
the test body once the first error occurs. That behavior is changing,
and a failure will not immediately end a test when the body is still
running. https://github.com/dart-lang/test/pull/1815

Some of these tests are currently are expected to fail, but not to
timeout. Fix the test implementations to more reliably complete the test
body, even when the test had an error. This does not fix the tests
themselves, it maintains the current pattern of failure, even after
updating the test runner.

- Use `Stream.firstWhere` over cancelling the stream subscription after
  the first breakpoint.
- Use `Future.whenComplete` to ensure the isolate is always unpaused,
  including after an exception in the expectations.

Tested: Passes with updated test runner in https://dart-review.googlesource.com/c/sdk/+/275401/4
Change-Id: If5a7f0264c580cb38bcc1bd95c035aaf5644124b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/275787
Auto-Submit: Nate Bosch <nbosch@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Nate Bosch <nbosch@google.com>
This commit is contained in:
Nate Bosch 2022-12-15 17:37:13 +00:00 committed by Commit Queue
parent f181b50249
commit f065dca391
2 changed files with 208 additions and 232 deletions

View file

@ -79,39 +79,36 @@ Future testMethod(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: ok
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: ok
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: ok
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: ok
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('new C().method(3)');
print("Result $result");
@ -128,39 +125,36 @@ Future testMethod2(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam');
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp');
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam');
expect(r.valueAsString, equals('7'));
r = await isolate.evalFrame(frameNumber, 'innerTemp');
expect(r.valueAsString, equals('8'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam');
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp');
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam');
expect(r.valueAsString, equals('7'));
r = await isolate.evalFrame(frameNumber, 'innerTemp');
expect(r.valueAsString, equals('8'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('C.method2(3)');
print("Result $result");
@ -177,31 +171,28 @@ Future testMethod3(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r.clazz.name, equals('C'));
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r.valueAsString, equals('1'));
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3'));
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r.clazz.name, equals('C'));
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r.valueAsString, equals('1'));
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3'));
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('new C().method3(3)');
print("Result $result");
@ -219,39 +210,36 @@ Future testMethod4(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: continued
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: continued
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
dynamic frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: continued
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: continued
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate(
'(){ new C().method4(3); C.closureWithReturnedHome(7); }()');

View file

@ -81,39 +81,36 @@ Future testMethod(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: ok
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: ok
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: ok
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: ok
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('new C().method(3)');
print("Result $result");
@ -130,39 +127,36 @@ Future testMethod2(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam');
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp');
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam');
expect(r.valueAsString, equals('7'));
r = await isolate.evalFrame(frameNumber, 'innerTemp');
expect(r.valueAsString, equals('8'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r is DartError, isTrue);
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam');
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp');
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam');
expect(r.valueAsString, equals('7'));
r = await isolate.evalFrame(frameNumber, 'innerTemp');
expect(r.valueAsString, equals('8'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('C.method2(3)');
print("Result $result");
@ -179,31 +173,28 @@ Future testMethod3(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r.clazz.name, equals('C'));
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r.valueAsString, equals('1'));
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3'));
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123');
expect(r.valueAsString, equals('123'));
r = await isolate.evalFrame(frameNumber, 'this');
expect(r.clazz.name, equals('C'));
r = await isolate.evalFrame(frameNumber, 'instVar');
expect(r.valueAsString, equals('1'));
r = await isolate.evalFrame(frameNumber, 'classVar');
expect(r.valueAsString, equals('2'));
r = await isolate.evalFrame(frameNumber, 'methodParam');
expect(r.valueAsString, equals('3'));
r = await isolate.evalFrame(frameNumber, 'methodTemp');
expect(r.valueAsString, equals('4'));
r = await isolate.evalFrame(frameNumber, 'math.sqrt');
expect(r.isClosure, isTrue);
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate('new C().method3(3)');
print("Result $result");
@ -221,39 +212,36 @@ Future testMethod4(Isolate isolate) async {
bool hitBreakpoint = false;
var stream = await isolate.vm.getEventStream(VM.kDebugStream);
var sub;
sub = stream.listen((ServiceEvent event) async {
stream.firstWhere((event) {
print("Event $event");
if (event.kind == ServiceEvent.kPauseBreakpoint) {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: continued
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: continued
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
return event.kind == ServiceEvent.kPauseBreakpoint;
}).then((event) async {
var frameNumber = 1, r;
r = await isolate.evalFrame(frameNumber, '123'); //# instance: continued
expect(r.valueAsString, equals('123')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'this'); //# scope: continued
expect(r.clazz.name, equals('C')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'instVar'); //# instance: continued
expect(r.valueAsString, equals('1')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
expect(r.valueAsString, equals('2')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'methodParam'); //# scope: continued
expect(r.valueAsString, equals('3')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'methodTemp'); //# scope: continued
expect(r.valueAsString, equals('4')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerParam'); //# scope: continued
expect(r.valueAsString, equals('5')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'outerTemp'); //# scope: continued
expect(r.valueAsString, equals('6')); //# scope: continued
r = await isolate.evalFrame(frameNumber, 'innerParam'); //# instance: continued
expect(r.valueAsString, equals('7')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'innerTemp'); //# instance: continued
expect(r.valueAsString, equals('8')); //# instance: continued
r = await isolate.evalFrame(frameNumber, 'math.sqrt'); //# instance: continued
expect(r.isClosure, isTrue); //# instance: continued
hitBreakpoint = true;
sub.cancel(); // Do not handle events for the other tests.
isolate.resume();
}
});
hitBreakpoint = true;
}).whenComplete(isolate.resume);
var result = await rootLib.evaluate(
'(){ new C().method4(3); C.closureWithReturnedHome(7); }()');