From dc2493e7525bb7633f697ef10f72b72b46222249 Mon Sep 17 00:00:00 2001 From: Andy Belle-Isle Date: Fri, 30 Aug 2019 00:45:36 -0400 Subject: Forget what I said, I just need to change git attributes to mark for vendor --- lib/sol2/examples/source/read_only.cpp | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/sol2/examples/source/read_only.cpp (limited to 'lib/sol2/examples/source/read_only.cpp') diff --git a/lib/sol2/examples/source/read_only.cpp b/lib/sol2/examples/source/read_only.cpp new file mode 100644 index 0000000..27af9b2 --- /dev/null +++ b/lib/sol2/examples/source/read_only.cpp @@ -0,0 +1,49 @@ +#define SOL_ALL_SAFETIES_ON 1 +#include + +#include + +struct object { + void my_func() { + std::cout << "hello\n"; + } +}; + +int deny(lua_State* L) { + return luaL_error(L, "HAH! Deniiiiied!"); +} + +int main(int, char*[]) { + + sol::state lua; + lua.open_libraries(sol::lib::base); + + object my_obj; + + sol::table obj_table = lua.create_named_table("object"); + + sol::table obj_metatable = lua.create_table_with(); + obj_metatable.set_function("my_func", &object::my_func, &my_obj); + // Set whatever else you need to + // on the obj_metatable, + // not on the obj_table itself! + + // Properly self-index metatable to block things + obj_metatable[sol::meta_function::new_index] = deny; + obj_metatable[sol::meta_function::index] = obj_metatable; + + // Set it on the actual table + obj_table[sol::metatable_key] = obj_metatable; + + try { + lua.script(R"( +print(object.my_func) +object["my_func"] = 24 +print(object.my_func) + )"); + } + catch (const std::exception& e) { + std::cout << "an expected error occurred: " << e.what() << std::endl; + } + return 0; +} \ No newline at end of file -- cgit v1.2.3