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:
parent
eb23b176d8
commit
d5d9c349d3
@ -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()),
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
@ -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()),
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user