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>
|
2018-03-30 16:51:29 +08:00
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
struct ree {
|
|
|
|
int value = 1;
|
|
|
|
ree() {}
|
|
|
|
ree(int v) : value(v) {}
|
|
|
|
};
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
|
|
|
std::cout << "=== special pointers -- modify in place ===" << std::endl;
|
|
|
|
|
|
|
|
sol::state lua;
|
|
|
|
|
2018-04-02 09:38:21 +08:00
|
|
|
auto new_shared_ptr = [](sol::stack_reference obj) {
|
2018-03-30 16:51:29 +08:00
|
|
|
// works just fine
|
|
|
|
sol::stack::modify_unique_usertype(obj, [](std::shared_ptr<ree>& sptr) {
|
|
|
|
sptr = std::make_shared<ree>(sptr->value + 1);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2018-04-02 09:38:21 +08:00
|
|
|
auto reset_shared_ptr = [](sol::stack_reference obj) {
|
2018-03-30 16:51:29 +08:00
|
|
|
sol::stack::modify_unique_usertype(obj, [](std::shared_ptr<ree>& sptr) {
|
|
|
|
// THIS IS SUCH A BAD IDEA AAAGH
|
|
|
|
sptr.reset();
|
|
|
|
// DO NOT reset to nullptr:
|
|
|
|
// change it to an actual NEW value...
|
|
|
|
// otherwise you will inject a nullptr into the userdata representation...
|
2018-04-02 09:38:21 +08:00
|
|
|
// which will NOT compare == to Lua's nil
|
2018-03-30 16:51:29 +08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
lua.set_function("f", new_shared_ptr);
|
|
|
|
lua.set_function("f2", reset_shared_ptr);
|
|
|
|
lua.set_function("g", [](ree* r) {
|
|
|
|
std::cout << r->value << std::endl;
|
|
|
|
});
|
|
|
|
|
|
|
|
lua["p"] = std::make_shared<ree>();
|
|
|
|
lua.script("g(p) -- okay");
|
|
|
|
lua.script("f(p)");
|
|
|
|
lua.script("g(p) -- okay");
|
|
|
|
// uncomment the below for
|
|
|
|
// segfault/read-access violation
|
|
|
|
lua.script("f2(p)");
|
|
|
|
//lua.script("g(p) -- kaboom");
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|