[dart:developer] Add static Service.getObjectId method

TEST=pkg/vm_service/test/developer_service_get_object_id_test.dart

Fixes: https://github.com/dart-lang/sdk/issues/53012
Change-Id: I4b4dd49363ff2d91361e9054631516ea1520d3b6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/317160
Reviewed-by: Siva Annamalai <asiva@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Derek Xu <derekx@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
This commit is contained in:
Derek Xu 2023-08-04 14:18:38 +00:00 committed by Commit Queue
parent 0d16e25c6c
commit d0114ec0a2
7 changed files with 73 additions and 0 deletions

View file

@ -0,0 +1,35 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:developer';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'common/test_helper.dart';
final abcString = "abc";
final tests = <IsolateTest>[
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final isolate = await service.getIsolate(isolateId);
final evalResult = await service.evaluate(
isolateId, isolate.rootLib!.id!, 'abcString') as InstanceRef;
final getObjectIdResult = await Service.getObjectId(abcString)!;
final objectFromEval =
await service.getObject(isolateId, evalResult.id!) as Instance;
final objectFromGetObjectId =
await service.getObject(isolateId, getObjectIdResult) as Instance;
expect(objectFromEval.identityHashCode,
objectFromGetObjectId.identityHashCode);
expect(objectFromEval.valueAsString, objectFromGetObjectId.valueAsString);
},
];
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'developer_service_get_object_id_test.dart',
);

View file

@ -168,6 +168,18 @@ DEFINE_NATIVE_ENTRY(Developer_getIsolateIdFromSendPort, 0, 1) {
#endif
}
DEFINE_NATIVE_ENTRY(Developer_getObjectId, 0, 1) {
#if defined(PRODUCT)
return Object::null();
#else
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0));
JSONStream js;
RingServiceIdZone& ring_service_id_zone =
*reinterpret_cast<RingServiceIdZone*>(js.id_zone());
return String::New(ring_service_id_zone.GetServiceId(instance));
#endif
}
DEFINE_NATIVE_ENTRY(Developer_reachability_barrier, 0, 0) {
IsolateGroup* isolate_group = thread->isolate_group();
ASSERT(isolate_group != nullptr);

View file

@ -69,6 +69,7 @@ namespace dart {
V(Mint_bitLength, 1) \
V(Developer_debugger, 2) \
V(Developer_getIsolateIdFromSendPort, 1) \
V(Developer_getObjectId, 1) \
V(Developer_getServerInfo, 1) \
V(Developer_getServiceMajorVersion, 0) \
V(Developer_getServiceMinorVersion, 0) \

View file

@ -280,6 +280,11 @@ String? _getIsolateIdFromSendPort(SendPort sendPort) {
return null;
}
@patch
String? _getObjectId(Object object) {
return null;
}
@patch
class UserTag {
@patch

View file

@ -200,6 +200,11 @@ String? _getIsolateIdFromSendPort(SendPort sendPort) {
return null;
}
@patch
String? _getObjectId(Object object) {
return null;
}
@patch
class UserTag {
@patch

View file

@ -180,6 +180,10 @@ external void _webServerControl(
@pragma("vm:external-name", "Developer_getIsolateIdFromSendPort")
external String _getIsolateIdFromSendPort(SendPort sendPort);
@patch
@pragma("vm:external-name", "Developer_getObjectId")
external String _getObjectId(Object object);
@patch
abstract final class NativeRuntime {
@patch

View file

@ -118,6 +118,14 @@ final class Service {
ArgumentError.checkNotNull(isolate, 'isolate');
return _getIsolateIdFromSendPort(isolate.controlPort);
}
/// Returns a [String] token representing the ID of [object].
///
/// Returns null if the running Dart environment does not support the service
/// protocol.
static String? getObjectId(Object object) {
return _getObjectId(object);
}
}
/// [sendPort] will receive a Uri or null.
@ -135,3 +143,6 @@ external int _getServiceMinorVersion();
/// Returns the service id for the isolate that owns [sendPort].
external String? _getIsolateIdFromSendPort(SendPort sendPort);
/// Returns the service id of [object].
external String? _getObjectId(Object object);