// 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. #include "src/inspector/v8-serialization-duplicate-tracker.h" #include "src/base/logging.h" #include "v8-external.h" namespace v8_inspector { std::unique_ptr V8SerializationDuplicateTracker::LinkExistingOrCreate( v8::Local v8Value, bool* isKnown) { std::unique_ptr result = protocol::DictionaryValue::create(); protocol::DictionaryValue* maybeKnownSerializedValue = FindKnownSerializedValue(v8Value); if (maybeKnownSerializedValue == nullptr) { *isKnown = false; // Keep reference to the serialized value, so that // `weakLocalObjectReference` can be set later. SetKnownSerializedValue(v8Value, result.get()); } else { *isKnown = true; String16 type; maybeKnownSerializedValue->getString("type", &type); result->setString("type", type); int weakLocalObjectReference; // If `maybeKnownSerializedValue` has no `weakLocalObjectReference` yet, // it's need to be set. if (!maybeKnownSerializedValue->getInteger("weakLocalObjectReference", &weakLocalObjectReference)) { weakLocalObjectReference = m_counter++; maybeKnownSerializedValue->setInteger("weakLocalObjectReference", weakLocalObjectReference); } result->setInteger("weakLocalObjectReference", weakLocalObjectReference); } return result; } void V8SerializationDuplicateTracker::SetKnownSerializedValue( v8::Local v8Value, protocol::DictionaryValue* serializedValue) { m_v8ObjectToSerializedDictionary = m_v8ObjectToSerializedDictionary ->Set(m_context, v8Value, v8::External::New(m_context->GetIsolate(), serializedValue)) .ToLocalChecked(); } protocol::DictionaryValue* V8SerializationDuplicateTracker::FindKnownSerializedValue( v8::Local v8Value) { v8::Local knownValue; if (!m_v8ObjectToSerializedDictionary->Get(m_context, v8Value) .ToLocal(&knownValue) || knownValue->IsUndefined()) { return nullptr; } return static_cast( knownValue.As()->Value()); } V8SerializationDuplicateTracker::V8SerializationDuplicateTracker( v8::Local context) : m_context(context), m_counter(1), m_v8ObjectToSerializedDictionary(v8::Map::New(context->GetIsolate())) {} } // namespace v8_inspector