| // 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 Isolate; | 
 | 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, | 
 |                               Isolate* isolate, | 
 |                               const Object& from, | 
 |                               const Object& to, | 
 |                               TraversalRules traversal_rules); | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_OBJECT_GRAPH_COPY_H_ |