896e535fe9
We support allocating deeply immutable typed data in the Dart C API
already.
=> This CL adds a test for that.
Furthermore we hook into the already O(n) construction of
`List.unmodifiable(<list>)` and set the objects immutable bit
if all elements of `<list>` are also immutable.
=> This allows then sharing of such lists when sent across isolates.
We do this eagerly to
- avoid introducing complexity to the deep immutability check in
transitive copy algorithm
- avoids re-checking for the subgraph on every send (similar to
canonicalized bit for constants, we can simply rely on the
immutable bit)
If we ever optimized `List.unmodifiable()` (which always performs
runtime call atm) we could fold this checking into the place that copies
list elements from `<list>` to the newly allocated list.
Issue https://github.com/dart-lang/sdk/issues/51302
TEST=vm/dart{,_2}/isolates/fast_object_copy2_test
Change-Id: Ie275e65036a4c53d992804972aae741a9f5ed6dd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/281424
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
35 lines
1.0 KiB
C++
35 lines
1.0 KiB
C++
// Copyright (c) 2021, 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.
|
|
|
|
#ifndef RUNTIME_VM_OBJECT_GRAPH_COPY_H_
|
|
#define RUNTIME_VM_OBJECT_GRAPH_COPY_H_
|
|
|
|
namespace dart {
|
|
|
|
class Object;
|
|
class ObjectPtr;
|
|
|
|
// Whether the object can safely be shared across isolates due to it being
|
|
// deeply immutable.
|
|
bool CanShareObjectAcrossIsolates(ObjectPtr obj);
|
|
|
|
// Makes a transitive copy of the object graph referenced by [object]. Will not
|
|
// copy objects that can be safely shared - due to being immutable.
|
|
//
|
|
// The result will be an array of length 3 of the format
|
|
//
|
|
// [
|
|
// <message>,
|
|
// <collection-lib-objects-to-rehash>,
|
|
// <core-lib-objects-to-rehash>,
|
|
// ]
|
|
//
|
|
// If the array of objects to rehash is not `null` the receiver should re-hash
|
|
// those objects.
|
|
ObjectPtr CopyMutableObjectGraph(const Object& root);
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_OBJECT_GRAPH_COPY_H_
|