// Copyright 2016 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-internal-value-type.h" #include "src/inspector/string-util.h" namespace v8_inspector { namespace { v8::Local<v8::Private> internalSubtypePrivate(v8::Isolate* isolate) { return v8::Private::ForApi( isolate, toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); } v8::Local<v8::String> subtypeForInternalType(v8::Isolate* isolate, V8InternalValueType type) { switch (type) { case V8InternalValueType::kEntry: return toV8StringInternalized(isolate, "internal#entry"); case V8InternalValueType::kLocation: return toV8StringInternalized(isolate, "internal#location"); case V8InternalValueType::kScope: return toV8StringInternalized(isolate, "internal#scope"); case V8InternalValueType::kScopeList: return toV8StringInternalized(isolate, "internal#scopeList"); } UNREACHABLE(); } } // namespace bool markAsInternal(v8::Local<v8::Context> context, v8::Local<v8::Object> object, V8InternalValueType type) { v8::Isolate* isolate = context->GetIsolate(); v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); v8::Local<v8::String> subtype = subtypeForInternalType(isolate, type); return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); } bool markArrayEntriesAsInternal(v8::Local<v8::Context> context, v8::Local<v8::Array> array, V8InternalValueType type) { v8::Isolate* isolate = context->GetIsolate(); v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); v8::Local<v8::String> subtype = subtypeForInternalType(isolate, type); for (uint32_t i = 0; i < array->Length(); ++i) { v8::Local<v8::Value> entry; if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) return false; if (!entry.As<v8::Object>() ->SetPrivate(context, privateValue, subtype) .FromMaybe(false)) return false; } return true; } v8::Local<v8::Value> v8InternalValueTypeFrom(v8::Local<v8::Context> context, v8::Local<v8::Object> object) { v8::Isolate* isolate = context->GetIsolate(); v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); if (!object->HasPrivate(context, privateValue).FromMaybe(false)) return v8::Null(isolate); v8::Local<v8::Value> subtypeValue; if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || !subtypeValue->IsString()) return v8::Null(isolate); return subtypeValue; } } // namespace v8_inspector