// 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 // // [ // , // , // , // ] // // 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_