mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
53 lines
1.3 KiB
C++
53 lines
1.3 KiB
C++
|
#define SOL_CHECK_ARGUMENTS 1
|
||
|
#include <sol.hpp>
|
||
|
|
||
|
#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;
|
||
|
|
||
|
auto new_shared_ptr = [](sol::stack_object obj) {
|
||
|
// works just fine
|
||
|
sol::stack::modify_unique_usertype(obj, [](std::shared_ptr<ree>& sptr) {
|
||
|
sptr = std::make_shared<ree>(sptr->value + 1);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
auto reset_shared_ptr = [](sol::stack_object obj) {
|
||
|
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...
|
||
|
// which will NOT compare == to nil
|
||
|
});
|
||
|
};
|
||
|
|
||
|
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;
|
||
|
}
|