From 3baa99f941e776233eac8f0ffe986bec8ff38c65 Mon Sep 17 00:00:00 2001 From: ThePhD Date: Sat, 7 Jan 2017 00:40:44 -0500 Subject: [PATCH] thread and state awareness in all sol lua types --- sol/stack_reference.hpp | 189 ++++++++++++++++++++-------------------- sol/variadic_args.hpp | 11 ++- 2 files changed, 105 insertions(+), 95 deletions(-) diff --git a/sol/stack_reference.hpp b/sol/stack_reference.hpp index e7505c83..56169066 100644 --- a/sol/stack_reference.hpp +++ b/sol/stack_reference.hpp @@ -1,93 +1,96 @@ -// The MIT License (MIT) - -// Copyright (c) 2013-2016 Rapptz, ThePhD and contributors - -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#ifndef SOL_STACK_REFERENCE_HPP -#define SOL_STACK_REFERENCE_HPP - -namespace sol { - class stack_reference { - private: - lua_State* L = nullptr; - int index = 0; - - protected: - int registry_index() const noexcept { - return LUA_NOREF; - } - - public: - stack_reference() noexcept = default; - stack_reference(lua_nil_t) noexcept : stack_reference() {}; - stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {} - stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {} - stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {} - stack_reference(lua_State* L, ref_index i) noexcept = delete; - stack_reference(stack_reference&& o) noexcept = default; - stack_reference& operator=(stack_reference&&) noexcept = default; - stack_reference(const stack_reference&) noexcept = default; - stack_reference& operator=(const stack_reference&) noexcept = default; - - int push() const noexcept { - return push(lua_state()); - } - - int push(lua_State* Ls) const noexcept { - lua_pushvalue(Ls, index); - return 1; - } - - void pop() const noexcept { - pop(lua_state()); - } - - void pop(lua_State* Ls, int n = 1) const noexcept { - lua_pop(Ls, n); - } - - int stack_index() const noexcept { - return index; - } - - type get_type() const noexcept { - int result = lua_type(L, index); - return static_cast(result); - } - - lua_State* lua_state() const noexcept { - return L; - } - - bool valid() const noexcept { - type t = get_type(); - return t != type::lua_nil && t != type::none; - } - }; - - inline bool operator== (const stack_reference& l, const stack_reference& r) { - return lua_compare(l.lua_state(), l.stack_index(), r.stack_index(), LUA_OPEQ) == 0; - } - - inline bool operator!= (const stack_reference& l, const stack_reference& r) { - return !operator==(l, r); - } -} // sol - -#endif // SOL_STACK_REFERENCE_HPP +// The MIT License (MIT) + +// Copyright (c) 2013-2016 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SOL_STACK_REFERENCE_HPP +#define SOL_STACK_REFERENCE_HPP + +namespace sol { + class stack_reference { + private: + lua_State* L = nullptr; + int index = 0; + + protected: + int registry_index() const noexcept { + return LUA_NOREF; + } + + public: + stack_reference() noexcept = default; + stack_reference(lua_nil_t) noexcept : stack_reference() {}; + stack_reference(lua_State* L, int i) noexcept : L(L), index(lua_absindex(L, i)) {} + stack_reference(lua_State* L, absolute_index i) noexcept : L(L), index(i) {} + stack_reference(lua_State* L, raw_index i) noexcept : L(L), index(i) {} + stack_reference(lua_State* L, ref_index i) noexcept = delete; + stack_reference(stack_reference&& o) noexcept = default; + stack_reference& operator=(stack_reference&&) noexcept = default; + stack_reference(const stack_reference&) noexcept = default; + stack_reference& operator=(const stack_reference&) noexcept = default; + + int push() const noexcept { + return push(lua_state()); + } + + int push(lua_State* Ls) const noexcept { + lua_pushvalue(lua_state(), index); + if (Ls != lua_state()) { + lua_xmove(lua_state(), Ls, 1); + } + return 1; + } + + void pop() const noexcept { + pop(lua_state()); + } + + void pop(lua_State* Ls, int n = 1) const noexcept { + lua_pop(Ls, n); + } + + int stack_index() const noexcept { + return index; + } + + type get_type() const noexcept { + int result = lua_type(L, index); + return static_cast(result); + } + + lua_State* lua_state() const noexcept { + return L; + } + + bool valid() const noexcept { + type t = get_type(); + return t != type::lua_nil && t != type::none; + } + }; + + inline bool operator== (const stack_reference& l, const stack_reference& r) { + return lua_compare(l.lua_state(), l.stack_index(), r.stack_index(), LUA_OPEQ) == 0; + } + + inline bool operator!= (const stack_reference& l, const stack_reference& r) { + return !operator==(l, r); + } +} // sol + +#endif // SOL_STACK_REFERENCE_HPP diff --git a/sol/variadic_args.hpp b/sol/variadic_args.hpp index cd1161c6..07127970 100644 --- a/sol/variadic_args.hpp +++ b/sol/variadic_args.hpp @@ -192,11 +192,18 @@ namespace sol { const_reverse_iterator crend() const { return std::reverse_iterator(cend()); } int push() const { + push(L); + } + + int push(lua_State* target) const { int pushcount = 0; for (int i = index; i <= stacktop; ++i) { lua_pushvalue(L, i); pushcount += 1; } + if (target != L) { + lua_xmove(L, target, pushcount); + } return pushcount; } @@ -226,8 +233,8 @@ namespace sol { template <> struct pusher { - static int push(lua_State*, const variadic_args& ref) { - return ref.push(); + static int push(lua_State* L, const variadic_args& ref) { + return ref.push(L); } }; } // stack