diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-24 23:37:55 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-24 23:37:55 +1000 |
commit | 8547c56ba4607e1c4efac483f97f01b8ba8c3a01 (patch) | |
tree | d156522eae042e07a1c430220e7d5ab1bfa2727f /source/core/StarLua.cpp | |
parent | 4c636e911ce86bcd6d501fc2f6f3ce2c3dd9c71c (diff) |
Proper LuaString <-> String handling
Null-terminator usage is opt-in
Diffstat (limited to 'source/core/StarLua.cpp')
-rw-r--r-- | source/core/StarLua.cpp | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/source/core/StarLua.cpp b/source/core/StarLua.cpp index 287bf5c..901e875 100644 --- a/source/core/StarLua.cpp +++ b/source/core/StarLua.cpp @@ -115,6 +115,11 @@ LuaTable LuaContext::createTable() { return engine().createTable(); } +LuaNullEnforcer::LuaNullEnforcer(LuaEngine& engine) + : m_engine(&engine) { ++m_engine->m_nullTerminated; }; + +LuaNullEnforcer::~LuaNullEnforcer() { --m_engine->m_nullTerminated; }; + LuaValue LuaConverter<Json>::from(LuaEngine& engine, Json const& v) { if (v.isType(Json::Type::Null)) { return LuaNil; @@ -202,6 +207,7 @@ LuaEnginePtr LuaEngine::create(bool safe) { self->m_instructionCount = 0; self->m_recursionLevel = 0; self->m_recursionLimit = 0; + self->m_nullTerminated = 0; if (!self->m_state) throw LuaException("Failed to initialize Lua"); @@ -455,7 +461,10 @@ ByteArray LuaEngine::compile(ByteArray const& contents, String const& name) { LuaString LuaEngine::createString(String const& str) { lua_checkstack(m_state, 1); - lua_pushlstring(m_state, str.utf8Ptr(), str.utf8Size()); + if (m_nullTerminated) + lua_pushstring(m_state, str.utf8Ptr()); + else + lua_pushlstring(m_state, str.utf8Ptr(), str.utf8Size()); return LuaString(LuaDetail::LuaHandle(RefPtr<LuaEngine>(this), popHandle(m_state))); } @@ -543,6 +552,10 @@ size_t LuaEngine::memoryUsage() const { return (size_t)lua_gc(m_state, LUA_GCCOUNT, 0) * 1024 + lua_gc(m_state, LUA_GCCOUNTB, 0); } +LuaNullEnforcer LuaEngine::nullTerminate() { + return LuaNullEnforcer(*this); +} + LuaEngine* LuaEngine::luaEnginePtr(lua_State* state) { return (*reinterpret_cast<LuaEngine**>(lua_getextraspace(state))); } @@ -710,9 +723,33 @@ char const* LuaEngine::stringPtr(int handleIndex) { } size_t LuaEngine::stringLength(int handleIndex) { - size_t len = 0; - lua_tolstring(m_handleThread, handleIndex, &len); - return len; + if (m_nullTerminated) + return strlen(lua_tostring(m_handleThread, handleIndex)); + else { + size_t len = 0; + lua_tolstring(m_handleThread, handleIndex, &len); + return len; + } +} + +String LuaEngine::string(int handleIndex) { + if (m_nullTerminated) + return String(lua_tostring(m_handleThread, handleIndex)); + else { + size_t len = 0; + const char* data = lua_tolstring(m_handleThread, handleIndex, &len); + return String(data, len); + } +} + +StringView LuaEngine::stringView(int handleIndex) { + if (m_nullTerminated) + return StringView(lua_tostring(m_handleThread, handleIndex)); + else { + size_t len = 0; + const char* data = lua_tolstring(m_handleThread, handleIndex, &len); + return StringView(data, len); + } } LuaValue LuaEngine::tableGet(bool raw, int handleIndex, LuaValue const& key) { |