2019-05-22 07:17:31 +08:00
|
|
|
#define SOL_ALL_SAFETIES_ON 1
|
2018-09-28 13:27:38 +08:00
|
|
|
#include <sol/sol.hpp>
|
2017-04-21 10:31:59 +08:00
|
|
|
|
2017-12-26 12:27:22 +08:00
|
|
|
#include "assert.hpp"
|
2017-04-21 10:31:59 +08:00
|
|
|
|
2017-05-07 22:16:47 +08:00
|
|
|
// NOTE:
|
|
|
|
// There are TWO ways to retrieve the "this"
|
|
|
|
// object from calls, when it comes to constructors and regular member functions
|
|
|
|
// please pay attention to both: this is a low-level operation!
|
|
|
|
|
2017-04-21 10:31:59 +08:00
|
|
|
int main() {
|
|
|
|
struct thing {
|
|
|
|
|
|
|
|
thing(sol::this_state ts) {
|
|
|
|
lua_State* L = ts;
|
|
|
|
// references the object that called this function
|
|
|
|
// in constructors:
|
|
|
|
sol::stack_object selfobj(L, -1);
|
|
|
|
// the -1 (NEGATIVE one) above
|
|
|
|
// means "off the top fo the stack"
|
|
|
|
// (-1 is the top, -2 is one below, etc...)
|
|
|
|
|
|
|
|
// definitely the same
|
|
|
|
thing& self = selfobj.as<thing>();
|
2017-12-26 12:27:22 +08:00
|
|
|
c_assert(&self == this);
|
2017-04-21 10:31:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void func(sol::this_state ts) const {
|
|
|
|
lua_State* L = ts;
|
|
|
|
// references the object that called this function
|
|
|
|
// in regular member functions:
|
|
|
|
sol::stack_object selfobj(L, 1);
|
|
|
|
// "1" is the bottom of the Lua stack
|
|
|
|
// 2 is one up, so on and so forth...
|
|
|
|
thing& self = selfobj.as<thing>();
|
|
|
|
|
|
|
|
// definitely the same
|
2017-12-26 12:27:22 +08:00
|
|
|
c_assert(&self == this);
|
2017-04-21 10:31:59 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
sol::state lua;
|
|
|
|
lua.open_libraries(sol::lib::base);
|
|
|
|
|
|
|
|
lua.new_usertype<thing>("thing",
|
|
|
|
sol::constructors<thing(sol::this_state)>(),
|
|
|
|
"func", &thing::func
|
|
|
|
);
|
|
|
|
|
|
|
|
lua.script(R"(
|
|
|
|
obj = thing.new()
|
|
|
|
obj:func()
|
|
|
|
)");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|