Skip to content

Commit 4389131

Browse files
bkonyicommit-bot@chromium.org
authored andcommitted
[ VM / Observatory ] Emit IsolateReload event after reload completes
Also fixed issue in observatory where script object ID expires in source_link after a reload, spewing exception dialogues. Fixes #37013 Change-Id: Ic52a2879fae5366e88d6dd3a3fb81490902f8bd5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/108164 Reviewed-by: Siva Annamalai <[email protected]> Commit-Queue: Ben Konyi <[email protected]>
1 parent 2ea7e55 commit 4389131

3 files changed

Lines changed: 22 additions & 0 deletions

File tree

‎runtime/observatory/lib/src/elements/source_link.dart‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:html';
88
import 'dart:async';
99
import 'package:observatory/models.dart'
1010
show IsolateRef, SourceLocation, Script, ScriptRepository;
11+
import 'package:observatory/service.dart' as S;
1112
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
1213
import 'package:observatory/src/elements/helpers/tag.dart';
1314
import 'package:observatory/src/elements/helpers/uris.dart';
@@ -48,6 +49,19 @@ class SourceLinkElement extends CustomElement implements Renderable {
4849
_repository.get(_isolate, _location.script.id).then((script) {
4950
_script = script;
5051
_r.dirty();
52+
}, onError: (e) {
53+
// The script object has expired, likely due to a hot reload.
54+
(_isolate as S.Isolate).getScripts().then((scripts) {
55+
for (final script in scripts) {
56+
if (script.uri == _location.script.uri) {
57+
_script = script;
58+
_r.dirty();
59+
return;
60+
}
61+
}
62+
// Rethrow the original exception if we can't find a match.
63+
throw e;
64+
});
5165
});
5266
_r.enable();
5367
}

‎runtime/observatory/lib/src/service/object.dart‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,12 @@ class Isolate extends ServiceObjectOwner implements M.Isolate {
14531453
return isolate.invokeRpc('getObject', params);
14541454
}
14551455

1456+
Future<List<Script>> getScripts() async {
1457+
final response = await invokeRpc('getScripts', {}) as ServiceMap;
1458+
assert(response.type == 'ScriptList');
1459+
return response['scripts'].cast<Script>();
1460+
}
1461+
14561462
Future<Map> _fetchDirect({int count: kDefaultFieldLimit}) async {
14571463
return invokeRpcNoUpgrade('getIsolate', {});
14581464
}

‎runtime/vm/isolate_reload.cc‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,8 @@ void IsolateReloadContext::Reload(bool force_reload,
799799
// Other errors (e.g. a parse error) are captured by the reload system.
800800
if (result.IsError()) {
801801
FinalizeFailedLoad(Error::Cast(result));
802+
} else {
803+
ReportSuccess();
802804
}
803805
}
804806

0 commit comments

Comments
 (0)