Skip to content

Commit e0355b7

Browse files
Aditi-1400targos
authored andcommitted
src: add a variant of ToV8Value() for primitive arrays
Adds a variant of ToV8Value for array of primitives that do not need to throw during conversion - there is essentially no exceptions that can be thrown then an array of integers is created. PR-URL: #57576 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]>
1 parent cb24fc7 commit e0355b7

File tree

2 files changed

+46
-22
lines changed

2 files changed

+46
-22
lines changed

src/node_v8.cc

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -392,23 +392,13 @@ static MaybeLocal<Object> ConvertHeapStatsToJSObject(
392392
FIXED_ONE_BYTE_STRING(isolate, "bucket_size"),
393393
FIXED_ONE_BYTE_STRING(isolate, "free_count"),
394394
FIXED_ONE_BYTE_STRING(isolate, "free_size")};
395-
Local<Value> bucket_size_value;
396-
if (!ToV8Value(context, space_stats.free_list_stats.bucket_size)
397-
.ToLocal(&bucket_size_value)) {
398-
return MaybeLocal<Object>();
399-
}
400-
Local<Value> free_count_value;
401-
if (!ToV8Value(context, space_stats.free_list_stats.free_count)
402-
.ToLocal(&free_count_value)) {
403-
return MaybeLocal<Object>();
404-
}
405-
Local<Value> free_size_value;
406-
if (!ToV8Value(context, space_stats.free_list_stats.free_size)
407-
.ToLocal(&free_size_value)) {
408-
return MaybeLocal<Object>();
409-
}
410395
Local<Value> free_list_statistics_values[] = {
411-
bucket_size_value, free_count_value, free_size_value};
396+
ToV8ValuePrimitiveArray(
397+
context, space_stats.free_list_stats.bucket_size, isolate),
398+
ToV8ValuePrimitiveArray(
399+
context, space_stats.free_list_stats.free_count, isolate),
400+
ToV8ValuePrimitiveArray(
401+
context, space_stats.free_list_stats.free_size, isolate)};
412402

413403
Local<Object> free_list_statistics_obj =
414404
Object::New(isolate,

src/util-inl.h

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -448,12 +448,9 @@ v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
448448
return handle_scope.Escape(ret);
449449
}
450450

451-
template <typename T, typename >
452-
v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
453-
const T& number,
454-
v8::Isolate* isolate) {
455-
if (isolate == nullptr) isolate = context->GetIsolate();
456-
451+
template <typename T>
452+
v8::Local<v8::Value> ConvertNumberToV8Value(v8::Isolate* isolate,
453+
const T& number) {
457454
using Limits = std::numeric_limits<T>;
458455
// Choose Uint32, Int32, or Double depending on range checks.
459456
// These checks should all collapse at compile time.
@@ -474,6 +471,43 @@ v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
474471
return v8::Number::New(isolate, static_cast<double>(number));
475472
}
476473

474+
template <typename T, typename>
475+
v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
476+
const T& number,
477+
v8::Isolate* isolate) {
478+
if (isolate == nullptr) isolate = context->GetIsolate();
479+
return ConvertNumberToV8Value(isolate, number);
480+
}
481+
482+
template <typename T>
483+
v8::Local<v8::Array> ToV8ValuePrimitiveArray(v8::Local<v8::Context> context,
484+
const std::vector<T>& vec,
485+
v8::Isolate* isolate) {
486+
static_assert(
487+
std::is_same_v<T, bool> || std::is_integral_v<T> ||
488+
std::is_floating_point_v<T>,
489+
"Only primitive types (bool, integral, floating-point) are supported.");
490+
491+
if (isolate == nullptr) isolate = context->GetIsolate();
492+
v8::EscapableHandleScope handle_scope(isolate);
493+
494+
v8::LocalVector<v8::Value> elements(isolate);
495+
elements.reserve(vec.size());
496+
497+
for (const auto& value : vec) {
498+
if constexpr (std::is_same_v<T, bool>) {
499+
elements.emplace_back(v8::Boolean::New(isolate, value));
500+
} else {
501+
v8::Local<v8::Value> v = ConvertNumberToV8Value(isolate, value);
502+
elements.emplace_back(v);
503+
}
504+
}
505+
506+
v8::Local<v8::Array> arr =
507+
v8::Array::New(isolate, elements.data(), elements.size());
508+
return handle_scope.Escape(arr);
509+
}
510+
477511
SlicedArguments::SlicedArguments(
478512
const v8::FunctionCallbackInfo<v8::Value>& args, size_t start) {
479513
const size_t length = static_cast<size_t>(args.Length());

0 commit comments

Comments
 (0)