From f7cc17fb7e60ddeaab5d78950535fcd4dbd6430c Mon Sep 17 00:00:00 2001 From: Ben Konyi Date: Wed, 3 Feb 2021 21:10:28 +0000 Subject: [PATCH] [ package:vm_service ] Fix issue where `null` was returned instead of `@Instance` of type `Null` Also includes some cleanup for next release. Fixes https://github.com/dart-lang/sdk/issues/44842 TEST=pkg/vm_service/test/regress_44842_test.dart Change-Id: I250fac7c52d6d5344bd5c3ec1c143deaa97419d9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182369 Reviewed-by: Gary Roumanis --- pkg/vm_service/CHANGELOG.md | 1 + pkg/vm_service/lib/src/vm_service.dart | 3 ++- pkg/vm_service/test/regress_44842_test.dart | 24 +++++++++++++++++++ pkg/vm_service/tool/dart/generate_dart.dart | 2 +- .../tests/service/get_version_rpc_test.dart | 2 +- .../tests/service_2/get_version_rpc_test.dart | 2 +- runtime/vm/service.h | 2 +- runtime/vm/service/service.md | 5 ++-- 8 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 pkg/vm_service/test/regress_44842_test.dart diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md index 81695eae7d6..322f95271dd 100644 --- a/pkg/vm_service/CHANGELOG.md +++ b/pkg/vm_service/CHANGELOG.md @@ -6,6 +6,7 @@ - Added `successors` iterable to `HeapSnapshotObject`, which provides a convenient way to access children of a given object. - Added `klass` getter to `HeapSnapshotObject`. +- Fixed issue where `null` could be returned instead of `InstanceRef` of type `Null`. ## 6.0.1 - Stable null-safe release. diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart index fa49390b3ca..cc0643eb2fd 100644 --- a/pkg/vm_service/lib/src/vm_service.dart +++ b/pkg/vm_service/lib/src/vm_service.dart @@ -55,7 +55,8 @@ Object? createServiceObject(dynamic json, List expectedTypes) { } else { return null; } - } else if (_isNullInstance(json) && (!expectedTypes.contains(type))) { + } else if (_isNullInstance(json) && + (!expectedTypes.contains('InstanceRef'))) { // Replace null instances with null when we don't expect an instance to // be returned. return null; diff --git a/pkg/vm_service/test/regress_44842_test.dart b/pkg/vm_service/test/regress_44842_test.dart new file mode 100644 index 00000000000..8a794b4d677 --- /dev/null +++ b/pkg/vm_service/test/regress_44842_test.dart @@ -0,0 +1,24 @@ +// Copyright (c) 2020, 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 'package:vm_service/vm_service.dart'; +import 'package:test/test.dart'; + +const Map kNullInstance = { + 'type': '@Instance', + 'id': 'instance/123', + 'kind': 'Null', + 'class': { + 'type': '@Class', + 'id': 'object/0', + 'name': 'Null', + } +}; + +void main() { + test('Ensure createServiceObject handles Null @Instances properly', () { + expect(createServiceObject(kNullInstance, ['InstanceRef']), isNotNull); + expect(createServiceObject(kNullInstance, ['ClassRef']), isNull); + }); +} diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart index 81b2970e6b1..3f4f20c4cbb 100644 --- a/pkg/vm_service/tool/dart/generate_dart.dart +++ b/pkg/vm_service/tool/dart/generate_dart.dart @@ -535,7 +535,7 @@ Object? createServiceObject(dynamic json, List expectedTypes) { } else { return null; } - } else if (_isNullInstance(json) && (!expectedTypes.contains(type))) { + } else if (_isNullInstance(json) && (!expectedTypes.contains('InstanceRef'))) { // Replace null instances with null when we don't expect an instance to // be returned. return null; diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart index 5e1a8c94db7..9596513fecf 100644 --- a/runtime/observatory/tests/service/get_version_rpc_test.dart +++ b/runtime/observatory/tests/service/get_version_rpc_test.dart @@ -12,7 +12,7 @@ var tests = [ final result = await vm.invokeRpcNoUpgrade('getVersion', {}); expect(result['type'], 'Version'); expect(result['major'], 3); - expect(result['minor'], 42); + expect(result['minor'], 43); expect(result['_privateMajor'], 0); expect(result['_privateMinor'], 0); }, diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart index 5160f96fb4f..9e2bc437869 100644 --- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart +++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart @@ -12,7 +12,7 @@ var tests = [ var result = await vm.invokeRpcNoUpgrade('getVersion', {}); expect(result['type'], equals('Version')); expect(result['major'], equals(3)); - expect(result['minor'], equals(42)); + expect(result['minor'], equals(43)); expect(result['_privateMajor'], equals(0)); expect(result['_privateMinor'], equals(0)); }, diff --git a/runtime/vm/service.h b/runtime/vm/service.h index f66a951972a..00a3f321004 100644 --- a/runtime/vm/service.h +++ b/runtime/vm/service.h @@ -15,7 +15,7 @@ namespace dart { #define SERVICE_PROTOCOL_MAJOR_VERSION 3 -#define SERVICE_PROTOCOL_MINOR_VERSION 42 +#define SERVICE_PROTOCOL_MINOR_VERSION 43 class Array; class EmbedderServiceHandler; diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md index 20deaed4142..39e71d23168 100644 --- a/runtime/vm/service/service.md +++ b/runtime/vm/service/service.md @@ -1,8 +1,8 @@ -# Dart VM Service Protocol 3.42 +# Dart VM Service Protocol 3.43 > Please post feedback to the [observatory-discuss group][discuss-list] -This document describes of _version 3.42_ of the Dart VM Service Protocol. This +This document describes of _version 3.43_ of the Dart VM Service Protocol. This protocol is used to communicate with a running Dart Virtual Machine. To use the Service Protocol, start the VM with the *--observe* flag. @@ -3948,5 +3948,6 @@ version | comments 3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`. 3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC. 3.42 | Added `limit` optional parameter to `getStack` RPC. +3.43 | Updated heap snapshot format to include identity hash codes. [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss