mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-08 12:31:51 +00:00
test direct non-copying reading FFIBytearray in C++ context
This commit is contained in:
parent
d3760d5b7c
commit
dc9ae6e99e
4 changed files with 22 additions and 0 deletions
|
|
@ -215,6 +215,13 @@ FFIBytearray = {
|
||||||
}
|
}
|
||||||
table.merge(FFIBytearray, bytearray_methods)
|
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 function FFIBytearray_as_string(bytes)
|
||||||
local t = type(bytes)
|
local t = type(bytes)
|
||||||
if t == "cdata" then
|
if t == "cdata" then
|
||||||
|
|
@ -283,6 +290,7 @@ local FFIU32view = create_FFIview_class("FFIU32view", "uint32_t", 4)
|
||||||
return {
|
return {
|
||||||
FFIBytearray = setmetatable(FFIBytearray, FFIBytearray),
|
FFIBytearray = setmetatable(FFIBytearray, FFIBytearray),
|
||||||
FFIBytearray_as_string = FFIBytearray_as_string,
|
FFIBytearray_as_string = FFIBytearray_as_string,
|
||||||
|
FFIBytearray_as_ptr = FFIBytearray_as_ptr,
|
||||||
FFIU16view = FFIU16view,
|
FFIU16view = FFIU16view,
|
||||||
FFII16view = FFII16view,
|
FFII16view = FFII16view,
|
||||||
FFIU32view = FFIU32view,
|
FFIU32view = FFIU32view,
|
||||||
|
|
|
||||||
|
|
@ -303,6 +303,7 @@ require "core:internal/extensions/string"
|
||||||
local bytearray = require "core:internal/bytearray"
|
local bytearray = require "core:internal/bytearray"
|
||||||
Bytearray = bytearray.FFIBytearray
|
Bytearray = bytearray.FFIBytearray
|
||||||
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
Bytearray_as_string = bytearray.FFIBytearray_as_string
|
||||||
|
Bytearray_as_ptr = bytearray.FFIBytearray_as_ptr
|
||||||
U16view = bytearray.FFIU16view
|
U16view = bytearray.FFIU16view
|
||||||
I16view = bytearray.FFII16view
|
I16view = bytearray.FFII16view
|
||||||
U32view = bytearray.FFIU32view
|
U32view = bytearray.FFIU32view
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#define VC_LUA_DIRECT_BYTEARRAY_ACCESS
|
||||||
|
|
||||||
inline constexpr int ENGINE_VERSION_MAJOR = 0;
|
inline constexpr int ENGINE_VERSION_MAJOR = 0;
|
||||||
inline constexpr int ENGINE_VERSION_MINOR = 32;
|
inline constexpr int ENGINE_VERSION_MINOR = 32;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -833,11 +833,22 @@ namespace lua {
|
||||||
return tolstring(L, idx);
|
return tolstring(L, idx);
|
||||||
}
|
}
|
||||||
pushvalue(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");
|
requireglobal(L, "Bytearray_as_string");
|
||||||
pushvalue(L, -2);
|
pushvalue(L, -2);
|
||||||
call(L, 1, 1);
|
call(L, 1, 1);
|
||||||
auto view = tolstring(L, -1);
|
auto view = tolstring(L, -1);
|
||||||
pop(L, 2);
|
pop(L, 2);
|
||||||
return view;
|
return view;
|
||||||
|
#endif // VC_LUA_DIRECT_BYTEARRAY_ACCESS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue