1
0
forked from mirrors/0ad

Remove Script::CreateArray

It's better to construct a js-array from a `JS::RootedValueVector`.
Because it is more strongly typed and the index doesn't has to be
specified when appending an element.
Some usages are replaced with `JS::RootedValueArray`.

Fixes: #8702
This commit is contained in:
phosit
2026-02-02 18:24:57 +01:00
parent fe9c0f6c2f
commit df18e22277
14 changed files with 146 additions and 136 deletions
+10 -7
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 2025 Wildfire Games.
/* Copyright (C) 2026 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -726,16 +726,19 @@ void CDevice::Report(const ScriptRequest& rq, JS::HandleValue settings)
ReportAvailablePhysicalDevice(m_ChoosenDevice, rq, device);
Script::SetProperty(rq, settings, "choosen_device", device);
JS::RootedValue availableDevices(rq.cx);
Script::CreateArray(rq, &availableDevices, m_AvailablePhysicalDevices.size());
for (size_t index = 0; index < m_AvailablePhysicalDevices.size(); ++index)
JS::RootedValueVector availableDevices{rq.cx};
if (!availableDevices.reserve(m_AvailablePhysicalDevices.size()))
throw std::runtime_error{"Reserve failed"};
for (const SAvailablePhysicalDevice& d : m_AvailablePhysicalDevices)
{
JS::RootedValue device(rq.cx);
Script::CreateObject(rq, &device);
ReportAvailablePhysicalDevice(m_AvailablePhysicalDevices[index], rq, device);
Script::SetPropertyInt(rq, availableDevices, index, device);
ReportAvailablePhysicalDevice(d, rq, device);
if (!availableDevices.append(device))
throw std::runtime_error{"Append failed"};
}
Script::SetProperty(rq, settings, "available_devices", availableDevices);
Script::SetProperty(rq, settings, "available_devices",
JS::RootedValue{rq.cx, JS::ObjectValue(*JS::NewArrayObject(rq.cx, availableDevices))});
Script::SetProperty(rq, settings, "instance_extensions", m_InstanceExtensions);
Script::SetProperty(rq, settings, "validation_layers", m_ValidationLayers);
@@ -1,4 +1,4 @@
/* Copyright (C) 2025 Wildfire Games.
/* Copyright (C) 2026 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -29,6 +29,7 @@
#include <js/RootingAPI.h>
#include <js/Value.h>
#include <limits>
#include <span>
#include <string>
#include <type_traits>
#include <vector>
@@ -353,32 +354,38 @@ void ReportAvailablePhysicalDevice(const SAvailablePhysicalDevice& device,
JS::RootedValue memory(rq.cx);
Script::CreateObject(rq, &memory);
JS::RootedValue memoryTypes(rq.cx);
Script::CreateArray(rq, &memoryTypes, device.memoryProperties.memoryTypeCount);
for (uint32_t memoryTypeIndex = 0; memoryTypeIndex < device.memoryProperties.memoryTypeCount; ++memoryTypeIndex)
JS::RootedValueVector memoryTypes{rq.cx};
if (!memoryTypes.reserve(device.memoryProperties.memoryTypeCount))
throw std::runtime_error{"Reserve failed"};
for (const VkMemoryType& type : std::span{device.memoryProperties.memoryTypes,
device.memoryProperties.memoryTypeCount})
{
const VkMemoryType& type = device.memoryProperties.memoryTypes[memoryTypeIndex];
JS::RootedValue memoryType(rq.cx);
Script::CreateObject(rq, &memoryType);
Script::SetProperty(rq, memoryType, "propertyFlags", static_cast<uint32_t>(type.propertyFlags));
Script::SetProperty(rq, memoryType, "heapIndex", type.heapIndex);
Script::SetPropertyInt(rq, memoryTypes, memoryTypeIndex, memoryType);
if (!memoryTypes.append(memoryType))
throw std::runtime_error{"Append failed"};
}
JS::RootedValue memoryHeaps(rq.cx);
Script::CreateArray(rq, &memoryHeaps, device.memoryProperties.memoryHeapCount);
for (uint32_t memoryHeapIndex = 0; memoryHeapIndex < device.memoryProperties.memoryHeapCount; ++memoryHeapIndex)
JS::RootedValueVector memoryHeaps{rq.cx};
if (!memoryHeaps.reserve(device.memoryProperties.memoryHeapCount))
throw std::runtime_error{"Reserve failed"};
for (const VkMemoryHeap& heap : std::span{device.memoryProperties.memoryHeaps,
device.memoryProperties.memoryHeapCount})
{
const VkMemoryHeap& heap = device.memoryProperties.memoryHeaps[memoryHeapIndex];
JS::RootedValue memoryHeap(rq.cx);
Script::CreateObject(rq, &memoryHeap);
// We can't serialize uint64_t in JS, so put data in KiB.
Script::SetProperty(rq, memoryHeap, "size", static_cast<uint32_t>(heap.size / 1024));
Script::SetProperty(rq, memoryHeap, "flags", static_cast<uint32_t>(heap.flags));
Script::SetPropertyInt(rq, memoryHeaps, memoryHeapIndex, memoryHeap);
if (!memoryHeaps.append(memoryHeap))
throw std::runtime_error{"Append failed"};
}
Script::SetProperty(rq, memory, "types", memoryTypes);
Script::SetProperty(rq, memory, "heaps", memoryHeaps);
Script::SetProperty(rq, memory, "types",
JS::RootedValue{rq.cx, JS::ObjectValue(*JS::NewArrayObject(rq.cx, memoryTypes))});
Script::SetProperty(rq, memory, "heaps",
JS::RootedValue{rq.cx, JS::ObjectValue(*JS::NewArrayObject(rq.cx, memoryHeaps))});
Script::SetProperty(rq, settings, "memory", memory);
JS::RootedValue constants(rq.cx);
@@ -513,28 +520,33 @@ void ReportAvailablePhysicalDevice(const SAvailablePhysicalDevice& device,
Script::SetProperty(rq, settings, "features", features);
JS::RootedValue presentModes(rq.cx);
Script::CreateArray(rq, &presentModes, device.presentModes.size());
for (size_t index = 0; index < device.presentModes.size(); ++index)
JS::RootedValueVector presentModes{rq.cx};
if (!presentModes.reserve(device.presentModes.size()))
throw std::runtime_error{"Reserve failed"};
for (const VkPresentModeKHR& mode : device.presentModes)
{
Script::SetPropertyInt(
rq, presentModes, index, static_cast<uint32_t>(device.presentModes[index]));
if (!presentModes.append(JS::NumberValue(static_cast<uint32_t>(mode))))
throw std::runtime_error{"Append failed"};
}
Script::SetProperty(rq, settings, "present_modes", presentModes);
Script::SetProperty(rq, settings, "present_modes",
JS::RootedValue{rq.cx, JS::ObjectValue(*JS::NewArrayObject(rq.cx, presentModes))});
JS::RootedValue surfaceFormats(rq.cx);
Script::CreateArray(rq, &surfaceFormats, device.surfaceFormats.size());
for (size_t index = 0; index < device.surfaceFormats.size(); ++index)
JS::RootedValueVector surfaceFormats{rq.cx};
if (!surfaceFormats.reserve(device.surfaceFormats.size()))
throw std::runtime_error{"Reserve failed"};
for (const VkSurfaceFormatKHR& format : device.surfaceFormats)
{
JS::RootedValue surfaceFormat(rq.cx);
Script::CreateObject(rq, &surfaceFormat);
Script::SetProperty(
rq, surfaceFormat, "format", static_cast<uint32_t>(device.surfaceFormats[index].format));
rq, surfaceFormat, "format", static_cast<uint32_t>(format.format));
Script::SetProperty(
rq, surfaceFormat, "color_space", static_cast<uint32_t>(device.surfaceFormats[index].colorSpace));
Script::SetPropertyInt(rq, surfaceFormats, index, surfaceFormat);
rq, surfaceFormat, "color_space", static_cast<uint32_t>(format.colorSpace));
if (!surfaceFormats.append(surfaceFormat))
throw std::runtime_error{"Append failed"};
}
Script::SetProperty(rq, settings, "surface_formats", surfaceFormats);
Script::SetProperty(rq, settings, "surface_formats",
JS::RootedValue{rq.cx, JS::ObjectValue(*JS::NewArrayObject(rq.cx, surfaceFormats))});
JS::RootedValue surfaceCapabilities(rq.cx);
Script::CreateObject(rq, &surfaceCapabilities);