aboutsummaryrefslogtreecommitdiffstats
path: root/lib/sol2/docs/source/api/this_environment.rst
diff options
context:
space:
mode:
authorAndy <drumsetmonkey@gmail.com>2019-08-29 13:07:45 -0400
committerAndy <drumsetmonkey@gmail.com>2019-08-29 13:07:45 -0400
commit4ac4b280abf2ffa28caa5a532353115a3033444f (patch)
tree2a13d658bb454360b2faf401244bb0321d3460d4 /lib/sol2/docs/source/api/this_environment.rst
parente9758416b18b27a65337c28d9641afc0ee89b34b (diff)
parent7a46fa2dd3dad3f038bf8e7339bc67abca428ae6 (diff)
Started creating scripting library/namespace and added sol2 for interfacing
Diffstat (limited to 'lib/sol2/docs/source/api/this_environment.rst')
-rw-r--r--lib/sol2/docs/source/api/this_environment.rst46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/sol2/docs/source/api/this_environment.rst b/lib/sol2/docs/source/api/this_environment.rst
new file mode 100644
index 0000000..de37a63
--- /dev/null
+++ b/lib/sol2/docs/source/api/this_environment.rst
@@ -0,0 +1,46 @@
+this_environment
+================
+*retrieving the environment of the calling function*
+
+
+Sometimes in C++ it's useful to know where a Lua call is coming from and what :doc:`environment<environment>` it is from. The former is covered by Lua's Debug API, which is extensive and is not fully wrapped up by sol3. But, sol3 covers the latter in letting you get the environment of the calling script / function, if it has one. ``sol::this_environment`` is a *transparent argument* and does not need to be passed in Lua scripts or provided when using :doc:`sol::function<function>`, similar to :doc:`sol::this_state<this_state>`:
+
+.. code-block:: cpp
+ :linenos:
+
+ #define SOL_ALL_SAFETIES_ON
+ #include <sol/sol.hpp>
+
+ #include <iostream>
+
+
+ void env_check(sol::this_state ts, int x, sol::this_environment te) {
+ std::cout << "In C++, 'int x' is in the second position, and its value is: " << x << std::endl;
+ if (!te) {
+ std::cout << "function does not have an environment: exiting function early" << std::endl;
+ return;
+ }
+ sol::environment& env = te;
+ sol::state_view lua = ts;
+ sol::environment freshenv = lua["freshenv"];
+ bool is_same_env = freshenv == env;
+ std::cout << "env == freshenv : " << is_same_env << std::endl;
+ }
+
+ int main() {
+ sol::state lua;
+ sol::environment freshenv(lua, sol::create, lua.globals());
+ lua["freshenv"] = freshenv;
+
+ lua.set_function("f", env_check);
+
+ // note that "f" only takes 1 argument and is okay here
+ lua.script("f(25)", freshenv);
+
+ return 0;
+ }
+
+
+Also see `this example`_ for more details.
+
+.. _this example: https://github.com/ThePhD/sol2/blob/develop/examples/source/environment_snooping.cpp \ No newline at end of file