Skip to content

Commit aa00f59

Browse files
Aditi-1400aduh95
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 29a1150 commit aa00f59

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
@@ -385,23 +385,13 @@ static MaybeLocal<Object> ConvertHeapStatsToJSObject(
385385
FIXED_ONE_BYTE_STRING(isolate, "bucket_size"),
386386
FIXED_ONE_BYTE_STRING(isolate, "free_count"),
387387
FIXED_ONE_BYTE_STRING(isolate, "free_size")};
388-
Local<Value> bucket_size_value;
389-
if (!ToV8Value(context, space_stats.free_list_stats.bucket_size)
390-
.ToLocal(&bucket_size_value)) {
391-
return MaybeLocal<Object>();
392-
}
393-
Local<Value> free_count_value;
394-
if (!ToV8Value(context, space_stats.free_list_stats.free_count)
395-
.ToLocal(&free_count_value)) {
396-
return MaybeLocal<Object>();
397-
}
398-
Local<Value> free_size_value;
399-
if (!ToV8Value(context, space_stats.free_list_stats.free_size)
400-
.ToLocal(&free_size_value)) {
401-
return MaybeLocal<Object>();
402-
}
403388
Local<Value> free_list_statistics_values[] = {
404-
bucket_size_value, free_count_value, free_size_value};
389+
ToV8ValuePrimitiveArray(
390+
context, space_stats.free_list_stats.bucket_size, isolate),
391+
ToV8ValuePrimitiveArray(
392+
context, space_stats.free_list_stats.free_count, isolate),
393+
ToV8ValuePrimitiveArray(
394+
context, space_stats.free_list_stats.free_size, isolate)};
405395

406396
Local<Object> free_list_statistics_obj =
407397
Object::New(isolate,

src/util-inl.h

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

431-
template <typename T, typename >
432-
v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
433-
const T& number,
434-
v8::Isolate* isolate) {
435-
if (isolate == nullptr) isolate = context->GetIsolate();
436-
431+
template <typename T>
432+
v8::Local<v8::Value> ConvertNumberToV8Value(v8::Isolate* isolate,
433+
const T& number) {
437434
using Limits = std::numeric_limits<T>;
438435
// Choose Uint32, Int32, or Double depending on range checks.
439436
// These checks should all collapse at compile time.
@@ -454,6 +451,43 @@ v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
454451
return v8::Number::New(isolate, static_cast<double>(number));
455452
}
456453

454+
template <typename T, typename>
455+
v8::MaybeLocal<v8::Value> ToV8Value(v8::Local<v8::Context> context,
456+
const T& number,
457+
v8::Isolate* isolate) {
458+
if (isolate == nullptr) isolate = context->GetIsolate();
459+
return ConvertNumberToV8Value(isolate, number);
460+
}
461+
462+
template <typename T>
463+
v8::Local<v8::Array> ToV8ValuePrimitiveArray(v8::Local<v8::Context> context,
464+
const std::vector<T>& vec,
465+
v8::Isolate* isolate) {
466+
static_assert(
467+
std::is_same_v<T, bool> || std::is_integral_v<T> ||
468+
std::is_floating_point_v<T>,
469+
"Only primitive types (bool, integral, floating-point) are supported.");
470+
471+
if (isolate == nullptr) isolate = context->GetIsolate();
472+
v8::EscapableHandleScope handle_scope(isolate);
473+
474+
v8::LocalVector<v8::Value> elements(isolate);
475+
elements.reserve(vec.size());
476+
477+
for (const auto& value : vec) {
478+
if constexpr (std::is_same_v<T, bool>) {
479+
elements.emplace_back(v8::Boolean::New(isolate, value));
480+
} else {
481+
v8::Local<v8::Value> v = ConvertNumberToV8Value(isolate, value);
482+
elements.emplace_back(v);
483+
}
484+
}
485+
486+
v8::Local<v8::Array> arr =
487+
v8::Array::New(isolate, elements.data(), elements.size());
488+
return handle_scope.Escape(arr);
489+
}
490+
457491
SlicedArguments::SlicedArguments(
458492
const v8::FunctionCallbackInfo<v8::Value>& args, size_t start) {
459493
const size_t length = static_cast<size_t>(args.Length());

0 commit comments

Comments
 (0)