diff --git a/src/node_v8.cc b/src/node_v8.cc index b3ab839b337..bd2f795e8d3 100644 --- a/src/node_v8.cc +++ b/src/node_v8.cc @@ -392,23 +392,13 @@ static MaybeLocal ConvertHeapStatsToJSObject( FIXED_ONE_BYTE_STRING(isolate, "bucket_size"), FIXED_ONE_BYTE_STRING(isolate, "free_count"), FIXED_ONE_BYTE_STRING(isolate, "free_size")}; - Local bucket_size_value; - if (!ToV8Value(context, space_stats.free_list_stats.bucket_size) - .ToLocal(&bucket_size_value)) { - return MaybeLocal(); - } - Local free_count_value; - if (!ToV8Value(context, space_stats.free_list_stats.free_count) - .ToLocal(&free_count_value)) { - return MaybeLocal(); - } - Local free_size_value; - if (!ToV8Value(context, space_stats.free_list_stats.free_size) - .ToLocal(&free_size_value)) { - return MaybeLocal(); - } Local free_list_statistics_values[] = { - bucket_size_value, free_count_value, free_size_value}; + ToV8ValuePrimitiveArray( + context, space_stats.free_list_stats.bucket_size, isolate), + ToV8ValuePrimitiveArray( + context, space_stats.free_list_stats.free_count, isolate), + ToV8ValuePrimitiveArray( + context, space_stats.free_list_stats.free_size, isolate)}; Local free_list_statistics_obj = Object::New(isolate, diff --git a/src/util-inl.h b/src/util-inl.h index 44dbceed5f3..ef00cabcde8 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -448,12 +448,9 @@ v8::MaybeLocal ToV8Value(v8::Local context, return handle_scope.Escape(ret); } -template -v8::MaybeLocal ToV8Value(v8::Local context, - const T& number, - v8::Isolate* isolate) { - if (isolate == nullptr) isolate = context->GetIsolate(); - +template +v8::Local ConvertNumberToV8Value(v8::Isolate* isolate, + const T& number) { using Limits = std::numeric_limits; // Choose Uint32, Int32, or Double depending on range checks. // These checks should all collapse at compile time. @@ -474,6 +471,43 @@ v8::MaybeLocal ToV8Value(v8::Local context, return v8::Number::New(isolate, static_cast(number)); } +template +v8::MaybeLocal ToV8Value(v8::Local context, + const T& number, + v8::Isolate* isolate) { + if (isolate == nullptr) isolate = context->GetIsolate(); + return ConvertNumberToV8Value(isolate, number); +} + +template +v8::Local ToV8ValuePrimitiveArray(v8::Local context, + const std::vector& vec, + v8::Isolate* isolate) { + static_assert( + std::is_same_v || std::is_integral_v || + std::is_floating_point_v, + "Only primitive types (bool, integral, floating-point) are supported."); + + if (isolate == nullptr) isolate = context->GetIsolate(); + v8::EscapableHandleScope handle_scope(isolate); + + v8::LocalVector elements(isolate); + elements.reserve(vec.size()); + + for (const auto& value : vec) { + if constexpr (std::is_same_v) { + elements.emplace_back(v8::Boolean::New(isolate, value)); + } else { + v8::Local v = ConvertNumberToV8Value(isolate, value); + elements.emplace_back(v); + } + } + + v8::Local arr = + v8::Array::New(isolate, elements.data(), elements.size()); + return handle_scope.Escape(arr); +} + SlicedArguments::SlicedArguments( const v8::FunctionCallbackInfo& args, size_t start) { const size_t length = static_cast(args.Length());