[ VM Service ] Remove dynamic callsites from VM service
Fixes https://github.com/dart-lang/sdk/issues/48405
TEST=N/A
Change-Id: I975d713d27fac6221e3a06dce0cddaf1f5019b7d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239583
Reviewed-by: Devon Carew <devoncarew@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index 370e042..16be023 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -14,13 +14,7 @@
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:4] [@vm.unboxing-info.metadata=(b)->d] operator []([@vm.inferred-type.metadata=!] core::int i) → core::double
return [@vm.direct-call.metadata=dart.typed_data::_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int}){(core::num) → core::int}){(core::int) → core::double};
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
- block {
- [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}{core::List<core::double>};
- [@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}{core::int};
- } =>throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
- }
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6] [@vm.unboxing-info.metadata=(b)->d] operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5] [@vm.unboxing-info.metadata=(b)->d] operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
core::double result = 0.0;
for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}{core::int}){(core::num) → core::bool}; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1){(core::num) → core::int})
result = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i){(core::int) → core::double}.{core::double::*}([@vm.direct-call.metadata=#lib::_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i){(core::int) → core::double}){(core::num) → core::double}){(core::num) → core::double};
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index 033a9cf..f70166e 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -108,7 +108,7 @@
mode: ProcessStartMode.detachedWithStdio,
);
final completer = Completer<void>();
- late StreamSubscription stderrSub;
+ late StreamSubscription<String> stderrSub;
stderrSub = _process!.stderr.transform(utf8.decoder).listen((event) {
final result = json.decode(event) as Map<String, dynamic>;
final state = result['state'];
@@ -145,7 +145,7 @@
Process? _process;
}
-Future cleanupCallback() async {
+Future<void> cleanupCallback() async {
// Cancel the sigquit subscription.
if (_signalSubscription != null) {
await _signalSubscription.cancel();
@@ -191,7 +191,7 @@
return fsUri;
}
-Future deleteDirCallback(Uri path) async =>
+Future<void> deleteDirCallback(Uri path) async =>
await Directory.fromUri(path).delete(recursive: true);
class PendingWrite {
@@ -200,7 +200,7 @@
final Uri uri;
final List<int> bytes;
- Future write() async {
+ Future<void> write() async {
final file = File.fromUri(uri);
final parent_directory = file.parent;
await parent_directory.create(recursive: true);
@@ -221,7 +221,7 @@
static const kMaxOpenWrites = 16;
static int openWrites = 0;
- static Future scheduleWrite(Uri path, List<int> bytes) async {
+ static Future<void> scheduleWrite(Uri path, List<int> bytes) async {
// Create a new pending write.
final pw = PendingWrite(path, bytes);
pendingWrites.add(pw);
@@ -229,7 +229,7 @@
return pw.completer.future;
}
- static _maybeWriteFiles() {
+ static void _maybeWriteFiles() {
while (openWrites < kMaxOpenWrites) {
if (pendingWrites.length > 0) {
final pw = pendingWrites.removeLast();
@@ -241,14 +241,14 @@
}
}
- static _writeCompleted() {
+ static void _writeCompleted() {
openWrites--;
assert(openWrites >= 0);
_maybeWriteFiles();
}
}
-Future writeFileCallback(Uri path, List<int> bytes) async =>
+Future<void> writeFileCallback(Uri path, List<int> bytes) async =>
WriteLimiter.scheduleWrite(path, bytes);
Future<void> writeStreamFileCallback(Uri path, Stream<List<int>> bytes) async {
@@ -336,7 +336,7 @@
Timer? _registerSignalHandlerTimer;
-_registerSignalHandler() {
+void _registerSignalHandler() {
if (VMService().isExiting) {
// If the VM started shutting down we don't want to register this signal
// handler, otherwise we'll cause the VM to hang after killing the service
diff --git a/sdk/lib/_internal/vm/bin/vmservice_server.dart b/sdk/lib/_internal/vm/bin/vmservice_server.dart
index 129e237..03ea982 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_server.dart
@@ -28,40 +28,33 @@
socket.done.then((_) => close());
}
- Future<void> disconnect() async {
- if (socket != null) {
- await socket.close();
- }
- }
+ Future<void> disconnect() => socket.close();
void onWebSocketMessage(message) {
if (message is String) {
- Map map;
+ dynamic jsonObj;
try {
- map = json.decode(message);
+ jsonObj = json.decode(message);
} catch (e) {
socket.close(parseErrorCode, 'Message parse error: $e');
return;
}
- if (map is! Map) {
+ if (jsonObj is! Map<String, dynamic>) {
socket.close(notMapErrorCode, 'Message must be a JSON map.');
return;
}
- try {
- final rpc = Message.fromJsonRpc(this, map);
- switch (rpc.type) {
- case MessageType.Request:
- onRequest(rpc);
- break;
- case MessageType.Notification:
- onNotification(rpc);
- break;
- case MessageType.Response:
- onResponse(rpc);
- break;
- }
- } on dynamic catch (e) {
- socket.close(idErrorCode, e.message);
+ final Map<String, dynamic> map = jsonObj;
+ final rpc = Message.fromJsonRpc(this, map);
+ switch (rpc.type) {
+ case MessageType.Request:
+ onRequest(rpc);
+ break;
+ case MessageType.Notification:
+ onNotification(rpc);
+ break;
+ case MessageType.Response:
+ onResponse(rpc);
+ break;
}
} else {
socket.close(binaryMessageErrorCode, 'Message must be a string.');
@@ -80,7 +73,7 @@
socket.add(result.payload);
break;
case ResponsePayloadKind.Utf8String:
- socket.addUtf8Text(result.payload);
+ socket.addUtf8Text(result.payload as List<int>);
break;
}
} on StateError catch (_) {
@@ -272,7 +265,7 @@
: '/${requestPathSegments.sublist(1).join('/')}';
}
- Future _requestHandler(HttpRequest request) async {
+ Future<void> _requestHandler(HttpRequest request) async {
if (!_originCheck(request)) {
// This is a cross origin attempt to connect
request.response.statusCode = HttpStatus.forbidden;
@@ -283,10 +276,10 @@
if (request.method == 'PUT') {
// PUT requests are forwarded to DevFS for processing.
- List fsNameList;
- List? fsPathList;
- List? fsPathBase64List;
- List? fsUriBase64List;
+ List<String> fsNameList;
+ List<String>? fsPathList;
+ List<String>? fsPathBase64List;
+ List<String>? fsUriBase64List;
Object? fsName;
Object? fsPath;
Uri? fsUri;
@@ -327,11 +320,8 @@
return;
}
- if (result != null) {
- request.response.headers.contentType =
- HttpRequestClient.jsonContentType;
- request.response.write(result);
- }
+ request.response.headers.contentType = HttpRequestClient.jsonContentType;
+ request.response.write(result);
request.response.close();
return;
}
@@ -398,12 +388,12 @@
client.onRequest(message); // exception free, no need to try catch
}
- Future<void> _dumpServiceInfoToFile(String serviceInfoFilenameLocal) async {
+ Future<File> _dumpServiceInfoToFile(String serviceInfoFilenameLocal) async {
final serviceInfo = <String, dynamic>{
'uri': serverAddress.toString(),
};
final file = File.fromUri(Uri.parse(serviceInfoFilenameLocal));
- return file.writeAsString(json.encode(serviceInfo)) as Future<void>;
+ return file.writeAsString(json.encode(serviceInfo));
}
Future<Server> startup() async {
diff --git a/sdk/lib/vmservice/asset.dart b/sdk/lib/vmservice/asset.dart
index b42df32..985c905 100644
--- a/sdk/lib/vmservice/asset.dart
+++ b/sdk/lib/vmservice/asset.dart
@@ -42,10 +42,10 @@
if (tarBytes == null) {
return null;
}
- List assetList = _decodeAssets(tarBytes);
- Map<String, Asset> assets = new HashMap<String, Asset>();
+ final assetList = _decodeAssets(tarBytes);
+ final assets = <String, Asset>{};
for (int i = 0; i < assetList.length; i += 2) {
- final a = Asset(assetList[i], assetList[i + 1]);
+ final a = Asset(assetList[i] as String, assetList[i + 1] as Uint8List);
assets[a.name] = a;
}
return assets;
@@ -55,7 +55,7 @@
}
@pragma("vm:external-name", "VMService_DecodeAssets")
-external List _decodeAssets(Uint8List data);
+external List<Object> _decodeAssets(Uint8List data);
Map<String, Asset>? _assets;
Map<String, Asset> get assets {
diff --git a/sdk/lib/vmservice/devfs.dart b/sdk/lib/vmservice/devfs.dart
index 3463d6c..2815b06 100644
--- a/sdk/lib/vmservice/devfs.dart
+++ b/sdk/lib/vmservice/devfs.dart
@@ -84,7 +84,7 @@
if (deleteDir == null) {
return;
}
- final deletions = <Future>[
+ final deletions = <Future<void>>[
for (final fs in _fsMap.values) deleteDir(fs.uri),
];
Future.wait(deletions);
@@ -350,7 +350,7 @@
details: "${message.method}: invalid 'files' parameter "
"at index ${i}: ${fileInfo}");
}
- final uri = fs.resolvePath(fileInfo[0]);
+ final uri = fs.resolvePath(fileInfo[0] as String);
if (uri == null) {
return encodeRpcError(message, kInvalidParams,
details: "${message.method}: invalid 'files' parameter "
@@ -358,9 +358,10 @@
}
uris.add(uri);
}
- final pendingWrites = <Future>[];
+ final pendingWrites = <Future<void>>[];
for (int i = 0; i < uris.length; i++) {
- final decodedFileContents = base64.decode(files[i][1]);
+ final file = files[i].cast<String>();
+ final decodedFileContents = base64.decode(file[1]);
pendingWrites.add(writeFile(uris[i], decodedFileContents));
}
await Future.wait(pendingWrites);
@@ -386,7 +387,7 @@
final fileList = await listFiles(fs.uri);
// Remove any url-encoding in the filenames.
for (int i = 0; i < fileList.length; i++) {
- fileList[i]['name'] = Uri.decodeFull(fileList[i]['name']);
+ fileList[i]['name'] = Uri.decodeFull(fileList[i]['name'] as String);
}
final result = <String, dynamic>{'type': 'FSFileList', 'files': fileList};
return encodeResult(message, result);
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index e1164e5..a0b1fbf 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -18,15 +18,15 @@
final MessageType type;
// Client-side identifier for this message.
- final serial;
+ final Object? serial;
final String? method;
final params = <String, dynamic>{};
- final result = {};
- final error = {};
+ final result = <String, dynamic>{};
+ final error = <String, dynamic>{};
- factory Message.fromJsonRpc(Client? client, Map map) {
+ factory Message.fromJsonRpc(Client? client, Map<String, dynamic> map) {
if (map.containsKey('id')) {
final id = map['id'];
if (id != null && id is! num && id is! String) {
@@ -48,47 +48,47 @@
}
// http://www.jsonrpc.org/specification#request_object
- Message._fromJsonRpcRequest(Client? client, Map map)
+ Message._fromJsonRpcRequest(Client? client, Map<String, dynamic> map)
: client = client,
type = MessageType.Request,
serial = map['id'],
- method = map['method'] {
+ method = (map['method'] as String?) {
if (map['params'] != null) {
- params.addAll(map['params']);
+ params.addAll(map['params'] as Map<String, dynamic>);
}
}
// http://www.jsonrpc.org/specification#notification
- Message._fromJsonRpcNotification(Client? client, Map map)
+ Message._fromJsonRpcNotification(Client? client, Map<String, dynamic> map)
: client = client,
type = MessageType.Notification,
- method = map['method'],
+ method = (map['method'] as String?),
serial = null {
if (map['params'] != null) {
- params.addAll(map['params']);
+ params.addAll(map['params'] as Map<String, dynamic>);
}
}
// http://www.jsonrpc.org/specification#response_object
- Message._fromJsonRpcResult(Client? client, Map map)
+ Message._fromJsonRpcResult(Client? client, Map<String, dynamic> map)
: client = client,
type = MessageType.Response,
serial = map['id'],
method = null {
- result.addAll(map['result']);
+ result.addAll(map['result'] as Map<String, dynamic>);
}
// http://www.jsonrpc.org/specification#response_object
- Message._fromJsonRpcError(Client? client, Map map)
+ Message._fromJsonRpcError(Client? client, Map<String, dynamic> map)
: client = client,
type = MessageType.Response,
serial = map['id'],
method = null {
- error.addAll(map['error']);
+ error.addAll(map['error'] as Map<String, dynamic>);
}
static String _methodNameFromUri(Uri uri) {
- if (uri == null || uri.pathSegments.length == 0) {
+ if (uri.pathSegments.length == 0) {
return '';
}
return uri.pathSegments[0];
@@ -147,7 +147,7 @@
// elements in the list are strings, making consumption by C++ simpler.
// This has a side effect that boolean literal values like true become 'true'
// and thus indistinguishable from the string literal 'true'.
- List<String> _makeAllString(List list) {
+ List<String> _makeAllString(List<Object> list) {
var new_list = List<String>.filled(list.length, "");
for (var i = 0; i < list.length; i++) {
new_list[i] = list[i].toString();
@@ -167,8 +167,9 @@
_setResponseFromPort(value);
};
final keys = _makeAllString(params.keys.toList(growable: false));
- final values = _makeAllString(params.values.toList(growable: false));
- final request = List<dynamic>.filled(6, null)
+ final values =
+ _makeAllString(params.values.cast<Object>().toList(growable: false));
+ final request = List<Object?>.filled(6, null)
..[0] = 0 // Make room for OOB message type.
..[1] = receivePort.sendPort
..[2] = serial
@@ -212,7 +213,7 @@
_setResponseFromPort(value);
};
var keys = params.keys.toList(growable: false);
- var values = params.values.toList(growable: false);
+ var values = params.values.cast<Object>().toList(growable: false);
if (!_methodNeedsObjectParameters(method!)) {
keys = _makeAllString(keys);
values = _makeAllString(values);
@@ -235,7 +236,7 @@
return _completer.future;
}
- void _setResponseFromPort(dynamic response) {
+ void _setResponseFromPort(Object? response) {
if (response == null) {
// We should only have a null response for Notifications.
assert(type == MessageType.Notification);
@@ -252,10 +253,10 @@
}
@pragma("vm:external-name", "VMService_SendIsolateServiceMessage")
-external bool sendIsolateServiceMessage(SendPort sp, List m);
+external bool sendIsolateServiceMessage(SendPort sp, List<Object?> m);
@pragma("vm:external-name", "VMService_SendRootServiceMessage")
-external void sendRootServiceMessage(List m);
+external void sendRootServiceMessage(List<Object?> m);
@pragma("vm:external-name", "VMService_SendObjectRootServiceMessage")
-external void sendObjectRootServiceMessage(List m);
+external void sendObjectRootServiceMessage(List<Object?> m);
diff --git a/sdk/lib/vmservice/message_router.dart b/sdk/lib/vmservice/message_router.dart
index 2ca8d4f..fb5adac 100644
--- a/sdk/lib/vmservice/message_router.dart
+++ b/sdk/lib/vmservice/message_router.dart
@@ -74,9 +74,9 @@
dynamic decodeJson() {
switch (kind) {
case ResponsePayloadKind.String:
- return json.decode(payload);
+ return json.decode(payload as String);
case ResponsePayloadKind.Utf8String:
- return json.fuse(utf8).decode(payload);
+ return json.fuse(utf8).decode(payload as List<int>);
case ResponsePayloadKind.Binary:
throw 'Binary responses can not be decoded';
}
diff --git a/sdk/lib/vmservice/named_lookup.dart b/sdk/lib/vmservice/named_lookup.dart
index 0c0a5a8..8431ccf 100644
--- a/sdk/lib/vmservice/named_lookup.dart
+++ b/sdk/lib/vmservice/named_lookup.dart
@@ -48,7 +48,7 @@
/// Returns a new Id (possibly recycled)
String newId() {
- var id;
+ String id;
if (_free.isEmpty) {
id = prologue + (_next++).toString();
} else {
diff --git a/sdk/lib/vmservice/running_isolate.dart b/sdk/lib/vmservice/running_isolate.dart
index 3902193..de8bf87 100644
--- a/sdk/lib/vmservice/running_isolate.dart
+++ b/sdk/lib/vmservice/running_isolate.dart
@@ -14,7 +14,7 @@
void onIsolateExit() {
pendingMessagesReceivePorts.forEach((port) {
- (port as RawReceivePort).close();
+ port.close();
});
}
diff --git a/sdk/lib/vmservice/running_isolates.dart b/sdk/lib/vmservice/running_isolates.dart
index e699cb3..09f2f55 100644
--- a/sdk/lib/vmservice/running_isolates.dart
+++ b/sdk/lib/vmservice/running_isolates.dart
@@ -27,7 +27,7 @@
@override
Future<Response> routeRequest(VMService service, Message message) {
- String isolateParam = message.params['isolateId']!;
+ String isolateParam = message.params['isolateId']! as String;
int isolateId;
if (!isolateParam.startsWith('isolates/')) {
message.setErrorResponse(
@@ -76,16 +76,20 @@
Future<Response> run() async {
final buildScopeResponse = await _buildScope();
- final responseJson = buildScopeResponse.decodeJson();
+ final responseJson =
+ buildScopeResponse.decodeJson() as Map<String, dynamic>;
if (responseJson.containsKey('error')) {
- return Response.from(encodeCompilationError(
- _message, responseJson['error']['data']['details']));
+ final error = responseJson['error'] as Map<String, dynamic>;
+ final data = error['data'] as Map<String, dynamic>;
+ return Response.from(
+ encodeCompilationError(_message, data['details'] as String));
}
String kernelBase64;
try {
- kernelBase64 = await _compileExpression(responseJson['result']);
+ kernelBase64 = await _compileExpression(
+ responseJson['result'] as Map<String, dynamic>);
} catch (e) {
return Response.from(encodeCompilationError(_message, e.toString()));
}
@@ -105,7 +109,8 @@
'params': params,
};
if (_message.params['scope'] != null) {
- buildScopeParams['params']['scope'] = _message.params['scope'];
+ (buildScopeParams['params'] as Map<String, dynamic>)['scope'] =
+ _message.params['scope'];
}
final buildScope =
Message._fromJsonRpcRequest(_message.client!, buildScopeParams);
@@ -157,11 +162,12 @@
externalClient.post(Response.json(compileExpression
.forwardToJson({'id': id, 'method': 'compileExpression'})));
return completer.future.then((s) => jsonDecode(s)).then((json) {
- final Map<String, dynamic> jsonMap = json;
+ final jsonMap = json as Map<String, dynamic>;
if (jsonMap.containsKey('error')) {
- throw jsonMap['error'];
+ throw jsonMap['error'] as Object;
}
- return jsonMap['result']['kernelBytes'];
+ return (jsonMap['result'] as Map<String, dynamic>)['kernelBytes']
+ as String;
});
} else {
// fallback to compile using kernel service
@@ -177,10 +183,14 @@
.routeRequest(_service, compileExpression)
.then((response) => response.decodeJson())
.then((json) {
- if (json['result'] != null) {
- return json['result']['kernelBytes'];
+ final response = json as Map<String, dynamic>;
+ if (response['result'] != null) {
+ return (response['result'] as Map<String, dynamic>)['kernelBytes']
+ as String;
}
- throw json['error']['data']['details'];
+ final error = response['error'] as Map<String, dynamic>;
+ final data = error['data'] as Map<String, dynamic>;
+ throw data['details'] as Object;
});
}
}
@@ -197,7 +207,8 @@
'params': params,
};
if (_message.params['scope'] != null) {
- runParams['params']['scope'] = _message.params['scope'];
+ (runParams['params'] as Map<String, dynamic>)['scope'] =
+ _message.params['scope'];
}
final runExpression =
Message._fromJsonRpcRequest(_message.client!, runParams);
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index ae16c86..eac4597 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -102,7 +102,7 @@
},
};
if (details != null) {
- response['error']['data'] = <String, String>{
+ (response['error'] as Map<String, dynamic>)['data'] = <String, String>{
'details': details,
};
}
@@ -122,7 +122,8 @@
String encodeCompilationError(Message message, String diagnostic) =>
encodeRpcError(message, kExpressionCompilationError, details: diagnostic);
-String encodeResult(Message message, Map result) => json.encode({
+String encodeResult(Message message, Map<String, dynamic> result) =>
+ json.encode({
'jsonrpc': '2.0',
'id': message.serial,
'result': result,
@@ -134,10 +135,10 @@
const shortDelay = Duration(milliseconds: 10);
/// Called when the server should be started.
-typedef Future ServerStartCallback();
+typedef Future<void> ServerStartCallback();
/// Called when the server should be stopped.
-typedef Future ServerStopCallback();
+typedef Future<void> ServerStopCallback();
/// Called when DDS has connected.
typedef Future<void> DdsConnectedCallback();
@@ -146,19 +147,19 @@
typedef Future<void> DdsDisconnectedCallback();
/// Called when the service is exiting.
-typedef Future CleanupCallback();
+typedef Future<void> CleanupCallback();
/// Called to create a temporary directory
typedef Future<Uri> CreateTempDirCallback(String base);
/// Called to delete a directory
-typedef Future DeleteDirCallback(Uri path);
+typedef Future<void> DeleteDirCallback(Uri path);
/// Called to write a file.
-typedef Future WriteFileCallback(Uri path, List<int> bytes);
+typedef Future<void> WriteFileCallback(Uri path, List<int> bytes);
/// Called to write a stream into a file.
-typedef Future WriteStreamFileCallback(Uri path, Stream<List<int>> bytes);
+typedef Future<void> WriteStreamFileCallback(Uri path, Stream<List<int>> bytes);
/// Called to read a file.
typedef Future<List<int>> ReadFileCallback(Uri path);
@@ -269,7 +270,7 @@
details: 'A DDS instance is already connected at ${_ddsUri!}.');
}
- final uri = message.params['uri'];
+ final uri = message.params['uri'] as String?;
if (uri == null) {
return encodeMissingParamError(message, 'uri');
}
@@ -340,13 +341,15 @@
void _profilerEventMessageHandler(Client client, Response event) {
final eventJson = event.decodeJson() as Map<String, dynamic>;
- final eventData = eventJson['params']!['event']!;
+ final params = eventJson['params']! as Map<String, dynamic>;
+ final eventData = params['event']! as Map<String, dynamic>;
if (eventData['kind']! != 'CpuSamples') {
client.post(event);
return;
}
- final cpuSamplesEvent = eventData['cpuSamples']!;
- final updatedSamples = cpuSamplesEvent['samples']!
+ final cpuSamplesEvent = eventData['cpuSamples']! as Map<String, dynamic>;
+ final samples = cpuSamplesEvent['samples']!.cast<Map<String, dynamic>>();
+ final updatedSamples = samples
.where(
(s) => client.profilerUserTagFilters.contains(s['userTag']),
)
@@ -407,13 +410,14 @@
}
}
- Future<void> _handleNativeRpcCall(message, SendPort replyPort) async {
+ Future<void> _handleNativeRpcCall(
+ List<int> message, SendPort replyPort) async {
// Keep in sync with 'runtime/vm/service_isolate.cc:InvokeServiceRpc'.
Response response;
try {
final rpc = Message.fromJsonRpc(
- null, json.decode(utf8.decode(message as List<int>)));
+ null, json.decode(utf8.decode(message)) as Map<String, dynamic>);
if (rpc.type != MessageType.Request) {
response = Response.internalError(
'The client sent a non-request json-rpc message.');
@@ -427,7 +431,7 @@
late List<int> bytes;
switch (response.kind) {
case ResponsePayloadKind.String:
- bytes = utf8.encode(response.payload);
+ bytes = utf8.encode(response.payload as String);
bytes = bytes is Uint8List ? bytes : Uint8List.fromList(bytes);
break;
case ResponsePayloadKind.Binary:
@@ -448,7 +452,7 @@
devfs.cleanup();
}
- Future _exit() async {
+ Future<void> _exit() async {
isExiting = true;
final serverStop = VMServiceEmbedderHooks.serverStop;
@@ -474,7 +478,8 @@
if (message is List) {
if (message.length == 2) {
// This is an event.
- _eventMessageHandler(message[0], Response.from(message[1]));
+ _eventMessageHandler(
+ message[0] as String, Response.from(message[1] as Object));
return;
}
if (message.length == 1) {
@@ -485,20 +490,25 @@
}
final opcode = message[0];
if (message.length == 3 && opcode == Constants.METHOD_CALL_FROM_NATIVE) {
- _handleNativeRpcCall(message[1], message[2]);
+ _handleNativeRpcCall(message[1] as List<int>, message[2] as SendPort);
return;
}
if (message.length == 4) {
if ((opcode == Constants.WEB_SERVER_CONTROL_MESSAGE_ID) ||
(opcode == Constants.SERVER_INFO_MESSAGE_ID)) {
// This is a message interacting with the web server.
- _serverMessageHandler(message[0], message[1], message[2], message[3]);
+ _serverMessageHandler(
+ message[0] as int,
+ message[1] as SendPort,
+ message[2] as bool,
+ message[3] as bool?,
+ );
return;
} else {
// This is a message informing us of the birth or death of an
// isolate.
- _controlMessageHandler(
- message[0], message[1], message[2], message[3]);
+ _controlMessageHandler(message[0] as int, message[1] as int,
+ message[2] as SendPort, message[3] as String);
return;
}
}
@@ -543,7 +553,7 @@
Future<String> _streamListen(Message message) async {
final client = message.client!;
- final streamId = message.params['streamId']!;
+ final streamId = message.params['streamId']! as String;
if (client.streams.contains(streamId)) {
return encodeRpcError(message, kStreamAlreadySubscribed);
@@ -576,7 +586,7 @@
Future<String> _streamCancel(Message message) async {
final client = message.client!;
- final streamId = message.params['streamId']!;
+ final streamId = message.params['streamId']! as String;
if (!client.streams.contains(streamId)) {
return encodeRpcError(message, kStreamNotSubscribed);
@@ -676,11 +686,12 @@
}
Future<String> _getSupportedProtocols(Message message) async {
- final version = json.decode(
+ final payload = json.decode(
utf8.decode(
- (await Message.forMethod('getVersion').sendToVM()).payload,
+ (await Message.forMethod('getVersion').sendToVM()).payload as List<int>,
),
- )['result'];
+ ) as Map<String, dynamic>;
+ final version = payload['result'] as Map<String, dynamic>;
final protocols = {
'type': 'ProtocolList',
'protocols': [
@@ -722,7 +733,8 @@
// TODO(bkonyi): handle "subscribe all" case.
final client = message.client!;
- final tags = message.params['userTags']!.cast<String>().toSet();
+ final userTags = message.params['userTags']!.cast<String>();
+ final tags = userTags.toSet();
final newTags = tags.difference(_profilerUserTagSubscriptions);
// Clear the previously set user tag subscriptions for the client and
@@ -755,7 +767,7 @@
return Response.from(response);
}
- Future _routeRequestImpl(Message message) async {
+ Future<Object?> _routeRequestImpl(Message message) async {
try {
if (message.completed) {
return await message.response;
@@ -798,7 +810,7 @@
final client = message.client!;
if (client.serviceHandles.containsKey(message.serial)) {
client.serviceHandles.remove(message.serial)!(message);
- _serviceRequests.release(message.serial);
+ _serviceRequests.release(message.serial as String);
}
}
}
@@ -841,7 +853,7 @@
/// Get the bytes to the tar archive.
@pragma("vm:external-name", "VMService_RequestAssets")
-external Uint8List _requestAssets();
+external Uint8List? _requestAssets();
@pragma("vm:external-name", "VMService_AddUserTagsToStreamableSampleList")
external void _addUserTagsToStreamableSampleList(List<String> userTags);