From 136b877afa615b3b9e4363d31b38ed09d52e133c Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 27 Dec 2011 21:37:00 -0700 Subject: [PATCH] Reduce cost of including chaiscript.hpp - ChaiScript no longer includes or automatically instantiates std lib - ChaiScript constructor now requires an std lib instance in the form of a ModulePtr object - This new layout facilitates better usage of compilation firewalls and factories for reducing the overall impact of ChaiScript on a project --- include/chaiscript/chaiscript.hpp | 2 - include/chaiscript/dispatchkit/bootstrap.hpp | 2 +- .../chaiscript/dispatchkit/bootstrap_stl.hpp | 1 + .../chaiscript/dispatchkit/boxed_value.hpp | 11 +++-- .../chaiscript/language/chaiscript_common.hpp | 1 + .../chaiscript/language/chaiscript_engine.hpp | 16 +++--- .../chaiscript/language/chaiscript_eval.hpp | 1 + samples/example.cpp | 3 +- samples/memory_leak_test.cpp | 49 ++++++++++--------- src/main.cpp | 3 +- src/reflection.cpp | 2 + src/stl_extra.cpp | 1 + unittests/dynamic_object_test.cpp | 5 +- unittests/eval_catch_exception_test.cpp | 11 +++-- unittests/function_ordering_test.cpp | 3 +- unittests/functor_cast_test.cpp | 3 +- unittests/functor_creation_test.cpp | 4 +- unittests/multifile_test_chai.cpp | 4 +- unittests/object_lifetime_test.cpp | 3 +- unittests/utility_test.cpp | 3 +- 20 files changed, 72 insertions(+), 56 deletions(-) diff --git a/include/chaiscript/chaiscript.hpp b/include/chaiscript/chaiscript.hpp index 33cf6db0..8644f8f1 100644 --- a/include/chaiscript/chaiscript.hpp +++ b/include/chaiscript/chaiscript.hpp @@ -748,8 +748,6 @@ #include "chaiscript_defines.hpp" #include "dispatchkit/dispatchkit.hpp" -#include "dispatchkit/bootstrap.hpp" -#include "dispatchkit/bootstrap_stl.hpp" #include "dispatchkit/function_call.hpp" #include "dispatchkit/dynamic_object.hpp" #include "dispatchkit/boxed_number.hpp" diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index f557aab0..5e5bdbed 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -478,7 +478,7 @@ namespace chaiscript m->add(Proxy_Function(new dispatch::Dynamic_Proxy_Function(std::bind(&call_exists, std::placeholders::_1))), "call_exists"); - m->add(fun(&type_match), "type_match"); + m->add(fun(&Boxed_Value::type_match), "type_match"); return m; } diff --git a/include/chaiscript/dispatchkit/bootstrap_stl.hpp b/include/chaiscript/dispatchkit/bootstrap_stl.hpp index f2f7e515..1316970d 100644 --- a/include/chaiscript/dispatchkit/bootstrap_stl.hpp +++ b/include/chaiscript/dispatchkit/bootstrap_stl.hpp @@ -17,6 +17,7 @@ #define CHAISCRIPT_BOOTSTRAP_STL_HPP_ #include "dispatchkit.hpp" +#include "bootstrap.hpp" #include "register_function.hpp" namespace chaiscript diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index c7b6ca71..a987e2c1 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -263,6 +263,12 @@ namespace chaiscript return m_data->m_const_data_ptr; } + /// \returns true if the two Boxed_Values share the same internal type + static bool type_match(Boxed_Value l, Boxed_Value r) + { + return l.get_type_info() == r.get_type_info(); + } + private: std::shared_ptr m_data; }; @@ -361,11 +367,6 @@ namespace chaiscript - /// \returns true if the two Boxed_Values share the same internal type - static bool type_match(Boxed_Value l, Boxed_Value r) - { - return l.get_type_info() == r.get_type_info(); - } } #endif diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 7b5e5ee0..08786034 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -7,6 +7,7 @@ #ifndef CHAISCRIPT_COMMON_HPP_ #define CHAISCRIPT_COMMON_HPP_ +#include #include "../dispatchkit/dispatchkit.hpp" namespace chaiscript diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 1b7cda1e..210661bf 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -324,8 +324,7 @@ namespace chaiscript /** * Builds all the requirements for ChaiScript, including its evaluator and a run of its prelude. */ - void build_eval_system() { - using namespace bootstrap; + void build_eval_system(const ModulePtr &t_lib) { m_engine.add_reserved_word("def"); m_engine.add_reserved_word("fun"); m_engine.add_reserved_word("while"); @@ -342,7 +341,7 @@ namespace chaiscript m_engine.add_reserved_word("false"); m_engine.add_reserved_word("_"); - add(Bootstrap::bootstrap()); + add(t_lib); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_system, std::ref(m_engine)), "dump_system"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_object, std::ref(m_engine)), "dump_object"); @@ -359,11 +358,6 @@ namespace chaiscript m_engine.add(fun(static_cast(&ChaiScript::load_module), this), "load_module"); m_engine.add(fun(static_cast(&ChaiScript::load_module), this), "load_module"); - add(standard_library::vector_type >("Vector")); - add(standard_library::string_type("string")); - add(standard_library::map_type >("Map")); - add(standard_library::pair_type >("Pair")); - m_engine.add(fun(&ChaiScript::use, this), "use"); m_engine.add(fun(&ChaiScript::internal_eval, this), "eval"); m_engine.add(fun(&ChaiScript::internal_eval_ast, this), "eval"); @@ -398,9 +392,11 @@ namespace chaiscript public: /// \brief Constructor for ChaiScript + /// \param[in] t_lib Standard library to apply to this ChaiScript instance /// \param[in] t_modulepaths Vector of paths to search when attempting to load a binary module /// \param[in] t_usepaths Vector of paths to search when attempting to "use" an included ChaiScript file - ChaiScript(const std::vector &t_modulepaths = std::vector(), + ChaiScript(const ModulePtr &t_lib, + const std::vector &t_modulepaths = std::vector(), const std::vector &t_usepaths = std::vector()) : m_modulepaths(t_modulepaths), m_usepaths(t_usepaths) { @@ -414,7 +410,7 @@ namespace chaiscript m_usepaths.push_back(""); } - build_eval_system(); + build_eval_system(t_lib); } /// \brief Adds a constant object that is available in all contexts and to all threads diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 4337e694..684a29fb 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -10,6 +10,7 @@ #include #include "chaiscript_common.hpp" +#include "../dispatchkit/register_function.hpp" namespace chaiscript { diff --git a/samples/example.cpp b/samples/example.cpp index cd3ad9bd..9319d187 100644 --- a/samples/example.cpp +++ b/samples/example.cpp @@ -7,6 +7,7 @@ #include #include +#include #include void log(const std::string &msg) @@ -66,7 +67,7 @@ void take_shared_ptr(const std::shared_ptr &p) int main(int /*argc*/, char * /*argv*/[]) { using namespace chaiscript; - ChaiScript chai; + ChaiScript chai(Std_Lib::library()); //Create a new system object and share it with the chaiscript engine System system; diff --git a/samples/memory_leak_test.cpp b/samples/memory_leak_test.cpp index bbd8a5fe..7129da21 100644 --- a/samples/memory_leak_test.cpp +++ b/samples/memory_leak_test.cpp @@ -1,13 +1,14 @@ #include -#include "chaiscript/chaiscript.hpp" +#include +#include + #ifdef READLINE_AVAILABLE #include #include #endif -using namespace chaiscript; std::string get_next_command() { #ifdef READLINE_AVAILABLE @@ -30,30 +31,32 @@ void fuction(void) class test { - ChaiScript chai; - ChaiScript::State backupState; + chaiscript::ChaiScript chai; + chaiscript::ChaiScript::State backupState; + public: - test() - { - backupState = chai.get_state(); - } - ~test(){} - - void ResetState() - { - chai.set_state(backupState); - chai.add(fun(&fuction),"Whatever()"); - } - - void RunFile(std::string sFile) - { - try { - chaiscript::Boxed_Value val = chai.eval_file(sFile); + test() + : chai(chaiscript::Std_Lib::library()) + { + backupState = chai.get_state(); } - catch (std::exception &e) { - std::cout << e.what() << std::endl; + ~test(){} + + void ResetState() + { + chai.set_state(backupState); + chai.add(chaiscript::fun(&fuction),"Whatever()"); + } + + void RunFile(std::string sFile) + { + try { + chaiscript::Boxed_Value val = chai.eval_file(sFile); + } + catch (std::exception &e) { + std::cout << e.what() << std::endl; + } } - } }; diff --git a/src/main.cpp b/src/main.cpp index 240418cd..096f857f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #define _CRT_SECURE_NO_WARNINGS #include +#include #ifdef READLINE_AVAILABLE #include @@ -176,7 +177,7 @@ int main(int argc, char *argv[]) modulepaths.push_back(modulepath); } - chaiscript::ChaiScript chai(modulepaths,usepaths); + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library(), modulepaths,usepaths); chai.add(chaiscript::fun(&myexit), "exit"); chai.add(chaiscript::fun(&myexit), "quit"); diff --git a/src/reflection.cpp b/src/reflection.cpp index 2bff5284..80ee906b 100644 --- a/src/reflection.cpp +++ b/src/reflection.cpp @@ -1,5 +1,7 @@ #include +#include +#include #include #include diff --git a/src/stl_extra.cpp b/src/stl_extra.cpp index 67e6c27a..98683661 100644 --- a/src/stl_extra.cpp +++ b/src/stl_extra.cpp @@ -1,5 +1,6 @@ #include +#include #include #include diff --git a/unittests/dynamic_object_test.cpp b/unittests/dynamic_object_test.cpp index ca0ffaec..60c1e5e9 100644 --- a/unittests/dynamic_object_test.cpp +++ b/unittests/dynamic_object_test.cpp @@ -1,3 +1,5 @@ + +#include #include template @@ -14,8 +16,7 @@ void assert_equal(const LHS &lhs, const RHS &rhs) int main() { - - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); chai("attr bob::z; def bob::bob() { this.z = 10 }; auto x = bob()"); diff --git a/unittests/eval_catch_exception_test.cpp b/unittests/eval_catch_exception_test.cpp index c599c091..b92021ff 100644 --- a/unittests/eval_catch_exception_test.cpp +++ b/unittests/eval_catch_exception_test.cpp @@ -1,10 +1,11 @@ // Tests to make sure that the order in which function dispatches occur is correct #include +#include int test_generic() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); try { chai.eval("throw(runtime_error(\"error\"));"); @@ -22,7 +23,7 @@ int test_generic() int test_1() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); try { chai.eval("throw(1)", chaiscript::exception_specification()); @@ -39,7 +40,7 @@ int test_1() int test_2() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); try { chai.eval("throw(1.0)", chaiscript::exception_specification()); @@ -56,7 +57,7 @@ int test_2() int test_5() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); try { chai.eval("throw(runtime_error(\"error\"))", chaiscript::exception_specification()); @@ -82,7 +83,7 @@ int test_5() int test_unhandled() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); try { chai.eval("throw(\"error\")", chaiscript::exception_specification()); diff --git a/unittests/function_ordering_test.cpp b/unittests/function_ordering_test.cpp index e80f4d32..92907b03 100644 --- a/unittests/function_ordering_test.cpp +++ b/unittests/function_ordering_test.cpp @@ -1,6 +1,7 @@ // Tests to make sure that the order in which function dispatches occur is correct #include +#include int test_one(const int &) { @@ -14,7 +15,7 @@ int test_two(int &) int main() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); chai.eval("def test_fun(x) { return 3; }"); chai.eval("def test_fun(x) : x == \"hi\" { return 4; }"); chai.eval("def test_fun(x) { return 5; }"); diff --git a/unittests/functor_cast_test.cpp b/unittests/functor_cast_test.cpp index 7c76ca20..33250c90 100644 --- a/unittests/functor_cast_test.cpp +++ b/unittests/functor_cast_test.cpp @@ -1,4 +1,5 @@ #include +#include double test_call(const std::function &f, int val) { @@ -8,7 +9,7 @@ double test_call(const std::function &f, int val) int main() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); chai.add(chaiscript::fun(&test_call), "test_call"); diff --git a/unittests/functor_creation_test.cpp b/unittests/functor_creation_test.cpp index 6a78feef..d5289cbc 100644 --- a/unittests/functor_creation_test.cpp +++ b/unittests/functor_creation_test.cpp @@ -1,9 +1,11 @@ #include +#include + int main() { - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); chai.eval("def func() { print(\"Hello World\"); } "); diff --git a/unittests/multifile_test_chai.cpp b/unittests/multifile_test_chai.cpp index 154062c9..ac288ffc 100644 --- a/unittests/multifile_test_chai.cpp +++ b/unittests/multifile_test_chai.cpp @@ -1,7 +1,9 @@ #include "multifile_test_chai.hpp" +#include + Multi_Test_Chai::Multi_Test_Chai() - : m_chai(new chaiscript::ChaiScript()) + : m_chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library())) { } diff --git a/unittests/object_lifetime_test.cpp b/unittests/object_lifetime_test.cpp index 07f0c139..80bc52b1 100644 --- a/unittests/object_lifetime_test.cpp +++ b/unittests/object_lifetime_test.cpp @@ -1,4 +1,5 @@ #include +#include class Test { @@ -36,7 +37,7 @@ int main() { {chaiscript::fun(&Test::count), "count"} } ); - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library()); chai.add(m); chai.add(chaiscript::fun(&Test::count), "count"); diff --git a/unittests/utility_test.cpp b/unittests/utility_test.cpp index 9dbb52af..0145265a 100644 --- a/unittests/utility_test.cpp +++ b/unittests/utility_test.cpp @@ -1,3 +1,4 @@ +#include #include class Test @@ -33,7 +34,7 @@ int main() - chaiscript::ChaiScript chai; + chaiscript::ChaiScript chai(chaiscript::Std_Lib::library());; chai.add(m); if (chai.eval("auto t = Test(); t.function2(); ") == "Function2" && chai.eval("auto t = Test(); t.functionOverload(1); ") == "int"