[DevTools] Roll inspector_protocol (v8).
New Revision: 8b7ea912e516a6daa61487c700687a9426e3a396 Update v8 files / build config accordingly. - There's now a new library in third_party/inspector_protocol, bindings/bindings.h, which is configured much like encoding/encoding.h. It doesn't have much stuff in it yet, but will soon get more code that would otherwise need to go into jinja templates. It also comes with a new test, only a smoke test thus far. Change-Id: I9c00a54a840c214b4bb744a3b272e5ce221954fc Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1678273 Reviewed-by: Alexei Filippov <alph@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Commit-Queue: Johannes Henkel <johannes@chromium.org> Cr-Commit-Position: refs/heads/master@{#62442}
This commit is contained in:
parent
3c4f9bfa43
commit
dfcc46a6c7
@ -67,9 +67,6 @@ config("inspector_config") {
|
||||
configs = [ "../../:internal_config" ]
|
||||
include_dirs = [
|
||||
"../../include",
|
||||
|
||||
# For including encoding/encoding.h.
|
||||
"../../third_party/inspector_protocol",
|
||||
]
|
||||
}
|
||||
|
||||
@ -101,6 +98,7 @@ v8_source_set("inspector") {
|
||||
":inspector_string_conversions",
|
||||
"../..:v8_version",
|
||||
"../../third_party/inspector_protocol:encoding",
|
||||
"../../third_party/inspector_protocol:bindings",
|
||||
]
|
||||
|
||||
public_deps = [
|
||||
|
@ -47,7 +47,10 @@
|
||||
},
|
||||
|
||||
"encoding_lib": {
|
||||
"header": "encoding/encoding.h",
|
||||
"namespace": ["v8_inspector_protocol_encoding"]
|
||||
"namespace": "v8_inspector_protocol_encoding"
|
||||
},
|
||||
|
||||
"bindings_lib": {
|
||||
"namespace": "v8_inspector_protocol_bindings"
|
||||
}
|
||||
}
|
||||
|
@ -301,6 +301,7 @@ v8_source_set("unittests_sources") {
|
||||
"../..:v8_libbase",
|
||||
"../..:v8_libplatform",
|
||||
"../../third_party/inspector_protocol:encoding_test",
|
||||
"../../third_party/inspector_protocol:bindings_test",
|
||||
"//build/win:default_exe_manifest",
|
||||
"//testing/gmock",
|
||||
"//testing/gtest",
|
||||
|
27
third_party/inspector_protocol/BUILD.gn
vendored
27
third_party/inspector_protocol/BUILD.gn
vendored
@ -9,6 +9,13 @@ static_library("encoding") {
|
||||
]
|
||||
}
|
||||
|
||||
static_library("bindings") {
|
||||
sources = [
|
||||
"bindings/bindings.cc",
|
||||
"bindings/bindings.h",
|
||||
]
|
||||
}
|
||||
|
||||
# encoding_test is part of the unittests, defined in
|
||||
# test/unittests/BUILD.gn.
|
||||
|
||||
@ -32,3 +39,23 @@ v8_source_set("encoding_test") {
|
||||
]
|
||||
testonly = true
|
||||
}
|
||||
|
||||
v8_source_set("bindings_test") {
|
||||
sources = [
|
||||
"bindings/bindings_test.cc",
|
||||
"bindings/bindings_test_helper.h",
|
||||
]
|
||||
configs = [
|
||||
"../..:external_config",
|
||||
"../..:internal_config_base",
|
||||
]
|
||||
deps = [
|
||||
":bindings",
|
||||
"../..:v8_libbase",
|
||||
"../../src/inspector:inspector_string_conversions",
|
||||
"//testing/gmock",
|
||||
"//testing/gtest",
|
||||
]
|
||||
testonly = true
|
||||
}
|
||||
|
||||
|
2
third_party/inspector_protocol/README.v8
vendored
2
third_party/inspector_protocol/README.v8
vendored
@ -2,7 +2,7 @@ Name: inspector protocol
|
||||
Short Name: inspector_protocol
|
||||
URL: https://chromium.googlesource.com/deps/inspector_protocol/
|
||||
Version: 0
|
||||
Revision: 83b1154a9661d22bba9a368d368214cc20880419
|
||||
Revision: 8b7ea912e516a6daa61487c700687a9426e3a396
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
Security Critical: no
|
||||
|
5
third_party/inspector_protocol/bindings/bindings.cc
vendored
Normal file
5
third_party/inspector_protocol/bindings/bindings.cc
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
// Copyright 2019 The Chromium 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 "bindings.h"
|
81
third_party/inspector_protocol/bindings/bindings.h
vendored
Normal file
81
third_party/inspector_protocol/bindings/bindings.h
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
// Copyright 2019 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_H_
|
||||
#define V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_H_
|
||||
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
|
||||
namespace v8_inspector_protocol_bindings {
|
||||
namespace glue {
|
||||
// =============================================================================
|
||||
// glue::detail::PtrMaybe, glue::detail::ValueMaybe, templates for optional
|
||||
// pointers / values which are used in ../lib/Forward_h.template.
|
||||
// =============================================================================
|
||||
namespace detail {
|
||||
template <typename T>
|
||||
class PtrMaybe {
|
||||
public:
|
||||
PtrMaybe() = default;
|
||||
PtrMaybe(std::unique_ptr<T> value) : value_(std::move(value)) {}
|
||||
PtrMaybe(PtrMaybe&& other) noexcept : value_(std::move(other.value_)) {}
|
||||
void operator=(std::unique_ptr<T> value) { value_ = std::move(value); }
|
||||
T* fromJust() const {
|
||||
assert(value_);
|
||||
return value_.get();
|
||||
}
|
||||
T* fromMaybe(T* default_value) const {
|
||||
return value_ ? value_.get() : default_value;
|
||||
}
|
||||
bool isJust() const { return value_ != nullptr; }
|
||||
std::unique_ptr<T> takeJust() {
|
||||
assert(value_);
|
||||
return std::move(value_);
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<T> value_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class ValueMaybe {
|
||||
public:
|
||||
ValueMaybe() : is_just_(false), value_() {}
|
||||
ValueMaybe(T value) : is_just_(true), value_(std::move(value)) {}
|
||||
ValueMaybe(ValueMaybe&& other) noexcept
|
||||
: is_just_(other.is_just_), value_(std::move(other.value_)) {}
|
||||
void operator=(T value) {
|
||||
value_ = value;
|
||||
is_just_ = true;
|
||||
}
|
||||
const T& fromJust() const {
|
||||
assert(is_just_);
|
||||
return value_;
|
||||
}
|
||||
const T& fromMaybe(const T& default_value) const {
|
||||
return is_just_ ? value_ : default_value;
|
||||
}
|
||||
bool isJust() const { return is_just_; }
|
||||
// TODO(johannes): |is_just_| isn't reset by this operation -
|
||||
// introduce && to ensure avoiding continued usage of |this|?
|
||||
T takeJust() {
|
||||
assert(is_just_);
|
||||
return std::move(value_);
|
||||
}
|
||||
|
||||
private:
|
||||
bool is_just_;
|
||||
T value_;
|
||||
};
|
||||
} // namespace detail
|
||||
} // namespace glue
|
||||
} // namespace v8_inspector_protocol_bindings
|
||||
|
||||
#define PROTOCOL_DISALLOW_COPY(ClassName) \
|
||||
private: \
|
||||
ClassName(const ClassName&) = delete; \
|
||||
ClassName& operator=(const ClassName&) = delete
|
||||
|
||||
#endif // V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_H_
|
44
third_party/inspector_protocol/bindings/bindings_test.cc
vendored
Normal file
44
third_party/inspector_protocol/bindings/bindings_test.cc
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
// Copyright 2019 The Chromium 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 "bindings.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "bindings_test_helper.h"
|
||||
|
||||
namespace v8_inspector_protocol_bindings {
|
||||
namespace glue {
|
||||
// =============================================================================
|
||||
// glue::detail::PtrMaybe, glue::detail::ValueMaybe, templates for optional
|
||||
// pointers / values which are used in ../lib/Forward_h.template.
|
||||
// =============================================================================
|
||||
TEST(PtrMaybeTest, SmokeTest) {
|
||||
detail::PtrMaybe<std::vector<uint32_t>> example;
|
||||
EXPECT_FALSE(example.isJust());
|
||||
EXPECT_TRUE(nullptr == example.fromMaybe(nullptr));
|
||||
std::unique_ptr<std::vector<uint32_t>> v(new std::vector<uint32_t>);
|
||||
v->push_back(42);
|
||||
v->push_back(21);
|
||||
example = std::move(v);
|
||||
EXPECT_TRUE(example.isJust());
|
||||
EXPECT_THAT(*example.fromJust(), testing::ElementsAre(42, 21));
|
||||
std::unique_ptr<std::vector<uint32_t>> out = example.takeJust();
|
||||
EXPECT_FALSE(example.isJust());
|
||||
EXPECT_THAT(*out, testing::ElementsAre(42, 21));
|
||||
}
|
||||
|
||||
TEST(PtrValueTest, SmokeTest) {
|
||||
detail::ValueMaybe<int32_t> example;
|
||||
EXPECT_FALSE(example.isJust());
|
||||
EXPECT_EQ(-1, example.fromMaybe(-1));
|
||||
example = 42;
|
||||
EXPECT_TRUE(example.isJust());
|
||||
EXPECT_EQ(42, example.fromJust());
|
||||
int32_t out = example.takeJust();
|
||||
EXPECT_EQ(out, 42);
|
||||
}
|
||||
} // namespace glue
|
||||
} // namespace v8_inspector_protocol_bindings
|
18
third_party/inspector_protocol/bindings/bindings_test_helper.h
vendored
Normal file
18
third_party/inspector_protocol/bindings/bindings_test_helper.h
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2019 The V8 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// This file is V8 specific, to make bindings_test.cc work.
|
||||
// It is not rolled from the upstream project.
|
||||
|
||||
#ifndef V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_TEST_HELPER_H_
|
||||
#define V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_TEST_HELPER_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "src/base/logging.h"
|
||||
#include "testing/gmock/include/gmock/gmock.h"
|
||||
#include "testing/gtest/include/gtest/gtest.h"
|
||||
|
||||
#endif // V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_TEST_HELPER_H_
|
21
third_party/inspector_protocol/code_generator.py
vendored
21
third_party/inspector_protocol/code_generator.py
vendored
@ -65,12 +65,14 @@ def read_config():
|
||||
cmdline_parser.add_argument("--jinja_dir", type=unicode, required=True)
|
||||
cmdline_parser.add_argument("--config", type=unicode, required=True)
|
||||
cmdline_parser.add_argument("--config_value", default=[], action="append")
|
||||
cmdline_parser.add_argument("--inspector_protocol_dir", type=unicode, required=True)
|
||||
arg_options = cmdline_parser.parse_args()
|
||||
jinja_dir = arg_options.jinja_dir
|
||||
output_base = arg_options.output_base
|
||||
config_file = arg_options.config
|
||||
config_base = os.path.dirname(config_file)
|
||||
config_values = arg_options.config_value
|
||||
inspector_protocol_dir = arg_options.inspector_protocol_dir.lstrip('/')
|
||||
except Exception:
|
||||
# Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html
|
||||
exc = sys.exc_info()[1]
|
||||
@ -103,15 +105,12 @@ def read_config():
|
||||
".lib.export_header": False,
|
||||
# The encoding lib consists of encoding/encoding.h and
|
||||
# encoding/encoding.cc in its subdirectory, which binaries
|
||||
# may link / depend on, instead of relying on the
|
||||
# JINJA2 templates lib/encoding_{h,cc}.template.
|
||||
# In that case, |header| identifies the include file
|
||||
# and |namespace| is the namespace it's using. Usually
|
||||
# inspector_protocol_encoding but for v8's copy it's
|
||||
# v8_inspector_protocol_encoding.
|
||||
# TODO(johannes): Migrate away from lib/encoding_{h,cc}.template
|
||||
# in favor of this.
|
||||
".encoding_lib": { "header": "", "namespace": []},
|
||||
# must link / depend on.
|
||||
".encoding_lib.header": os.path.join(inspector_protocol_dir, "encoding/encoding.h"),
|
||||
".encoding_lib.namespace": "",
|
||||
# Ditto for bindings, see bindings/bindings.h.
|
||||
".bindings_lib.header": os.path.join(inspector_protocol_dir, "bindings/bindings.h"),
|
||||
".bindings_lib.namespace": ""
|
||||
}
|
||||
for key_value in config_values:
|
||||
parts = key_value.split("=")
|
||||
@ -635,10 +634,8 @@ def main():
|
||||
"Values_h.template",
|
||||
"Object_h.template",
|
||||
"ValueConversions_h.template",
|
||||
"Maybe_h.template",
|
||||
"DispatcherBase_h.template",
|
||||
"Parser_h.template",
|
||||
"encoding_h.template",
|
||||
]
|
||||
|
||||
protocol_cpp_templates = [
|
||||
@ -648,12 +645,10 @@ def main():
|
||||
"Object_cpp.template",
|
||||
"DispatcherBase_cpp.template",
|
||||
"Parser_cpp.template",
|
||||
"encoding_cpp.template",
|
||||
]
|
||||
|
||||
forward_h_templates = [
|
||||
"Forward_h.template",
|
||||
"Allocator_h.template",
|
||||
"FrontendChannel_h.template",
|
||||
]
|
||||
|
||||
|
@ -33,16 +33,12 @@ template("inspector_protocol_generate") {
|
||||
invoker.config_file,
|
||||
"$inspector_protocol_dir/lib/base_string_adapter_cc.template",
|
||||
"$inspector_protocol_dir/lib/base_string_adapter_h.template",
|
||||
"$inspector_protocol_dir/lib/encoding_h.template",
|
||||
"$inspector_protocol_dir/lib/encoding_cpp.template",
|
||||
"$inspector_protocol_dir/lib/Allocator_h.template",
|
||||
"$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
|
||||
"$inspector_protocol_dir/lib/DispatcherBase_h.template",
|
||||
"$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
|
||||
"$inspector_protocol_dir/lib/ErrorSupport_h.template",
|
||||
"$inspector_protocol_dir/lib/Forward_h.template",
|
||||
"$inspector_protocol_dir/lib/FrontendChannel_h.template",
|
||||
"$inspector_protocol_dir/lib/Maybe_h.template",
|
||||
"$inspector_protocol_dir/lib/Object_cpp.template",
|
||||
"$inspector_protocol_dir/lib/Object_h.template",
|
||||
"$inspector_protocol_dir/lib/Parser_cpp.template",
|
||||
@ -67,6 +63,8 @@ template("inspector_protocol_generate") {
|
||||
rebase_path(invoker.out_dir, root_build_dir),
|
||||
"--config",
|
||||
rebase_path(invoker.config_file, root_build_dir),
|
||||
"--inspector_protocol_dir",
|
||||
"$inspector_protocol_dir",
|
||||
]
|
||||
|
||||
if (defined(invoker.config_values)) {
|
||||
|
@ -5,16 +5,12 @@
|
||||
{
|
||||
'variables': {
|
||||
'inspector_protocol_files': [
|
||||
'lib/encoding_h.template',
|
||||
'lib/encoding_cpp.template',
|
||||
'lib/Allocator_h.template',
|
||||
'lib/DispatcherBase_cpp.template',
|
||||
'lib/DispatcherBase_h.template',
|
||||
'lib/ErrorSupport_cpp.template',
|
||||
'lib/ErrorSupport_h.template',
|
||||
'lib/Forward_h.template',
|
||||
'lib/FrontendChannel_h.template',
|
||||
'lib/Maybe_h.template',
|
||||
'lib/Object_cpp.template',
|
||||
'lib/Object_h.template',
|
||||
'lib/Parser_cpp.template',
|
||||
|
@ -1,23 +0,0 @@
|
||||
// This file is generated by Allocator_h.template.
|
||||
|
||||
// Copyright 2016 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef {{"_".join(config.protocol.namespace)}}_Allocator_h
|
||||
#define {{"_".join(config.protocol.namespace)}}_Allocator_h
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
namespace {{namespace}} {
|
||||
{% endfor %}
|
||||
|
||||
#define PROTOCOL_DISALLOW_COPY(ClassName) \
|
||||
private: \
|
||||
ClassName(const ClassName&) = delete; \
|
||||
ClassName& operator=(const ClassName&) = delete
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
} // namespace {{namespace}}
|
||||
{% endfor %}
|
||||
|
||||
#endif // !defined({{"_".join(config.protocol.namespace)}}_Allocator_h)
|
@ -18,6 +18,8 @@
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "{{config.bindings_lib.header}}"
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
namespace {{namespace}} {
|
||||
{% endfor %}
|
||||
@ -54,6 +56,32 @@ struct ArrayTypedef<bool> { typedef std::vector<bool> type; };
|
||||
template <typename T>
|
||||
using Array = typename detail::ArrayTypedef<T>::type;
|
||||
|
||||
namespace detail {
|
||||
using {{config.bindings_lib.namespace}}::glue::detail::PtrMaybe;
|
||||
using {{config.bindings_lib.namespace}}::glue::detail::ValueMaybe;
|
||||
|
||||
template <typename T>
|
||||
struct MaybeTypedef { typedef PtrMaybe<T> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<bool> { typedef ValueMaybe<bool> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<int> { typedef ValueMaybe<int> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<double> { typedef ValueMaybe<double> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<String> { typedef ValueMaybe<String> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<Binary> { typedef ValueMaybe<Binary> type; };
|
||||
} // namespace detail
|
||||
|
||||
template <typename T>
|
||||
using Maybe = typename detail::MaybeTypedef<T>::type;
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
} // namespace {{namespace}}
|
||||
{% endfor %}
|
||||
|
@ -1,77 +0,0 @@
|
||||
// This file is generated by Maybe_h.template.
|
||||
|
||||
// Copyright 2016 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef {{"_".join(config.protocol.namespace)}}_Maybe_h
|
||||
#define {{"_".join(config.protocol.namespace)}}_Maybe_h
|
||||
|
||||
//#include "Forward.h"
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
namespace {{namespace}} {
|
||||
{% endfor %}
|
||||
|
||||
namespace detail {
|
||||
template<typename T>
|
||||
class PtrMaybe {
|
||||
public:
|
||||
PtrMaybe() = default;
|
||||
PtrMaybe(std::unique_ptr<T> value) : m_value(std::move(value)) { }
|
||||
PtrMaybe(PtrMaybe&& other) noexcept : m_value(std::move(other.m_value)) {}
|
||||
void operator=(std::unique_ptr<T> value) { m_value = std::move(value); }
|
||||
T* fromJust() const { DCHECK(m_value); return m_value.get(); }
|
||||
T* fromMaybe(T* defaultValue) const { return m_value ? m_value.get() : defaultValue; }
|
||||
bool isJust() const { return !!m_value; }
|
||||
std::unique_ptr<T> takeJust() { DCHECK(m_value); return std::move(m_value); }
|
||||
private:
|
||||
std::unique_ptr<T> m_value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class ValueMaybe {
|
||||
public:
|
||||
ValueMaybe() : m_isJust(false), m_value() { }
|
||||
ValueMaybe(T value) : m_isJust(true), m_value(std::move(value)) { }
|
||||
ValueMaybe(ValueMaybe&& other) noexcept
|
||||
: m_isJust(other.m_isJust),
|
||||
m_value(std::move(other.m_value)) {}
|
||||
void operator=(T value) { m_value = value; m_isJust = true; }
|
||||
const T& fromJust() const { DCHECK(m_isJust); return m_value; }
|
||||
const T& fromMaybe(const T& defaultValue) const { return m_isJust ? m_value : defaultValue; }
|
||||
bool isJust() const { return m_isJust; }
|
||||
T takeJust() { DCHECK(m_isJust); return std::move(m_value); }
|
||||
private:
|
||||
bool m_isJust;
|
||||
T m_value;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct MaybeTypedef { typedef PtrMaybe<T> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<bool> { typedef ValueMaybe<bool> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<int> { typedef ValueMaybe<int> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<double> { typedef ValueMaybe<double> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<String> { typedef ValueMaybe<String> type; };
|
||||
|
||||
template <>
|
||||
struct MaybeTypedef<Binary> { typedef ValueMaybe<Binary> type; };
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T>
|
||||
using Maybe = typename detail::MaybeTypedef<T>::type;
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
} // namespace {{namespace}}
|
||||
{% endfor %}
|
||||
|
||||
#endif // !defined({{"_".join(config.protocol.namespace)}}_Maybe_h)
|
@ -6,9 +6,7 @@
|
||||
|
||||
//#include "Values.h"
|
||||
|
||||
{% if config.encoding_lib.header %}
|
||||
#include "{{config.encoding_lib.header}}"
|
||||
{% endif %}
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
namespace {{namespace}} {
|
||||
@ -68,29 +66,27 @@ void escapeStringForJSONInternal(const Char* str, unsigned len,
|
||||
// to this constant.
|
||||
static constexpr int kStackLimitValues = 1000;
|
||||
|
||||
{% if config.encoding_lib.namespace %}
|
||||
using {{"::".join(config.encoding_lib.namespace)}}::Error;
|
||||
using {{"::".join(config.encoding_lib.namespace)}}::Status;
|
||||
using {{"::".join(config.encoding_lib.namespace)}}::span;
|
||||
using {{config.encoding_lib.namespace}}::Error;
|
||||
using {{config.encoding_lib.namespace}}::Status;
|
||||
using {{config.encoding_lib.namespace}}::span;
|
||||
namespace cbor {
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::CBORTokenTag;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::CBORTokenizer;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeBinary;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeDouble;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeFalse;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeFromLatin1;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeFromUTF16;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeIndefiniteLengthArrayStart;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeIndefiniteLengthMapStart;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeInt32;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeNull;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeStop;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeString8;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EncodeTrue;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::EnvelopeEncoder;
|
||||
using {{"::".join(config.encoding_lib.namespace + ['cbor'])}}::InitialByteForEnvelope;
|
||||
using {{config.encoding_lib.namespace}}::cbor::CBORTokenTag;
|
||||
using {{config.encoding_lib.namespace}}::cbor::CBORTokenizer;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeBinary;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeDouble;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeFalse;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeFromLatin1;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeFromUTF16;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeIndefiniteLengthArrayStart;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeIndefiniteLengthMapStart;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeInt32;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeNull;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeStop;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeString8;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EncodeTrue;
|
||||
using {{config.encoding_lib.namespace}}::cbor::EnvelopeEncoder;
|
||||
using {{config.encoding_lib.namespace}}::cbor::InitialByteForEnvelope;
|
||||
} // namespace cbor
|
||||
{% endif %}
|
||||
|
||||
// Below are three parsing routines for CBOR, which cover enough
|
||||
// to roundtrip JSON messages.
|
||||
|
2201
third_party/inspector_protocol/lib/encoding_cpp.template
vendored
2201
third_party/inspector_protocol/lib/encoding_cpp.template
vendored
File diff suppressed because it is too large
Load Diff
@ -1,552 +0,0 @@
|
||||
{# This template is generated by gen_cbor_templates.py. #}
|
||||
// Generated by lib/encoding_h.template.
|
||||
|
||||
// Copyright 2019 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
{% if config.encoding_lib.header == "" %}
|
||||
#ifndef {{"_".join(config.protocol.namespace)}}_encoding_h
|
||||
#define {{"_".join(config.protocol.namespace)}}_encoding_h
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
namespace {{namespace}} {
|
||||
{% endfor %}
|
||||
|
||||
// ===== encoding/encoding.h =====
|
||||
|
||||
// This library is designed to be portable. The only allowed dependency
|
||||
// are the C/C++ standard libraries, up to C++11. We support both 32 bit
|
||||
// and 64 architectures.
|
||||
//
|
||||
// Types used below:
|
||||
// uint8_t: a byte, e.g. for raw bytes or UTF8 characters
|
||||
// uint16_t: two bytes, e.g. for UTF16 characters
|
||||
// For input parameters:
|
||||
// span<uint8_t>: pointer to bytes and length
|
||||
// span<uint16_t>: pointer to UTF16 chars and length
|
||||
// For output parameters:
|
||||
// std::vector<uint8_t> - Owned segment of bytes / utf8 characters and length.
|
||||
// std::string - Same, for compatibility, even though char is signed.
|
||||
|
||||
// =============================================================================
|
||||
// span - sequence of bytes
|
||||
// =============================================================================
|
||||
|
||||
// This template is similar to std::span, which will be included in C++20.
|
||||
template <typename T>
|
||||
class span {
|
||||
public:
|
||||
using index_type = size_t;
|
||||
|
||||
span() : data_(nullptr), size_(0) {}
|
||||
span(const T* data, index_type size) : data_(data), size_(size) {}
|
||||
|
||||
const T* data() const { return data_; }
|
||||
|
||||
const T* begin() const { return data_; }
|
||||
const T* end() const { return data_ + size_; }
|
||||
|
||||
const T& operator[](index_type idx) const { return data_[idx]; }
|
||||
|
||||
span<T> subspan(index_type offset, index_type count) const {
|
||||
return span(data_ + offset, count);
|
||||
}
|
||||
|
||||
span<T> subspan(index_type offset) const {
|
||||
return span(data_ + offset, size_ - offset);
|
||||
}
|
||||
|
||||
bool empty() const { return size_ == 0; }
|
||||
|
||||
index_type size() const { return size_; }
|
||||
index_type size_bytes() const { return size_ * sizeof(T); }
|
||||
|
||||
private:
|
||||
const T* data_;
|
||||
index_type size_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
span<T> SpanFrom(const std::vector<T>& v) {
|
||||
return span<T>(v.data(), v.size());
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
span<uint8_t> SpanFrom(const char (&str)[N]) {
|
||||
return span<uint8_t>(reinterpret_cast<const uint8_t*>(str), N - 1);
|
||||
}
|
||||
|
||||
inline span<uint8_t> SpanFrom(const char* str) {
|
||||
return str ? span<uint8_t>(reinterpret_cast<const uint8_t*>(str), strlen(str))
|
||||
: span<uint8_t>();
|
||||
}
|
||||
|
||||
inline span<uint8_t> SpanFrom(const std::string& v) {
|
||||
return span<uint8_t>(reinterpret_cast<const uint8_t*>(v.data()), v.size());
|
||||
}
|
||||
|
||||
// Less than / equality comparison functions for sorting / searching for byte
|
||||
// spans. These are similar to absl::string_view's < and == operators.
|
||||
inline bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept {
|
||||
auto min_size = std::min(x.size(), y.size());
|
||||
const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size);
|
||||
return (r < 0) || (r == 0 && x.size() < y.size());
|
||||
}
|
||||
|
||||
inline bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept {
|
||||
auto len = x.size();
|
||||
if (len != y.size())
|
||||
return false;
|
||||
return x.data() == y.data() || len == 0 ||
|
||||
std::memcmp(x.data(), y.data(), len) == 0;
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Status and Error codes
|
||||
// =============================================================================
|
||||
enum class Error {
|
||||
OK = 0,
|
||||
// JSON parsing errors - json_parser.{h,cc}.
|
||||
JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
|
||||
JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
|
||||
JSON_PARSER_NO_INPUT = 0x03,
|
||||
JSON_PARSER_INVALID_TOKEN = 0x04,
|
||||
JSON_PARSER_INVALID_NUMBER = 0x05,
|
||||
JSON_PARSER_INVALID_STRING = 0x06,
|
||||
JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
|
||||
JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
|
||||
JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
|
||||
JSON_PARSER_COLON_EXPECTED = 0x0a,
|
||||
JSON_PARSER_UNEXPECTED_MAP_END = 0x0b,
|
||||
JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
|
||||
JSON_PARSER_VALUE_EXPECTED = 0x0d,
|
||||
|
||||
CBOR_INVALID_INT32 = 0x0e,
|
||||
CBOR_INVALID_DOUBLE = 0x0f,
|
||||
CBOR_INVALID_ENVELOPE = 0x10,
|
||||
CBOR_INVALID_STRING8 = 0x11,
|
||||
CBOR_INVALID_STRING16 = 0x12,
|
||||
CBOR_INVALID_BINARY = 0x13,
|
||||
CBOR_UNSUPPORTED_VALUE = 0x14,
|
||||
CBOR_NO_INPUT = 0x15,
|
||||
CBOR_INVALID_START_BYTE = 0x16,
|
||||
CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x17,
|
||||
CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x18,
|
||||
CBOR_UNEXPECTED_EOF_IN_MAP = 0x19,
|
||||
CBOR_INVALID_MAP_KEY = 0x1a,
|
||||
CBOR_STACK_LIMIT_EXCEEDED = 0x1b,
|
||||
CBOR_TRAILING_JUNK = 0x1c,
|
||||
CBOR_MAP_START_EXPECTED = 0x1d,
|
||||
CBOR_MAP_STOP_EXPECTED = 0x1e,
|
||||
CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x1f,
|
||||
};
|
||||
|
||||
// A status value with position that can be copied. The default status
|
||||
// is OK. Usually, error status values should come with a valid position.
|
||||
struct Status {
|
||||
static constexpr size_t npos() { return std::numeric_limits<size_t>::max(); }
|
||||
|
||||
bool ok() const { return error == Error::OK; }
|
||||
|
||||
Error error = Error::OK;
|
||||
size_t pos = npos();
|
||||
Status(Error error, size_t pos) : error(error), pos(pos) {}
|
||||
Status() = default;
|
||||
|
||||
// Returns a 7 bit US-ASCII string, either "OK" or an error message
|
||||
// that includes the position.
|
||||
std::string ToASCIIString() const;
|
||||
|
||||
private:
|
||||
std::string ToASCIIString(const char* msg) const;
|
||||
};
|
||||
|
||||
// Handler interface for parser events emitted by a streaming parser.
|
||||
// See cbor::NewCBOREncoder, cbor::ParseCBOR, json::NewJSONEncoder,
|
||||
// json::ParseJSON.
|
||||
class StreamingParserHandler {
|
||||
public:
|
||||
virtual ~StreamingParserHandler() = default;
|
||||
virtual void HandleMapBegin() = 0;
|
||||
virtual void HandleMapEnd() = 0;
|
||||
virtual void HandleArrayBegin() = 0;
|
||||
virtual void HandleArrayEnd() = 0;
|
||||
virtual void HandleString8(span<uint8_t> chars) = 0;
|
||||
virtual void HandleString16(span<uint16_t> chars) = 0;
|
||||
virtual void HandleBinary(span<uint8_t> bytes) = 0;
|
||||
virtual void HandleDouble(double value) = 0;
|
||||
virtual void HandleInt32(int32_t value) = 0;
|
||||
virtual void HandleBool(bool value) = 0;
|
||||
virtual void HandleNull() = 0;
|
||||
|
||||
// The parser may send one error even after other events have already
|
||||
// been received. Client code is reponsible to then discard the
|
||||
// already processed events.
|
||||
// |error| must be an eror, as in, |error.is_ok()| can't be true.
|
||||
virtual void HandleError(Status error) = 0;
|
||||
};
|
||||
|
||||
namespace cbor {
|
||||
// The binary encoding for the inspector protocol follows the CBOR specification
|
||||
// (RFC 7049). Additional constraints:
|
||||
// - Only indefinite length maps and arrays are supported.
|
||||
// - Maps and arrays are wrapped with an envelope, that is, a
|
||||
// CBOR tag with value 24 followed by a byte string specifying
|
||||
// the byte length of the enclosed map / array. The byte string
|
||||
// must use a 32 bit wide length.
|
||||
// - At the top level, a message must be an indefinite length map
|
||||
// wrapped by an envelope.
|
||||
// - Maximal size for messages is 2^32 (4 GB).
|
||||
// - For scalars, we support only the int32_t range, encoded as
|
||||
// UNSIGNED/NEGATIVE (major types 0 / 1).
|
||||
// - UTF16 strings, including with unbalanced surrogate pairs, are encoded
|
||||
// as CBOR BYTE_STRING (major type 2). For such strings, the number of
|
||||
// bytes encoded must be even.
|
||||
// - UTF8 strings (major type 3) are supported.
|
||||
// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, never
|
||||
// as UTF16 strings.
|
||||
// - Arbitrary byte arrays, in the inspector protocol called 'binary',
|
||||
// are encoded as BYTE_STRING (major type 2), prefixed with a byte
|
||||
// indicating base64 when rendered as JSON.
|
||||
|
||||
// =============================================================================
|
||||
// Detecting CBOR content
|
||||
// =============================================================================
|
||||
|
||||
// The first byte for an envelope, which we use for wrapping dictionaries
|
||||
// and arrays; and the byte that indicates a byte string with 32 bit length.
|
||||
// These two bytes start an envelope, and thereby also any CBOR message
|
||||
// produced or consumed by this protocol. See also |EnvelopeEncoder| below.
|
||||
uint8_t InitialByteForEnvelope();
|
||||
uint8_t InitialByteFor32BitLengthByteString();
|
||||
|
||||
// Checks whether |msg| is a cbor message.
|
||||
bool IsCBORMessage(span<uint8_t> msg);
|
||||
|
||||
// =============================================================================
|
||||
// Encoding individual CBOR items
|
||||
// =============================================================================
|
||||
|
||||
// Some constants for CBOR tokens that only take a single byte on the wire.
|
||||
uint8_t EncodeTrue();
|
||||
uint8_t EncodeFalse();
|
||||
uint8_t EncodeNull();
|
||||
uint8_t EncodeIndefiniteLengthArrayStart();
|
||||
uint8_t EncodeIndefiniteLengthMapStart();
|
||||
uint8_t EncodeStop();
|
||||
|
||||
// Encodes |value| as |UNSIGNED| (major type 0) iff >= 0, or |NEGATIVE|
|
||||
// (major type 1) iff < 0.
|
||||
void EncodeInt32(int32_t value, std::vector<uint8_t>* out);
|
||||
void EncodeInt32(int32_t value, std::string* out);
|
||||
|
||||
// Encodes a UTF16 string as a BYTE_STRING (major type 2). Each utf16
|
||||
// character in |in| is emitted with most significant byte first,
|
||||
// appending to |out|.
|
||||
void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out);
|
||||
void EncodeString16(span<uint16_t> in, std::string* out);
|
||||
|
||||
// Encodes a UTF8 string |in| as STRING (major type 3).
|
||||
void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out);
|
||||
void EncodeString8(span<uint8_t> in, std::string* out);
|
||||
|
||||
// Encodes the given |latin1| string as STRING8.
|
||||
// If any non-ASCII character is present, it will be represented
|
||||
// as a 2 byte UTF8 sequence.
|
||||
void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out);
|
||||
void EncodeFromLatin1(span<uint8_t> latin1, std::string* out);
|
||||
|
||||
// Encodes the given |utf16| string as STRING8 if it's entirely US-ASCII.
|
||||
// Otherwise, encodes as STRING16.
|
||||
void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out);
|
||||
void EncodeFromUTF16(span<uint16_t> utf16, std::string* out);
|
||||
|
||||
// Encodes arbitrary binary data in |in| as a BYTE_STRING (major type 2) with
|
||||
// definitive length, prefixed with tag 22 indicating expected conversion to
|
||||
// base64 (see RFC 7049, Table 3 and Section 2.4.4.2).
|
||||
void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out);
|
||||
void EncodeBinary(span<uint8_t> in, std::string* out);
|
||||
|
||||
// Encodes / decodes a double as Major type 7 (SIMPLE_VALUE),
|
||||
// with additional info = 27, followed by 8 bytes in big endian.
|
||||
void EncodeDouble(double value, std::vector<uint8_t>* out);
|
||||
void EncodeDouble(double value, std::string* out);
|
||||
|
||||
// =============================================================================
|
||||
// cbor::EnvelopeEncoder - for wrapping submessages
|
||||
// =============================================================================
|
||||
|
||||
// An envelope indicates the byte length of a wrapped item.
|
||||
// We use this for maps and array, which allows the decoder
|
||||
// to skip such (nested) values whole sale.
|
||||
// It's implemented as a CBOR tag (major type 6) with additional
|
||||
// info = 24, followed by a byte string with a 32 bit length value;
|
||||
// so the maximal structure that we can wrap is 2^32 bits long.
|
||||
// See also: https://tools.ietf.org/html/rfc7049#section-2.4.4.1
|
||||
class EnvelopeEncoder {
|
||||
public:
|
||||
// Emits the envelope start bytes and records the position for the
|
||||
// byte size in |byte_size_pos_|. Also emits empty bytes for the
|
||||
// byte sisze so that encoding can continue.
|
||||
void EncodeStart(std::vector<uint8_t>* out);
|
||||
void EncodeStart(std::string* out);
|
||||
// This records the current size in |out| at position byte_size_pos_.
|
||||
// Returns true iff successful.
|
||||
bool EncodeStop(std::vector<uint8_t>* out);
|
||||
bool EncodeStop(std::string* out);
|
||||
|
||||
private:
|
||||
size_t byte_size_pos_ = 0;
|
||||
};
|
||||
|
||||
// =============================================================================
|
||||
// cbor::NewCBOREncoder - for encoding from a streaming parser
|
||||
// =============================================================================
|
||||
|
||||
// This can be used to convert to CBOR, by passing the return value to a parser
|
||||
// that drives it. The handler will encode into |out|, and iff an error occurs
|
||||
// it will set |status| to an error and clear |out|. Otherwise, |status.ok()|
|
||||
// will be |true|.
|
||||
std::unique_ptr<StreamingParserHandler> NewCBOREncoder(
|
||||
std::vector<uint8_t>* out,
|
||||
Status* status);
|
||||
std::unique_ptr<StreamingParserHandler> NewCBOREncoder(std::string* out,
|
||||
Status* status);
|
||||
|
||||
// =============================================================================
|
||||
// cbor::CBORTokenizer - for parsing individual CBOR items
|
||||
// =============================================================================
|
||||
|
||||
// Tags for the tokens within a CBOR message that CBORTokenizer understands.
|
||||
// Note that this is not the same terminology as the CBOR spec (RFC 7049),
|
||||
// but rather, our adaptation. For instance, we lump unsigned and signed
|
||||
// major type into INT32 here (and disallow values outside the int32_t range).
|
||||
enum class CBORTokenTag {
|
||||
// Encountered an error in the structure of the message. Consult
|
||||
// status() for details.
|
||||
ERROR_VALUE,
|
||||
// Booleans and NULL.
|
||||
TRUE_VALUE,
|
||||
FALSE_VALUE,
|
||||
NULL_VALUE,
|
||||
// An int32_t (signed 32 bit integer).
|
||||
INT32,
|
||||
// A double (64 bit floating point).
|
||||
DOUBLE,
|
||||
// A UTF8 string.
|
||||
STRING8,
|
||||
// A UTF16 string.
|
||||
STRING16,
|
||||
// A binary string.
|
||||
BINARY,
|
||||
// Starts an indefinite length map; after the map start we expect
|
||||
// alternating keys and values, followed by STOP.
|
||||
MAP_START,
|
||||
// Starts an indefinite length array; after the array start we
|
||||
// expect values, followed by STOP.
|
||||
ARRAY_START,
|
||||
// Ends a map or an array.
|
||||
STOP,
|
||||
// An envelope indicator, wrapping a map or array.
|
||||
// Internally this carries the byte length of the wrapped
|
||||
// map or array. While CBORTokenizer::Next() will read / skip the entire
|
||||
// envelope, CBORTokenizer::EnterEnvelope() reads the tokens
|
||||
// inside of it.
|
||||
ENVELOPE,
|
||||
// We've reached the end there is nothing else to read.
|
||||
DONE,
|
||||
};
|
||||
|
||||
// The major types from RFC 7049 Section 2.1.
|
||||
enum class MajorType {
|
||||
UNSIGNED = 0,
|
||||
NEGATIVE = 1,
|
||||
BYTE_STRING = 2,
|
||||
STRING = 3,
|
||||
ARRAY = 4,
|
||||
MAP = 5,
|
||||
TAG = 6,
|
||||
SIMPLE_VALUE = 7
|
||||
};
|
||||
|
||||
// CBORTokenizer segments a CBOR message, presenting the tokens therein as
|
||||
// numbers, strings, etc. This is not a complete CBOR parser, but makes it much
|
||||
// easier to implement one (e.g. ParseCBOR, above). It can also be used to parse
|
||||
// messages partially.
|
||||
class CBORTokenizer {
|
||||
public:
|
||||
explicit CBORTokenizer(span<uint8_t> bytes);
|
||||
~CBORTokenizer();
|
||||
|
||||
// Identifies the current token that we're looking at,
|
||||
// or ERROR_VALUE (in which ase ::Status() has details)
|
||||
// or DONE (if we're past the last token).
|
||||
CBORTokenTag TokenTag() const;
|
||||
|
||||
// Advances to the next token.
|
||||
void Next();
|
||||
// Can only be called if TokenTag() == CBORTokenTag::ENVELOPE.
|
||||
// While Next() would skip past the entire envelope / what it's
|
||||
// wrapping, EnterEnvelope positions the cursor inside of the envelope,
|
||||
// letting the client explore the nested structure.
|
||||
void EnterEnvelope();
|
||||
|
||||
// If TokenTag() is CBORTokenTag::ERROR_VALUE, then Status().error describes
|
||||
// the error more precisely; otherwise it'll be set to Error::OK.
|
||||
// In either case, Status().pos is the current position.
|
||||
struct Status Status() const;
|
||||
|
||||
// The following methods retrieve the token values. They can only
|
||||
// be called if TokenTag() matches.
|
||||
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::INT32.
|
||||
int32_t GetInt32() const;
|
||||
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::DOUBLE.
|
||||
double GetDouble() const;
|
||||
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::STRING8.
|
||||
span<uint8_t> GetString8() const;
|
||||
|
||||
// Wire representation for STRING16 is low byte first (little endian).
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::STRING16.
|
||||
span<uint8_t> GetString16WireRep() const;
|
||||
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::BINARY.
|
||||
span<uint8_t> GetBinary() const;
|
||||
|
||||
// To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE.
|
||||
span<uint8_t> GetEnvelopeContents() const;
|
||||
|
||||
private:
|
||||
void ReadNextToken(bool enter_envelope);
|
||||
void SetToken(CBORTokenTag token, size_t token_byte_length);
|
||||
void SetError(Error error);
|
||||
|
||||
span<uint8_t> bytes_;
|
||||
CBORTokenTag token_tag_;
|
||||
struct Status status_;
|
||||
size_t token_byte_length_;
|
||||
MajorType token_start_type_;
|
||||
uint64_t token_start_internal_value_;
|
||||
};
|
||||
|
||||
// =============================================================================
|
||||
// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages
|
||||
// =============================================================================
|
||||
|
||||
// Parses a CBOR encoded message from |bytes|, sending events to
|
||||
// |out|. If an error occurs, sends |out->HandleError|, and parsing stops.
|
||||
// The client is responsible for discarding the already received information in
|
||||
// that case.
|
||||
void ParseCBOR(span<uint8_t> bytes, StreamingParserHandler* out);
|
||||
|
||||
// =============================================================================
|
||||
// cbor::AppendString8EntryToMap - for limited in-place editing of messages
|
||||
// =============================================================================
|
||||
|
||||
// Modifies the |cbor| message by appending a new key/value entry at the end
|
||||
// of the map. Patches up the envelope size; Status.ok() iff successful.
|
||||
// If not successful, |cbor| may be corrupted after this call.
|
||||
Status AppendString8EntryToCBORMap(span<uint8_t> string8_key,
|
||||
span<uint8_t> string8_value,
|
||||
std::vector<uint8_t>* cbor);
|
||||
Status AppendString8EntryToCBORMap(span<uint8_t> string8_key,
|
||||
span<uint8_t> string8_value,
|
||||
std::string* cbor);
|
||||
|
||||
namespace internals { // Exposed only for writing tests.
|
||||
size_t ReadTokenStart(span<uint8_t> bytes,
|
||||
cbor::MajorType* type,
|
||||
uint64_t* value);
|
||||
|
||||
void WriteTokenStart(cbor::MajorType type,
|
||||
uint64_t value,
|
||||
std::vector<uint8_t>* encoded);
|
||||
void WriteTokenStart(cbor::MajorType type,
|
||||
uint64_t value,
|
||||
std::string* encoded);
|
||||
} // namespace internals
|
||||
} // namespace cbor
|
||||
|
||||
namespace json {
|
||||
// Client code must provide an instance. Implementation should delegate
|
||||
// to whatever is appropriate.
|
||||
class Platform {
|
||||
public:
|
||||
virtual ~Platform() = default;
|
||||
// Parses |str| into |result|. Returns false iff there are
|
||||
// leftover characters or parsing errors.
|
||||
virtual bool StrToD(const char* str, double* result) const = 0;
|
||||
|
||||
// Prints |value| in a format suitable for JSON.
|
||||
virtual std::unique_ptr<char[]> DToStr(double value) const = 0;
|
||||
};
|
||||
|
||||
// =============================================================================
|
||||
// json::NewJSONEncoder - for encoding streaming parser events as JSON
|
||||
// =============================================================================
|
||||
|
||||
// Returns a handler object which will write ascii characters to |out|.
|
||||
// |status->ok()| will be false iff the handler routine HandleError() is called.
|
||||
// In that case, we'll stop emitting output.
|
||||
// Except for calling the HandleError routine at any time, the client
|
||||
// code must call the Handle* methods in an order in which they'd occur
|
||||
// in valid JSON; otherwise we may crash (the code uses assert).
|
||||
std::unique_ptr<StreamingParserHandler> NewJSONEncoder(
|
||||
const Platform* platform,
|
||||
std::vector<uint8_t>* out,
|
||||
Status* status);
|
||||
std::unique_ptr<StreamingParserHandler> NewJSONEncoder(const Platform* platform,
|
||||
std::string* out,
|
||||
Status* status);
|
||||
|
||||
// =============================================================================
|
||||
// json::ParseJSON - for receiving streaming parser events for JSON
|
||||
// =============================================================================
|
||||
|
||||
void ParseJSON(const Platform& platform,
|
||||
span<uint8_t> chars,
|
||||
StreamingParserHandler* handler);
|
||||
void ParseJSON(const Platform& platform,
|
||||
span<uint16_t> chars,
|
||||
StreamingParserHandler* handler);
|
||||
|
||||
// =============================================================================
|
||||
// json::ConvertCBORToJSON, json::ConvertJSONToCBOR - for transcoding
|
||||
// =============================================================================
|
||||
Status ConvertCBORToJSON(const Platform& platform,
|
||||
span<uint8_t> cbor,
|
||||
std::string* json);
|
||||
Status ConvertCBORToJSON(const Platform& platform,
|
||||
span<uint8_t> cbor,
|
||||
std::vector<uint8_t>* json);
|
||||
Status ConvertJSONToCBOR(const Platform& platform,
|
||||
span<uint8_t> json,
|
||||
std::vector<uint8_t>* cbor);
|
||||
Status ConvertJSONToCBOR(const Platform& platform,
|
||||
span<uint16_t> json,
|
||||
std::vector<uint8_t>* cbor);
|
||||
Status ConvertJSONToCBOR(const Platform& platform,
|
||||
span<uint8_t> json,
|
||||
std::string* cbor);
|
||||
Status ConvertJSONToCBOR(const Platform& platform,
|
||||
span<uint16_t> json,
|
||||
std::string* cbor);
|
||||
} // namespace json
|
||||
|
||||
{% for namespace in config.protocol.namespace %}
|
||||
} // namespace {{namespace}}
|
||||
{% endfor %}
|
||||
#endif // !defined({{"_".join(config.protocol.namespace)}}_encoding_h)
|
||||
{% endif %}
|
9
third_party/inspector_protocol/roll.py
vendored
9
third_party/inspector_protocol/roll.py
vendored
@ -21,6 +21,9 @@ FILES_TO_SYNC = [
|
||||
'encoding/encoding.h',
|
||||
'encoding/encoding.cc',
|
||||
'encoding/encoding_test.cc',
|
||||
'bindings/bindings.h',
|
||||
'bindings/bindings.cc',
|
||||
'bindings/bindings_test.cc',
|
||||
'inspector_protocol.gni',
|
||||
'inspector_protocol.gypi',
|
||||
'lib/*',
|
||||
@ -143,6 +146,12 @@ def main(argv):
|
||||
contents = contents.replace(
|
||||
'namespace inspector_protocol_encoding',
|
||||
'namespace v8_inspector_protocol_encoding')
|
||||
contents = contents.replace(
|
||||
'INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_H_',
|
||||
'V8_INSPECTOR_PROTOCOL_BINDINGS_BINDINGS_H_')
|
||||
contents = contents.replace(
|
||||
'namespace inspector_protocol_bindings',
|
||||
'namespace v8_inspector_protocol_bindings')
|
||||
open(os.path.join(dest_dir, f), 'w').write(contents)
|
||||
shutil.copymode(os.path.join(src_dir, f), os.path.join(dest_dir, f))
|
||||
for f in to_delete:
|
||||
|
@ -26,6 +26,7 @@ group("v8_run_gcmole") {
|
||||
"../../third_party/icu/source/",
|
||||
"../../third_party/wasm-api/wasm.h",
|
||||
"../../third_party/wasm-api/wasm.hh",
|
||||
"../../third_party/inspector_protocol/",
|
||||
"$target_gen_dir/../../",
|
||||
"$target_gen_dir/../../torque-generated/",
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user