1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file. 4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/v8-internal-value-type.h" 6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/string-util.h" 8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8_inspector { 10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace { 12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochv8::Local<v8::Private> internalSubtypePrivate(v8::Isolate* isolate) { 14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return v8::Private::ForApi( 15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate, 16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); 17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochv8::Local<v8::String> subtypeForInternalType(v8::Isolate* isolate, 20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8InternalValueType type) { 21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch switch (type) { 22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case V8InternalValueType::kEntry: 23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return toV8StringInternalized(isolate, "internal#entry"); 24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case V8InternalValueType::kLocation: 25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return toV8StringInternalized(isolate, "internal#location"); 26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case V8InternalValueType::kScope: 27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return toV8StringInternalized(isolate, "internal#scope"); 28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case V8InternalValueType::kScopeList: 29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return toV8StringInternalized(isolate, "internal#scopeList"); 30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch UNREACHABLE(); 32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return v8::Local<v8::String>(); 33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace 36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool markAsInternal(v8::Local<v8::Context> context, 38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Object> object, V8InternalValueType type) { 39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Isolate* isolate = context->GetIsolate(); 40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); 41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::String> subtype = subtypeForInternalType(isolate, type); 42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); 43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool markArrayEntriesAsInternal(v8::Local<v8::Context> context, 46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Array> array, 47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8InternalValueType type) { 48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Isolate* isolate = context->GetIsolate(); 49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); 50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::String> subtype = subtypeForInternalType(isolate, type); 51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (uint32_t i = 0; i < array->Length(); ++i) { 52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> entry; 53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) 54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return false; 55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!entry.As<v8::Object>() 56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ->SetPrivate(context, privateValue, subtype) 57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch .FromMaybe(false)) 58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return false; 59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return true; 61f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 63f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochv8::Local<v8::Value> v8InternalValueTypeFrom(v8::Local<v8::Context> context, 64f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Object> object) { 65f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Isolate* isolate = context->GetIsolate(); 66f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Private> privateValue = internalSubtypePrivate(isolate); 67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!object->HasPrivate(context, privateValue).FromMaybe(false)) 68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return v8::Null(isolate); 69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> subtypeValue; 70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || 71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch !subtypeValue->IsString()) 72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return v8::Null(isolate); 73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return subtypeValue; 74f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace v8_inspector 77