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