// Copyright 2023 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_CCTEST_COMPILER_JS_HEAP_BROKER_H_ #define V8_CCTEST_COMPILER_JS_HEAP_BROKER_H_ namespace v8 { namespace internal { namespace compiler { class CanonicalHandles { public: CanonicalHandles(Isolate* isolate, Zone* zone) : isolate_(isolate), canonical_handles_(std::make_unique( isolate->heap(), ZoneAllocationPolicy(zone))) {} template IndirectHandle Create(Tagged object) { CHECK_NOT_NULL(canonical_handles_); auto find_result = canonical_handles_->FindOrInsert(object); if (!find_result.already_exists) { *find_result.entry = IndirectHandle(object, isolate_).location(); } return IndirectHandle(*find_result.entry); } template IndirectHandle Create(T object) { static_assert(kTaggedCanConvertToRawObjects); return Create(Tagged(object)); } template IndirectHandle Create(IndirectHandle handle) { return Create(*handle); } template IndirectHandle Create(DirectHandle handle) { return Create(*handle); } std::unique_ptr Detach() { DCHECK_NOT_NULL(canonical_handles_); return std::move(canonical_handles_); } private: Isolate* isolate_; std::unique_ptr canonical_handles_; }; class JSHeapBrokerTestBase { public: JSHeapBrokerTestBase(Isolate* isolate, Zone* zone) : broker_(isolate, zone), broker_scope_(&broker_, std::make_unique( isolate->heap(), ZoneAllocationPolicy(zone))), current_broker_(&broker_) { if (!PersistentHandlesScope::IsActive(isolate)) { persistent_scope_.emplace(isolate); } } JSHeapBrokerTestBase(Isolate* isolate, Zone* zone, CanonicalHandles&& handles) : broker_(isolate, zone), broker_scope_(&broker_, handles.Detach()), current_broker_(&broker_) { if (!PersistentHandlesScope::IsActive(isolate)) { persistent_scope_.emplace(isolate); } } ~JSHeapBrokerTestBase() { if (persistent_scope_) { persistent_scope_->Detach(); } } JSHeapBroker* broker() { return &broker_; } template IndirectHandle CanonicalHandle(Tagged object) { return broker()->CanonicalPersistentHandle(object); } template IndirectHandle CanonicalHandle(T object) { static_assert(kTaggedCanConvertToRawObjects); return CanonicalHandle(Tagged(object)); } template IndirectHandle CanonicalHandle(IndirectHandle handle) { return CanonicalHandle(*handle); } template IndirectHandle CanonicalHandle(DirectHandle handle) { return CanonicalHandle(*handle); } private: JSHeapBroker broker_; JSHeapBrokerScopeForTesting broker_scope_; CurrentHeapBrokerScope current_broker_; std::optional persistent_scope_; }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_CCTEST_COMPILER_JS_HEAP_BROKER_H_