| // 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 |