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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user