// 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 internalSubtypePrivate(v8::Isolate* isolate) { return v8::Private::ForApi( isolate, toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); } v8::Local 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(); return v8::Local(); } } // namespace bool markAsInternal(v8::Local context, v8::Local object, V8InternalValueType type) { v8::Isolate* isolate = context->GetIsolate(); v8::Local privateValue = internalSubtypePrivate(isolate); v8::Local subtype = subtypeForInternalType(isolate, type); return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); } bool markArrayEntriesAsInternal(v8::Local context, v8::Local array, V8InternalValueType type) { v8::Isolate* isolate = context->GetIsolate(); v8::Local privateValue = internalSubtypePrivate(isolate); v8::Local subtype = subtypeForInternalType(isolate, type); for (uint32_t i = 0; i < array->Length(); ++i) { v8::Local entry; if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) return false; if (!entry.As() ->SetPrivate(context, privateValue, subtype) .FromMaybe(false)) return false; } return true; } v8::Local v8InternalValueTypeFrom(v8::Local context, v8::Local object) { v8::Isolate* isolate = context->GetIsolate(); v8::Local privateValue = internalSubtypePrivate(isolate); if (!object->HasPrivate(context, privateValue).FromMaybe(false)) return v8::Null(isolate); v8::Local subtypeValue; if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || !subtypeValue->IsString()) return v8::Null(isolate); return subtypeValue; } } // namespace v8_inspector