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/string-util.h"
6
7 #include "src/inspector/protocol/Protocol.h"
8
9 namespace v8_inspector {
10
toV8String(v8::Isolate * isolate,const String16 & string)11 v8::Local<v8::String> toV8String(v8::Isolate* isolate, const String16& string) {
12 if (string.isEmpty()) return v8::String::Empty(isolate);
13 DCHECK(string.length() < v8::String::kMaxLength);
14 return v8::String::NewFromTwoByte(
15 isolate, reinterpret_cast<const uint16_t*>(string.characters16()),
16 v8::NewStringType::kNormal, static_cast<int>(string.length()))
17 .ToLocalChecked();
18 }
19
toV8StringInternalized(v8::Isolate * isolate,const String16 & string)20 v8::Local<v8::String> toV8StringInternalized(v8::Isolate* isolate,
21 const String16& string) {
22 if (string.isEmpty()) return v8::String::Empty(isolate);
23 DCHECK(string.length() < v8::String::kMaxLength);
24 return v8::String::NewFromTwoByte(
25 isolate, reinterpret_cast<const uint16_t*>(string.characters16()),
26 v8::NewStringType::kInternalized,
27 static_cast<int>(string.length()))
28 .ToLocalChecked();
29 }
30
toV8StringInternalized(v8::Isolate * isolate,const char * str)31 v8::Local<v8::String> toV8StringInternalized(v8::Isolate* isolate,
32 const char* str) {
33 return v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kInternalized)
34 .ToLocalChecked();
35 }
36
toV8String(v8::Isolate * isolate,const StringView & string)37 v8::Local<v8::String> toV8String(v8::Isolate* isolate,
38 const StringView& string) {
39 if (!string.length()) return v8::String::Empty(isolate);
40 DCHECK(string.length() < v8::String::kMaxLength);
41 if (string.is8Bit())
42 return v8::String::NewFromOneByte(
43 isolate, reinterpret_cast<const uint8_t*>(string.characters8()),
44 v8::NewStringType::kNormal, static_cast<int>(string.length()))
45 .ToLocalChecked();
46 return v8::String::NewFromTwoByte(
47 isolate, reinterpret_cast<const uint16_t*>(string.characters16()),
48 v8::NewStringType::kNormal, static_cast<int>(string.length()))
49 .ToLocalChecked();
50 }
51
toProtocolString(v8::Local<v8::String> value)52 String16 toProtocolString(v8::Local<v8::String> value) {
53 if (value.IsEmpty() || value->IsNullOrUndefined()) return String16();
54 std::unique_ptr<UChar[]> buffer(new UChar[value->Length()]);
55 value->Write(reinterpret_cast<uint16_t*>(buffer.get()), 0, value->Length());
56 return String16(buffer.get(), value->Length());
57 }
58
toProtocolStringWithTypeCheck(v8::Local<v8::Value> value)59 String16 toProtocolStringWithTypeCheck(v8::Local<v8::Value> value) {
60 if (value.IsEmpty() || !value->IsString()) return String16();
61 return toProtocolString(value.As<v8::String>());
62 }
63
toString16(const StringView & string)64 String16 toString16(const StringView& string) {
65 if (!string.length()) return String16();
66 if (string.is8Bit())
67 return String16(reinterpret_cast<const char*>(string.characters8()),
68 string.length());
69 return String16(reinterpret_cast<const UChar*>(string.characters16()),
70 string.length());
71 }
72
toStringView(const String16 & string)73 StringView toStringView(const String16& string) {
74 if (string.isEmpty()) return StringView();
75 return StringView(reinterpret_cast<const uint16_t*>(string.characters16()),
76 string.length());
77 }
78
stringViewStartsWith(const StringView & string,const char * prefix)79 bool stringViewStartsWith(const StringView& string, const char* prefix) {
80 if (!string.length()) return !(*prefix);
81 if (string.is8Bit()) {
82 for (size_t i = 0, j = 0; prefix[j] && i < string.length(); ++i, ++j) {
83 if (string.characters8()[i] != prefix[j]) return false;
84 }
85 } else {
86 for (size_t i = 0, j = 0; prefix[j] && i < string.length(); ++i, ++j) {
87 if (string.characters16()[i] != prefix[j]) return false;
88 }
89 }
90 return true;
91 }
92
93 namespace protocol {
94
parseJSON(const StringView & string)95 std::unique_ptr<protocol::Value> StringUtil::parseJSON(
96 const StringView& string) {
97 if (!string.length()) return nullptr;
98 if (string.is8Bit()) {
99 return parseJSONCharacters(string.characters8(),
100 static_cast<int>(string.length()));
101 }
102 return parseJSONCharacters(string.characters16(),
103 static_cast<int>(string.length()));
104 }
105
parseJSON(const String16 & string)106 std::unique_ptr<protocol::Value> StringUtil::parseJSON(const String16& string) {
107 if (!string.length()) return nullptr;
108 return parseJSONCharacters(string.characters16(),
109 static_cast<int>(string.length()));
110 }
111
112 } // namespace protocol
113
114 // static
create(const StringView & string)115 std::unique_ptr<StringBuffer> StringBuffer::create(const StringView& string) {
116 String16 owner = toString16(string);
117 return StringBufferImpl::adopt(owner);
118 }
119
120 // static
adopt(String16 & string)121 std::unique_ptr<StringBufferImpl> StringBufferImpl::adopt(String16& string) {
122 return std::unique_ptr<StringBufferImpl>(new StringBufferImpl(string));
123 }
124
StringBufferImpl(String16 & string)125 StringBufferImpl::StringBufferImpl(String16& string) {
126 m_owner.swap(string);
127 m_string = toStringView(m_owner);
128 }
129
130 } // namespace v8_inspector
131