src: use std::vector<size_t> instead of IndexArray

PR-URL: https://github.com/nodejs/node/pull/27321
Refs: https://github.com/nodejs/node/issues/17058
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
Joyee Cheung 2019-04-21 20:03:21 +08:00
parent eb23b176d8
commit d5d9c349d3
No known key found for this signature in database
GPG Key ID: 92B78A53C8303B8D
7 changed files with 37 additions and 63 deletions

View File

@ -75,8 +75,7 @@ std::vector<size_t> IsolateData::Serialize(SnapshotCreator* creator) {
return indexes; return indexes;
} }
void IsolateData::DeserializeProperties( void IsolateData::DeserializeProperties(const std::vector<size_t>* indexes) {
const NodeMainInstance::IndexArray* indexes) {
size_t i = 0; size_t i = 0;
HandleScope handle_scope(isolate_); HandleScope handle_scope(isolate_);
@ -86,7 +85,7 @@ void IsolateData::DeserializeProperties(
#define V(TypeName, PropertyName) \ #define V(TypeName, PropertyName) \
do { \ do { \
MaybeLocal<TypeName> field = \ MaybeLocal<TypeName> field = \
isolate_->GetDataFromSnapshotOnce<TypeName>(indexes->Get(i++)); \ isolate_->GetDataFromSnapshotOnce<TypeName>((*indexes)[i++]); \
if (field.IsEmpty()) { \ if (field.IsEmpty()) { \
fprintf(stderr, "Failed to deserialize " #PropertyName "\n"); \ fprintf(stderr, "Failed to deserialize " #PropertyName "\n"); \
} \ } \
@ -155,7 +154,7 @@ IsolateData::IsolateData(Isolate* isolate,
uv_loop_t* event_loop, uv_loop_t* event_loop,
MultiIsolatePlatform* platform, MultiIsolatePlatform* platform,
ArrayBufferAllocator* node_allocator, ArrayBufferAllocator* node_allocator,
const NodeMainInstance::IndexArray* indexes) const std::vector<size_t>* indexes)
: isolate_(isolate), : isolate_(isolate),
event_loop_(event_loop), event_loop_(event_loop),
allocator_(isolate->GetArrayBufferAllocator()), allocator_(isolate->GetArrayBufferAllocator()),

View File

@ -420,7 +420,7 @@ class IsolateData : public MemoryRetainer {
uv_loop_t* event_loop, uv_loop_t* event_loop,
MultiIsolatePlatform* platform = nullptr, MultiIsolatePlatform* platform = nullptr,
ArrayBufferAllocator* node_allocator = nullptr, ArrayBufferAllocator* node_allocator = nullptr,
const NodeMainInstance::IndexArray* indexes = nullptr); const std::vector<size_t>* indexes = nullptr);
SET_MEMORY_INFO_NAME(IsolateData); SET_MEMORY_INFO_NAME(IsolateData);
SET_SELF_SIZE(IsolateData); SET_SELF_SIZE(IsolateData);
void MemoryInfo(MemoryTracker* tracker) const override; void MemoryInfo(MemoryTracker* tracker) const override;
@ -454,7 +454,7 @@ class IsolateData : public MemoryRetainer {
IsolateData& operator=(const IsolateData&) = delete; IsolateData& operator=(const IsolateData&) = delete;
private: private:
void DeserializeProperties(const NodeMainInstance::IndexArray* indexes); void DeserializeProperties(const std::vector<size_t>* indexes);
void CreateProperties(); void CreateProperties();
#define VP(PropertyName, StringValue) V(v8::Private, PropertyName) #define VP(PropertyName, StringValue) V(v8::Private, PropertyName)

View File

@ -892,7 +892,7 @@ int Start(int argc, char** argv) {
std::vector<intptr_t> external_references = { std::vector<intptr_t> external_references = {
reinterpret_cast<intptr_t>(nullptr)}; reinterpret_cast<intptr_t>(nullptr)};
v8::StartupData* blob = NodeMainInstance::GetEmbeddedSnapshotBlob(); v8::StartupData* blob = NodeMainInstance::GetEmbeddedSnapshotBlob();
const NodeMainInstance::IndexArray* indexes = const std::vector<size_t>* indexes =
NodeMainInstance::GetIsolateDataIndexes(); NodeMainInstance::GetIsolateDataIndexes();
if (blob != nullptr) { if (blob != nullptr) {
params.external_references = external_references.data(); params.external_references = external_references.data();

View File

@ -38,12 +38,13 @@ NodeMainInstance* NodeMainInstance::Create(
return new NodeMainInstance(isolate, event_loop, platform, args, exec_args); return new NodeMainInstance(isolate, event_loop, platform, args, exec_args);
} }
NodeMainInstance::NodeMainInstance(Isolate::CreateParams* params, NodeMainInstance::NodeMainInstance(
uv_loop_t* event_loop, Isolate::CreateParams* params,
MultiIsolatePlatform* platform, uv_loop_t* event_loop,
const std::vector<std::string>& args, MultiIsolatePlatform* platform,
const std::vector<std::string>& exec_args, const std::vector<std::string>& args,
const IndexArray* per_isolate_data_indexes) const std::vector<std::string>& exec_args,
const std::vector<size_t>* per_isolate_data_indexes)
: args_(args), : args_(args),
exec_args_(exec_args), exec_args_(exec_args),
array_buffer_allocator_(ArrayBufferAllocator::Create()), array_buffer_allocator_(ArrayBufferAllocator::Create()),

View File

@ -15,18 +15,6 @@ namespace node {
// We may be able to create an abstract class to reuse some of the routines. // We may be able to create an abstract class to reuse some of the routines.
class NodeMainInstance { class NodeMainInstance {
public: public:
// An array of indexes that can be used to deserialize data from a V8
// snapshot.
struct IndexArray {
const size_t* data;
size_t length;
size_t Get(size_t index) const {
DCHECK_LT(index, length);
return data[index];
}
};
// To create a main instance that does not own the isoalte, // To create a main instance that does not own the isoalte,
// The caller needs to do: // The caller needs to do:
// //
@ -53,12 +41,13 @@ class NodeMainInstance {
void Dispose(); void Dispose();
// Create a main instance that owns the isolate // Create a main instance that owns the isolate
NodeMainInstance(v8::Isolate::CreateParams* params, NodeMainInstance(
uv_loop_t* event_loop, v8::Isolate::CreateParams* params,
MultiIsolatePlatform* platform, uv_loop_t* event_loop,
const std::vector<std::string>& args, MultiIsolatePlatform* platform,
const std::vector<std::string>& exec_args, const std::vector<std::string>& args,
const IndexArray* per_isolate_data_indexes = nullptr); const std::vector<std::string>& exec_args,
const std::vector<size_t>* per_isolate_data_indexes = nullptr);
~NodeMainInstance(); ~NodeMainInstance();
// Start running the Node.js instances, return the exit code when finished. // Start running the Node.js instances, return the exit code when finished.
@ -72,7 +61,7 @@ class NodeMainInstance {
// If nullptr is returned, the binary is not built with embedded // If nullptr is returned, the binary is not built with embedded
// snapshot. // snapshot.
static const IndexArray* GetIsolateDataIndexes(); static const std::vector<size_t>* GetIsolateDataIndexes();
static v8::StartupData* GetEmbeddedSnapshotBlob(); static v8::StartupData* GetEmbeddedSnapshotBlob();
static const size_t kNodeContextIndex = 0; static const size_t kNodeContextIndex = 0;

View File

@ -6,7 +6,7 @@ v8::StartupData* NodeMainInstance::GetEmbeddedSnapshotBlob() {
return nullptr; return nullptr;
} }
const NodeMainInstance::IndexArray* NodeMainInstance::GetIsolateDataIndexes() { const std::vector<size_t>* NodeMainInstance::GetIsolateDataIndexes() {
return nullptr; return nullptr;
} }

View File

@ -16,10 +16,16 @@ using v8::Locker;
using v8::SnapshotCreator; using v8::SnapshotCreator;
using v8::StartupData; using v8::StartupData;
template <typename T>
void WriteVector(std::stringstream* ss, const T* vec, size_t size) {
for (size_t i = 0; i < size; i++) {
*ss << std::to_string(vec[i]) << (i == size - 1 ? '\n' : ',');
}
}
std::string FormatBlob(v8::StartupData* blob, std::string FormatBlob(v8::StartupData* blob,
const std::vector<size_t>& isolate_data_indexes) { const std::vector<size_t>& isolate_data_indexes) {
std::stringstream ss; std::stringstream ss;
size_t isolate_data_indexes_size = isolate_data_indexes.size();
ss << R"(#include <cstddef> ss << R"(#include <cstddef>
#include "node_main_instance.h" #include "node_main_instance.h"
@ -29,47 +35,26 @@ std::string FormatBlob(v8::StartupData* blob,
namespace node { namespace node {
static const uint8_t blob_data[] = { static const char blob_data[] = {
)"; )";
WriteVector(&ss, blob->data, blob->raw_size);
for (int i = 0; i < blob->raw_size; i++) {
uint8_t ch = blob->data[i];
ss << std::to_string(ch) << ((i == blob->raw_size - 1) ? '\n' : ',');
}
ss << R"(}; ss << R"(};
static const int blob_size = )" static const int blob_size = )"
<< blob->raw_size << R"(; << blob->raw_size << R"(;
static v8::StartupData blob = { static v8::StartupData blob = { blob_data, blob_size };
reinterpret_cast<const char*>(blob_data),
blob_size
};
)"; )";
ss << R"(v8::StartupData* ss << R"(v8::StartupData* NodeMainInstance::GetEmbeddedSnapshotBlob() {
NodeMainInstance::GetEmbeddedSnapshotBlob() {
return &blob; return &blob;
} }
static const size_t isolate_data_indexes_raw[] = { static const std::vector<size_t> isolate_data_indexes {
)"; )";
for (size_t i = 0; i < isolate_data_indexes_size; i++) { WriteVector(&ss, isolate_data_indexes.data(), isolate_data_indexes.size());
ss << std::to_string(isolate_data_indexes[i]) ss << R"(};
<< ((i == isolate_data_indexes_size - 1) ? '\n' : ',');
}
ss << "};\n\n";
ss << "static const size_t isolate_data_indexes_size = " const std::vector<size_t>* NodeMainInstance::GetIsolateDataIndexes() {
<< isolate_data_indexes_size << R"(;
NodeMainInstance::IndexArray isolate_data_indexes {
isolate_data_indexes_raw,
isolate_data_indexes_size
};
const NodeMainInstance::IndexArray*
NodeMainInstance::GetIsolateDataIndexes() {
return &isolate_data_indexes; return &isolate_data_indexes;
} }
} // namespace node } // namespace node