diff options
Diffstat (limited to 'source/core')
-rw-r--r-- | source/core/StarLua.cpp | 12 | ||||
-rw-r--r-- | source/core/StarLua.hpp | 4 | ||||
-rw-r--r-- | source/core/StarLuaConverters.hpp | 6 |
3 files changed, 14 insertions, 8 deletions
diff --git a/source/core/StarLua.cpp b/source/core/StarLua.cpp index 901e875..41355b1 100644 --- a/source/core/StarLua.cpp +++ b/source/core/StarLua.cpp @@ -461,7 +461,7 @@ ByteArray LuaEngine::compile(ByteArray const& contents, String const& name) { LuaString LuaEngine::createString(String const& str) { lua_checkstack(m_state, 1); - if (m_nullTerminated) + if (m_nullTerminated > 0) lua_pushstring(m_state, str.utf8Ptr()); else lua_pushlstring(m_state, str.utf8Ptr(), str.utf8Size()); @@ -556,6 +556,10 @@ LuaNullEnforcer LuaEngine::nullTerminate() { return LuaNullEnforcer(*this); } +void LuaEngine::setNullTerminated(bool nullTerminated) { + m_nullTerminated = nullTerminated ? 0 : INT_MIN; +} + LuaEngine* LuaEngine::luaEnginePtr(lua_State* state) { return (*reinterpret_cast<LuaEngine**>(lua_getextraspace(state))); } @@ -723,7 +727,7 @@ char const* LuaEngine::stringPtr(int handleIndex) { } size_t LuaEngine::stringLength(int handleIndex) { - if (m_nullTerminated) + if (m_nullTerminated > 0) return strlen(lua_tostring(m_handleThread, handleIndex)); else { size_t len = 0; @@ -733,7 +737,7 @@ size_t LuaEngine::stringLength(int handleIndex) { } String LuaEngine::string(int handleIndex) { - if (m_nullTerminated) + if (m_nullTerminated > 0) return String(lua_tostring(m_handleThread, handleIndex)); else { size_t len = 0; @@ -743,7 +747,7 @@ String LuaEngine::string(int handleIndex) { } StringView LuaEngine::stringView(int handleIndex) { - if (m_nullTerminated) + if (m_nullTerminated > 0) return StringView(lua_tostring(m_handleThread, handleIndex)); else { size_t len = 0; diff --git a/source/core/StarLua.hpp b/source/core/StarLua.hpp index 0deb76f..792dc09 100644 --- a/source/core/StarLua.hpp +++ b/source/core/StarLua.hpp @@ -600,6 +600,8 @@ public: // Enforce null-terminated string conversion as long as the returned enforcer object is in scope. LuaNullEnforcer nullTerminate(); + // Disables null-termination enforcement + void setNullTerminated(bool nullTerminated); private: friend struct LuaDetail::LuaHandle; @@ -729,7 +731,7 @@ private: uint64_t m_instructionCount; unsigned m_recursionLevel; unsigned m_recursionLimit; - unsigned m_nullTerminated; + int m_nullTerminated; HashMap<tuple<String, unsigned>, shared_ptr<LuaProfileEntry>> m_profileEntries; }; diff --git a/source/core/StarLuaConverters.hpp b/source/core/StarLuaConverters.hpp index 72ab763..3270d16 100644 --- a/source/core/StarLuaConverters.hpp +++ b/source/core/StarLuaConverters.hpp @@ -15,16 +15,16 @@ template <typename T> struct LuaConverter<LuaNullTermWrapper<T>> : LuaConverter<T> { static LuaValue from(LuaEngine& engine, LuaNullTermWrapper<T>&& v) { auto enforcer = engine.nullTerminate(); - return LuaConverter<T>::from(std::forward<T>(v)); + return LuaConverter<T>::from(engine, std::forward<T>(v)); } static LuaValue from(LuaEngine& engine, LuaNullTermWrapper<T> const& v) { auto enforcer = engine.nullTerminate(); - return LuaConverter<T>::from(v); + return LuaConverter<T>::from(engine, v); } static LuaNullTermWrapper<T> to(LuaEngine& engine, LuaValue const& v) { - return LuaConverter<T>::to(v); + return LuaConverter<T>::to(engine, v); } }; |