[vm] Fix incorrect override in vmservice source

VMService.routeRequest of type Future Function(Message) overrides
MessageRouter.routeRequest of type Future<String> Function(Message).

It not enough to just fix VMService.routeRequest's return type because
Message.sendToVM() violates its type signature: it declares to
return Future<String> but in reality it returns Future<dynamic>
which can complete with either String or List. This CL addresses
this issue as well.

Bug:
Change-Id: I8240113d3e13d67c4e9a59db4250132a2077a4ec
Reviewed-on: https://dart-review.googlesource.com/26701
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Vyacheslav Egorov 2017-12-12 18:54:58 +00:00 committed by commit-bot@chromium.org
parent 081074ebf4
commit 5a44162c97
2 changed files with 35 additions and 36 deletions

View file

@ -7,7 +7,7 @@ part of dart._vmservice;
enum MessageType { Request, Notification, Response }
class Message {
final Completer _completer = new Completer.sync();
final Completer<String> _completer = new Completer<String>.sync();
bool get completed => _completer.isCompleted;
/// Future of response.
@ -187,7 +187,7 @@ class Message {
final receivePort = new RawReceivePort();
receivePort.handler = (value) {
receivePort.close();
_completer.complete(value);
_setResponseFromPort(value);
};
var keys = _makeAllString(params.keys.toList(growable: false));
var values = _makeAllString(params.values.toList(growable: false));
@ -235,34 +235,40 @@ class Message {
final receivePort = new RawReceivePort();
receivePort.handler = (value) {
receivePort.close();
_completer.complete(value);
_setResponseFromPort(value);
};
final keys = params.keys.toList(growable: false);
final values = params.values.toList(growable: false);
if (!_methodNeedsObjectParameters(method)) {
_makeAllString(keys);
_makeAllString(values);
}
final request = new List(6)
..[0] = 0 // Make room for OOB message type.
..[1] = receivePort.sendPort
..[2] = serial
..[3] = method
..[4] = keys
..[5] = values;
if (_methodNeedsObjectParameters(method)) {
// We use a different method invocation path here.
var keys = params.keys.toList(growable: false);
var values = params.values.toList(growable: false);
var request = new List(6)
..[0] = 0 // Make room for OOB message type.
..[1] = receivePort.sendPort
..[2] = serial
..[3] = method
..[4] = keys
..[5] = values;
sendObjectRootServiceMessage(request);
return _completer.future;
} else {
var keys = _makeAllString(params.keys.toList(growable: false));
var values = _makeAllString(params.values.toList(growable: false));
var request = new List(6)
..[0] = 0 // Make room for OOB message type.
..[1] = receivePort.sendPort
..[2] = serial
..[3] = method
..[4] = keys
..[5] = values;
sendRootServiceMessage(request);
return _completer.future;
}
return _completer.future;
}
void _setResponseFromPort(response) {
if (response is List) {
// See JSONStream::PostReply for the format of messages that arrive from
// VM.
response = utf8.decode(response[0]);
}
_completer.complete(response);
}
void setResponse(String response) {

View file

@ -531,14 +531,7 @@ class VMService extends MessageRouter {
return encodeSuccess(message);
}
static responseAsJson(portResponse) {
if (portResponse is String) {
return json.decode(portResponse);
} else {
var cstring = portResponse[0];
return json.fuse(utf8).decode(cstring);
}
}
static _responseAsJson(String response) => json.decode(response);
// TODO(johnmccutchan): Turn this into a command line tool that uses the
// service library.
@ -563,12 +556,12 @@ class VMService extends MessageRouter {
// Request VM.
var getVM = Uri.parse('getVM');
var getVmResponse =
responseAsJson(await new Message.fromUri(client, getVM).sendToVM());
_responseAsJson(await new Message.fromUri(client, getVM).sendToVM());
responses[getVM.toString()] = getVmResponse['result'];
// Request command line flags.
var getFlagList = Uri.parse('getFlagList');
var getFlagListResponse = responseAsJson(
var getFlagListResponse = _responseAsJson(
await new Message.fromUri(client, getFlagList).sendToVM());
responses[getFlagList.toString()] = getFlagListResponse['result'];
@ -578,13 +571,13 @@ class VMService extends MessageRouter {
var message = new Message.forIsolate(client, request, isolate);
// Decode the JSON and and insert it into the map. The map key
// is the request Uri.
var response = responseAsJson(await isolate.routeRequest(message));
var response = _responseAsJson(await isolate.routeRequest(message));
responses[message.toUri().toString()] = response['result'];
}
// Dump the object id ring requests.
var message =
new Message.forIsolate(client, Uri.parse('_dumpIdZone'), isolate);
var response = responseAsJson(await isolate.routeRequest(message));
var response = _responseAsJson(await isolate.routeRequest(message));
// Insert getObject requests into responses map.
for (var object in response['result']['objects']) {
final requestUri =
@ -597,7 +590,7 @@ class VMService extends MessageRouter {
return encodeResult(message, responses);
}
Future routeRequest(Message message) async {
Future<String> routeRequest(Message message) async {
try {
if (message.completed) {
return await message.response;