blob: 69f1db47c7d9bf687552881e003c8e613ccf5611 [file]
// 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 "include/v8-context.h"
#include "include/v8-external.h"
#include "src/base/logging.h"
namespace v8_inspector {
std::unique_ptr<protocol::DictionaryValue>
V8SerializationDuplicateTracker::LinkExistingOrCreate(
v8::Local<v8::Value> v8Value, bool* isKnown) {
std::unique_ptr<protocol::DictionaryValue> 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<v8::Value> 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<v8::Value> v8Value) {
v8::Local<v8::Value> knownValue;
if (!m_v8ObjectToSerializedDictionary->Get(m_context, v8Value)
.ToLocal(&knownValue) ||
knownValue->IsUndefined()) {
return nullptr;
}
return static_cast<protocol::DictionaryValue*>(
knownValue.As<v8::External>()->Value());
}
V8SerializationDuplicateTracker::V8SerializationDuplicateTracker(
v8::Local<v8::Context> context)
: m_context(context),
m_counter(1),
m_v8ObjectToSerializedDictionary(v8::Map::New(context->GetIsolate())) {}
} // namespace v8_inspector