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