mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:33:28 +00:00
[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:
parent
081074ebf4
commit
5a44162c97
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue