mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
balance that stack, goddamnit, BALANCE IT
This commit is contained in:
parent
8c9c662d97
commit
9d52ed49ba
|
@ -9,38 +9,38 @@ Browse the various function and classes :doc:`Sol<../index>` utilizes to make yo
|
|||
:name: apitoc
|
||||
:maxdepth: 2
|
||||
|
||||
compatibility
|
||||
coroutine
|
||||
c_call
|
||||
error
|
||||
function
|
||||
protected_function
|
||||
object
|
||||
reference
|
||||
stack_reference
|
||||
make_reference
|
||||
overload
|
||||
protect
|
||||
readonly
|
||||
var
|
||||
resolve
|
||||
as_function
|
||||
property
|
||||
proxy
|
||||
stack
|
||||
optional
|
||||
state
|
||||
table
|
||||
proxy
|
||||
as_table
|
||||
metatable_key
|
||||
this_state
|
||||
thread
|
||||
tie
|
||||
types
|
||||
user
|
||||
usertype
|
||||
simple_usertype
|
||||
userdata
|
||||
usertype_memory
|
||||
unique_usertype_traits
|
||||
tie
|
||||
function
|
||||
protected_function
|
||||
coroutine
|
||||
error
|
||||
object
|
||||
userdata
|
||||
reference
|
||||
thread
|
||||
stack_reference
|
||||
make_reference
|
||||
optional
|
||||
this_state
|
||||
variadic_args
|
||||
overload
|
||||
property
|
||||
var
|
||||
protect
|
||||
readonly
|
||||
as_function
|
||||
c_call
|
||||
resolve
|
||||
stack
|
||||
user
|
||||
compatibility
|
||||
types
|
||||
metatable_key
|
||||
|
|
|
@ -234,9 +234,15 @@ namespace sol {
|
|||
apply<false>(std::index_sequence<I1, I...>(), L, std::forward<Keys>(keys), std::forward<Value>(value), -1);
|
||||
}
|
||||
|
||||
template <bool g, std::size_t I0, std::size_t... I, typename Keys, typename Value>
|
||||
void top_apply(std::index_sequence<I0, I...>, lua_State* L, Keys&& keys, Value&& value, int tableindex) {
|
||||
apply<g>(std::index_sequence<I0, I...>(), L, std::forward<Keys>(keys), std::forward<Value>(value), tableindex);
|
||||
lua_pop(L, static_cast<int>(sizeof...(I)));
|
||||
}
|
||||
|
||||
template <typename Keys, typename Value>
|
||||
void set(lua_State* L, Keys&& keys, Value&& value, int tableindex = -3) {
|
||||
apply<b>(std::make_index_sequence<sizeof...(Args)>(), L, std::forward<Keys>(keys), std::forward<Value>(value), tableindex);
|
||||
top_apply<b>(std::make_index_sequence<sizeof...(Args)>(), L, std::forward<Keys>(keys), std::forward<Value>(value), tableindex);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -246,6 +252,7 @@ namespace sol {
|
|||
void set(lua_State* L, Keys&& keys, Value&& value, int tableindex = -1) {
|
||||
get_field<b, raw>(L, detail::forward_get<0>(keys), tableindex);
|
||||
set_field<false, raw>(L, detail::forward_get<1>(keys), std::forward<Value>(value));
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
};
|
||||
} // stack
|
||||
|
|
|
@ -77,6 +77,42 @@ TEST_CASE("tables/as-enum-classes", "Making sure enums can be put in and gotten
|
|||
REQUIRE(dir == direction::up);
|
||||
}
|
||||
|
||||
TEST_CASE("tables/cleanup", "make sure tables leave the stack balanced") {
|
||||
sol::state lua;
|
||||
lua.open_libraries();
|
||||
|
||||
auto f = [] { return 5; };
|
||||
for (int i = 0; i < 30; i++) {
|
||||
std::string name = std::string("init") + std::to_string(i);
|
||||
int top = lua_gettop(lua);
|
||||
lua[name] = f;
|
||||
int aftertop = lua_gettop(lua);
|
||||
REQUIRE(aftertop == top);
|
||||
int val = lua[name]();
|
||||
REQUIRE(val == 5);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("tables/nested-cleanup", "make sure tables leave the stack balanced") {
|
||||
sol::state lua;
|
||||
lua.open_libraries();
|
||||
|
||||
lua.script("A={}");
|
||||
auto f = [] { return 5; };
|
||||
for (int i = 0; i < 30; i++) {
|
||||
std::string name = std::string("init") + std::to_string(i);
|
||||
int top = lua_gettop(lua);
|
||||
auto A = lua["A"];
|
||||
int beforetop = lua_gettop(lua);
|
||||
REQUIRE(beforetop == top);
|
||||
A[name] = f;
|
||||
int aftertop = lua_gettop(lua);
|
||||
REQUIRE(aftertop == top);
|
||||
int val = A[name]();
|
||||
REQUIRE(val == 5);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("tables/new_enum", "Making sure enums can be put in and gotten out as values") {
|
||||
enum class direction {
|
||||
up,
|
||||
|
|
Loading…
Reference in New Issue
Block a user