| // 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 Thread; | |
| class Object; | |
| class ObjectPtr; | |
| class Zone; | |
| // 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); | |
| typedef enum { | |
| kInternalToIsolateGroup, | |
| kExternalBetweenIsolateGroups, | |
| } TraversalRules; | |
| // Returns a string representation of a retaining path from `from` to `to`, | |
| // blank string if `to` is not reachable from `from`. | |
| // Traversal doesn't follow all the object graph links, only those | |
| // that makes sense isolate message passing. | |
| const char* FindRetainingPath(Zone* zone, | |
| Thread* thread, | |
| const Object& from, | |
| const Object& to, | |
| TraversalRules traversal_rules); | |
| } // namespace dart | |
| #endif // RUNTIME_VM_OBJECT_GRAPH_COPY_H_ |