test direct non-copying reading FFIBytearray in C++ context

This commit is contained in:
MihailRis 2026-05-21 22:31:27 +03:00
parent d3760d5b7c
commit dc9ae6e99e
4 changed files with 22 additions and 0 deletions

View file

@ -215,6 +215,13 @@ FFIBytearray = {
}
table.merge(FFIBytearray, bytearray_methods)
local function FFIBytearray_as_ptr(bytes)
if type(bytes) == "cdata" then
return tostring(bytes.bytes):sub(27), bytes.size
end
return "0"
end
local function FFIBytearray_as_string(bytes)
local t = type(bytes)
if t == "cdata" then
@ -283,6 +290,7 @@ local FFIU32view = create_FFIview_class("FFIU32view", "uint32_t", 4)
return {
FFIBytearray = setmetatable(FFIBytearray, FFIBytearray),
FFIBytearray_as_string = FFIBytearray_as_string,
FFIBytearray_as_ptr = FFIBytearray_as_ptr,
FFIU16view = FFIU16view,
FFII16view = FFII16view,
FFIU32view = FFIU32view,

View file

@ -303,6 +303,7 @@ require "core:internal/extensions/string"
local bytearray = require "core:internal/bytearray"
Bytearray = bytearray.FFIBytearray
Bytearray_as_string = bytearray.FFIBytearray_as_string
Bytearray_as_ptr = bytearray.FFIBytearray_as_ptr
U16view = bytearray.FFIU16view
I16view = bytearray.FFII16view
U32view = bytearray.FFIU32view

View file

@ -5,6 +5,8 @@
#include <limits>
#include <string>
#define VC_LUA_DIRECT_BYTEARRAY_ACCESS
inline constexpr int ENGINE_VERSION_MAJOR = 0;
inline constexpr int ENGINE_VERSION_MINOR = 32;

View file

@ -833,11 +833,22 @@ namespace lua {
return tolstring(L, idx);
}
pushvalue(L, idx);
#ifdef VC_LUA_DIRECT_BYTEARRAY_ACCESS
requireglobal(L, "Bytearray_as_ptr");
pushvalue(L, -2);
call(L, 1, 2);
auto view = tolstring(L, -2);
uint64_t size = touinteger(L, -1);
auto ptr = (const char*)std::stoull(std::string(view), nullptr, 16);
pop(L, 3);
return std::string_view(ptr, size);
#else
requireglobal(L, "Bytearray_as_string");
pushvalue(L, -2);
call(L, 1, 1);
auto view = tolstring(L, -1);
pop(L, 2);
return view;
#endif // VC_LUA_DIRECT_BYTEARRAY_ACCESS
}
}