From 24a2c35f4116b7735c73452e1e38d3c6b10dbcfa Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 24 May 2026 13:24:58 +0300 Subject: [PATCH] add direct-scripting-data-access setting --- src/constants.hpp | 2 -- src/io/settings_io.cpp | 1 + src/logic/scripting/lua/lua_util.cpp | 27 +++++++++++++++++++++++++++ src/logic/scripting/lua/lua_util.hpp | 24 +----------------------- src/settings.hpp | 2 ++ 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/constants.hpp b/src/constants.hpp index f0dc24d40..f43314f4a 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -5,8 +5,6 @@ #include #include -#define VC_LUA_DIRECT_BYTEARRAY_ACCESS - inline constexpr int ENGINE_VERSION_MAJOR = 0; inline constexpr int ENGINE_VERSION_MINOR = 32; diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index c66b5c451..5f93e5be7 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -101,6 +101,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.addSection("system"); builder.add("max-bg-asset-loaders", &settings.system.maxBgAssetLoaders); builder.add("preserve-assets-during-frame", &settings.system.preserveAssetsDuringFrame); + builder.add("direct-scripting-data-access", &settings.system.directScriptingDataAccess); } dv::value SettingsHandler::getValue(const std::string& name) const { diff --git a/src/logic/scripting/lua/lua_util.cpp b/src/logic/scripting/lua/lua_util.cpp index ded9cc79b..ddd05cd19 100644 --- a/src/logic/scripting/lua/lua_util.cpp +++ b/src/logic/scripting/lua/lua_util.cpp @@ -5,6 +5,7 @@ #include #include "util/stringutil.hpp" +#include "engine/Engine.hpp" using namespace lua; @@ -369,3 +370,29 @@ void lua::remove_environment(State* L, int id) { pushnil(L); store_env(L, id); } + +std::string_view lua::bytearray_as_string(lua::State* L, int idx) { + const auto& settings = scripting::engine->getSettings(); + if (type(L, idx) == LUA_TSTRING) { + return tolstring(L, idx); + } + pushvalue(L, idx); + + if (settings.system.directScriptingDataAccess.get()) { + 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; + } +} diff --git a/src/logic/scripting/lua/lua_util.hpp b/src/logic/scripting/lua/lua_util.hpp index 88fa0f021..562e641ef 100644 --- a/src/logic/scripting/lua/lua_util.hpp +++ b/src/logic/scripting/lua/lua_util.hpp @@ -828,27 +828,5 @@ namespace lua { return create_bytearray(L, bytes.data(), bytes.size()); } - inline std::string_view bytearray_as_string(lua::State* L, int idx) { - if (type(L, idx) == LUA_TSTRING) { - 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 - } + std::string_view bytearray_as_string(lua::State* L, int idx); } diff --git a/src/settings.hpp b/src/settings.hpp index 782330f14..6c3df896a 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -126,6 +126,8 @@ struct SystemSettings { IntegerSetting maxBgAssetLoaders {3, -4, 16}; /// @brief Preserve assets during current frame from being destroyed FlagSetting preserveAssetsDuringFrame {true}; + /// @brief Allow luajit cdata objects direct data access optimizations + FlagSetting directScriptingDataAccess {true}; }; struct EngineSettings {