From 13fb930676d4ff9b4bd4d483e44aed366a557ceb Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Fri, 18 May 2012 15:31:42 -0600 Subject: [PATCH] First part of system introspection for objs and funcs added --- .../chaiscript/dispatchkit/dispatchkit.hpp | 63 ++++++++++++++++++- .../chaiscript/language/chaiscript_engine.hpp | 2 + unittests/system_introspection.chai | 18 ++++++ unittests/unit_test.inc | 2 +- 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 unittests/system_introspection.chai diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index bafa9cb..2fa1c2a 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -566,8 +566,8 @@ namespace chaiscript if (funcs.size() == 1) { // Return the first item if there is only one, - // no reason to take the cast of the extra level of dispatch - return const_var(*funcs.begin()); + // no reason to take the cost of the extra level of dispatch + return const_var(funcs.front()); } else { return Boxed_Value(Const_Proxy_Function(new Dispatch_Function(funcs))); } @@ -668,6 +668,65 @@ namespace chaiscript return functions.find(name) != functions.end(); } + + /// + /// Get a map of all objects that can be seen from the current scope in a scripting context + /// + std::map get_scripting_objects() const + { + StackData &stack = get_stack_data(); + + std::map retval; + + // note: map insert doesn't overwrite existing values, which is why this works + + for (StackData::reverse_iterator itr = stack.rbegin(); itr != stack.rend(); ++itr) + { + retval.insert(itr->begin(), itr->end()); + } + + // add the global values + { + chaiscript::detail::threading::shared_lock l(m_global_object_mutex); + + retval.insert(m_state.m_global_objects.begin(), m_state.m_global_objects.end()); + } + + return retval; + } + + + /// + /// Get a map of all functions that can be seen from a scripting context + /// + std::map get_scripting_functions() const + { + chaiscript::detail::threading::shared_lock l(m_mutex); + + std::vector > rets; + + const std::map > &functions = get_functions_int(); + + std::map retval; + + for (std::map >::const_iterator itr = functions.begin(); + itr != functions.end(); + ++itr) + { + if (itr->second.size() == 1) + { + // Return the first item if there is only one, + // no reason to take the cost of the extra level of dispatch + retval.insert(std::make_pair(itr->first, const_var(itr->second.front()))); + } else { + retval.insert(std::make_pair(itr->first, Boxed_Value(Const_Proxy_Function(new Dispatch_Function(itr->second))))); + } + } + + return retval; + } + + /** * Get a vector of all registered functions */ diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index a7ccc1d..7586186 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -322,6 +322,8 @@ namespace chaiscript m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::is_type, boost::ref(m_engine)), "is_type"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::type_name, boost::ref(m_engine)), "type_name"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::function_exists, boost::ref(m_engine)), "function_exists"); + m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_scripting_functions, boost::ref(m_engine)), "get_functions"); + m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_scripting_objects, boost::ref(m_engine)), "get_objects"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_type_name, boost::ref(m_engine)), "name"); diff --git a/unittests/system_introspection.chai b/unittests/system_introspection.chai new file mode 100644 index 0000000..dfdb9f1 --- /dev/null +++ b/unittests/system_introspection.chai @@ -0,0 +1,18 @@ + +var funcs = get_functions(); + +assert_true(funcs.size() > 0); +assert_true(funcs["to_string"].get_type_info().bare_equal(Function_type)); + + +var objs = get_objects(); + +var i = 1; +assert_true(objs.size() > 0); +assert_true(objs["i"].get_type_info().bare_equal(int_type)); +assert_true(objs.count("j") == 0); + + + + + diff --git a/unittests/unit_test.inc b/unittests/unit_test.inc index d746e7b..9d2fb91 100644 --- a/unittests/unit_test.inc +++ b/unittests/unit_test.inc @@ -23,7 +23,7 @@ def assert_true(f) { if (!f) { - print("assert_false failure"); + print("assert_true failure"); exit(-1); } }