From d9a92a5148610e752012aba5085a7dd2f6574de3 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Wed, 9 Mar 2011 21:39:21 -0700 Subject: [PATCH 1/4] Add std::exception as a base clase off std::runtime_error and provide unit test for it. --- CMakeLists.txt | 4 ++++ include/chaiscript/dispatchkit/bootstrap.hpp | 3 +++ unittests/eval_catch_exception_test.cpp | 21 ++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 unittests/eval_catch_exception_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fd09ac5..e105e74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,6 +170,10 @@ IF(BUILD_TESTING) target_link_libraries(type_info_test ${LIBS}) add_test(NAME Type_Info_Test COMMAND type_info_test) + add_executable(eval_catch_exception_test unittests/eval_catch_exception_test.cpp) + target_link_libraries(eval_catch_exception_test ${LIBS}) + add_test(NAME Eval_Catch_Exception_Test COMMAND eval_catch_exception_test) + add_executable(multifile_test unittests/multifile_test_main.cpp unittests/multifile_test_chai.cpp unittests/multifile_test_module.cpp) target_link_libraries(multifile_test ${LIBS}) diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 06e5fdc..9db7942 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -581,6 +581,9 @@ namespace chaiscript m->add(user_type(), "runtime_error"); + m->add(chaiscript::base_class()); + + m->add(constructor(), "runtime_error"); m->add(fun(boost::function(&what)), "what"); diff --git a/unittests/eval_catch_exception_test.cpp b/unittests/eval_catch_exception_test.cpp new file mode 100644 index 0000000..8b08733 --- /dev/null +++ b/unittests/eval_catch_exception_test.cpp @@ -0,0 +1,21 @@ +// Tests to make sure that the order in which function dispatches occur is correct + +#include + + +int main() +{ + chaiscript::ChaiScript chai; + + try { + chai.eval("throw(runtime_error(\"error\"));"); + } catch (const chaiscript::Boxed_Value &bv) { + const std::exception &e = chaiscript::boxed_cast(bv); + if (e.what() == std::string("error")) + { + return EXIT_SUCCESS; + } + } + + return EXIT_FAILURE; +} From 46a669dab11c71d47fcb98bbc56fda220f2b27d6 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Fri, 11 Mar 2011 17:54:55 -0700 Subject: [PATCH 2/4] Fix problem with method specifiers for bad_dynamic_boxed_cast exception. Add support for operators to Utility.hpp --- .../chaiscript/dispatchkit/bad_boxed_cast.hpp | 2 +- .../dispatchkit/dynamic_cast_conversion.hpp | 4 +++- include/chaiscript/utility/utility.hpp | 19 +++++++++++-------- src/test_module.cpp | 3 +++ unittests/inheritance.chai | 2 +- unittests/utility_test.cpp | 2 ++ 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp index 46c70ec..3bf39f5 100644 --- a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp @@ -21,7 +21,7 @@ namespace chaiscript { public: bad_boxed_cast(const Type_Info &t_from, const std::type_info &t_to, - const std::string &what) + const std::string &what) throw() : from(t_from), to(&t_to), m_what(what) { } diff --git a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp index af3edca..129b963 100644 --- a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp +++ b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp @@ -21,7 +21,7 @@ namespace chaiscript { public: bad_boxed_dynamic_cast(const Type_Info &t_from, const std::type_info &t_to, - const std::string &t_what) + const std::string &t_what) throw() : bad_boxed_cast(t_from, t_to, t_what) { } @@ -35,6 +35,8 @@ namespace chaiscript : bad_boxed_cast(w) { } + + virtual ~bad_boxed_dynamic_cast() throw() {} }; } diff --git a/include/chaiscript/utility/utility.hpp b/include/chaiscript/utility/utility.hpp index ced34c0..9371687 100644 --- a/include/chaiscript/utility/utility.hpp +++ b/include/chaiscript/utility/utility.hpp @@ -53,10 +53,10 @@ namespace chaiscript { inline std::string class_name_translator(const std::string &t_name) { - size_t colon = t_name.find_last_of("::"); + size_t colon = t_name.rfind("::"); if (colon != std::string::npos) { - return t_name.substr(colon+1, std::string::npos); + return t_name.substr(colon+2, std::string::npos); } else { return t_name; } @@ -64,13 +64,16 @@ namespace chaiscript inline std::string method_name_translator(const std::string &t_name) { - size_t colon = t_name.find_last_of("::"); - if (colon != std::string::npos) + size_t namestart = t_name.rfind("operator"); + namestart = (namestart == std::string::npos)?0:namestart+strlen("operator"); + + if (namestart == 0) { - return t_name.substr(colon+1, std::string::npos); - } else { - return t_name; - } + namestart = t_name.rfind("::"); + namestart = (namestart == std::string::npos)?0:namestart+strlen("::"); + } + + return t_name.substr(namestart, std::string::npos); } } } diff --git a/src/test_module.cpp b/src/test_module.cpp index 96573da..77455f6 100644 --- a/src/test_module.cpp +++ b/src/test_module.cpp @@ -5,6 +5,8 @@ class TestBaseType { public: + TestBaseType() {} + TestBaseType(int) {} virtual ~TestBaseType() {} virtual int func() { return 0; } @@ -40,6 +42,7 @@ CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_test_mo m->add(chaiscript::user_type(), "TestDerivedType"); m->add(chaiscript::constructor(), "TestBaseType"); +// m->add(chaiscript::constructor(), "TestBaseType"); m->add(chaiscript::constructor(), "TestBaseType"); m->add(chaiscript::constructor(), "TestDerivedType"); diff --git a/unittests/inheritance.chai b/unittests/inheritance.chai index d93ca88..1fcd346 100644 --- a/unittests/inheritance.chai +++ b/unittests/inheritance.chai @@ -1,6 +1,6 @@ load_module("test_module") -var t0 = TestBaseType(); +var t0 = TestBaseType() var t = TestDerivedType(); assert_equal(t0.func(), 0); diff --git a/unittests/utility_test.cpp b/unittests/utility_test.cpp index 21294a1..bcd3240 100644 --- a/unittests/utility_test.cpp +++ b/unittests/utility_test.cpp @@ -24,6 +24,7 @@ int main() ((function3)) ((functionOverload)(std::string (Test::*)(double))) ((functionOverload)(std::string (Test::*)(int))) + ((operator=)) ); chaiscript::ChaiScript chai; @@ -32,6 +33,7 @@ int main() && chai.eval("var t = Test(); t.functionOverload(1); ") == "int" && chai.eval("var t = Test(); t.functionOverload(1.1); ") == "double") { + chai.eval("t = Test();"); return EXIT_SUCCESS; } else { return EXIT_FAILURE; From 4e06478fb8d339397d10e3c07ffd3919f746072c Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sat, 12 Mar 2011 11:27:53 -0700 Subject: [PATCH 3/4] Amp up the warnings used in g++ and fix associated errors --- CMakeLists.txt | 2 +- .../chaiscript/dispatchkit/bad_boxed_cast.hpp | 8 ++++---- .../dispatchkit/boxed_pod_value.hpp | 10 +++++----- .../dispatchkit/dynamic_cast_conversion.hpp | 20 +++++++++---------- .../dispatchkit/proxy_functions_detail.hpp | 2 +- .../chaiscript/language/chaiscript_eval.hpp | 16 +++++++-------- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e105e74..5500945 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,7 @@ IF(MSVC) ENDIF() ELSE() # -Wno-missing-field-initializers is for boost on macos - ADD_DEFINITIONS(-Wall -Wextra -Wno-missing-field-initializers) + ADD_DEFINITIONS(-Wall -Wextra -Wno-missing-field-initializers -Wshadow) ENDIF() include_directories(include) diff --git a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp index 3bf39f5..2d844a1 100644 --- a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp @@ -21,8 +21,8 @@ namespace chaiscript { public: bad_boxed_cast(const Type_Info &t_from, const std::type_info &t_to, - const std::string &what) throw() - : from(t_from), to(&t_to), m_what(what) + const std::string &t_what) throw() + : from(t_from), to(&t_to), m_what(t_what) { } @@ -31,8 +31,8 @@ namespace chaiscript { } - bad_boxed_cast(const std::string &w) throw() - : m_what(w) + bad_boxed_cast(const std::string &t_what) throw() + : m_what(t_what) { } diff --git a/include/chaiscript/dispatchkit/boxed_pod_value.hpp b/include/chaiscript/dispatchkit/boxed_pod_value.hpp index ab51c58..42785e4 100644 --- a/include/chaiscript/dispatchkit/boxed_pod_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_pod_value.hpp @@ -203,14 +203,14 @@ namespace chaiscript throw exception::bad_boxed_cast(">> only valid for integer types"); } - Boxed_Value smart_size(boost::int64_t i) const + Boxed_Value smart_size(boost::int64_t t_i) const { - if (i < boost::integer_traits::const_min - || i > boost::integer_traits::const_max) + if (t_i < boost::integer_traits::const_min + || t_i > boost::integer_traits::const_max) { - return Boxed_Value(i); + return Boxed_Value(t_i); } else { - return Boxed_Value(static_cast(i)); + return Boxed_Value(static_cast(t_i)); } } diff --git a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp index 129b963..ab0835b 100644 --- a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp +++ b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp @@ -76,17 +76,17 @@ namespace chaiscript { } - virtual Boxed_Value convert(const Boxed_Value &derived) + virtual Boxed_Value convert(const Boxed_Value &t_derived) { - if (derived.get_type_info().bare_equal(user_type())) + if (t_derived.get_type_info().bare_equal(user_type())) { - if (derived.is_pointer()) + if (t_derived.is_pointer()) { // Dynamic cast out the contained boxed value, which we know is the type we want - if (derived.is_const()) + if (t_derived.is_const()) { boost::shared_ptr data - = boost::dynamic_pointer_cast(detail::Cast_Helper >::cast(derived)); + = boost::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived)); if (!data) { throw std::bad_cast(); @@ -95,7 +95,7 @@ namespace chaiscript return Boxed_Value(data); } else { boost::shared_ptr data - = boost::dynamic_pointer_cast(detail::Cast_Helper >::cast(derived)); + = boost::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived)); if (!data) { @@ -106,19 +106,19 @@ namespace chaiscript } } else { // Pull the reference out of the contained boxed value, which we know is the type we want - if (derived.is_const()) + if (t_derived.is_const()) { - const Derived &d = detail::Cast_Helper::cast(derived); + const Derived &d = detail::Cast_Helper::cast(t_derived); const Base &data = dynamic_cast(d); return Boxed_Value(boost::cref(data)); } else { - Derived &d = detail::Cast_Helper::cast(derived); + Derived &d = detail::Cast_Helper::cast(t_derived); Base &data = dynamic_cast(d); return Boxed_Value(boost::ref(data)); } } } else { - throw exception::bad_boxed_dynamic_cast(derived.get_type_info(), typeid(Base), "Unknown dynamic_cast_conversion"); + throw exception::bad_boxed_dynamic_cast(t_derived.get_type_info(), typeid(Base), "Unknown dynamic_cast_conversion"); } } }; diff --git a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp index 30a51cb..47bf480 100644 --- a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp @@ -69,7 +69,7 @@ namespace chaiscript { call_func(fun, params); return Handle_Return::handle(); - }; + } }; } } diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index f2c7ee7..66655c3 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -633,13 +633,13 @@ namespace chaiscript } try { - const std::string & function_name = this->children[0]->text; - const std::string & annotation = this->annotation?this->annotation->text:""; + const std::string & l_function_name = this->children[0]->text; + const std::string & l_annotation = this->annotation?this->annotation->text:""; t_ss.add(Proxy_Function (new Dynamic_Proxy_Function(boost::bind(&eval_function, boost::ref(t_ss), this->children.back(), t_param_names, _1), static_cast(numparams), this->children.back(), - annotation, guard)), function_name); + l_annotation, guard)), l_function_name); } catch (reserved_word_error &e) { throw Eval_Error("Reserved word used as function name '" + e.word + "'"); @@ -1069,8 +1069,8 @@ namespace chaiscript try { this->children.back()->children[0]->eval(t_ss); } - catch (Eval_Error &ee) { - ee.call_stack.push_back(this->children.back()->children[0]); + catch (Eval_Error &ee2) { + ee2.call_stack.push_back(this->children.back()->children[0]); t_ss.pop_scope(); throw; } @@ -1334,7 +1334,7 @@ namespace chaiscript } try { - const std::string & annotation = this->annotation?this->annotation->text:""; + const std::string & l_annotation = this->annotation?this->annotation->text:""; const std::string & class_name = this->children[0]->text; const std::string & function_name = this->children[1]->text; if (function_name == class_name) { @@ -1343,7 +1343,7 @@ namespace chaiscript (new Dynamic_Proxy_Function(boost::bind(&eval_function, boost::ref(t_ss), this->children.back(), t_param_names, _1), static_cast(numparams), this->children.back(), - annotation, guard)))), function_name); + l_annotation, guard)))), function_name); } else { @@ -1358,7 +1358,7 @@ namespace chaiscript (new Dynamic_Proxy_Function(boost::bind(&eval_function, boost::ref(t_ss), this->children.back(), t_param_names, _1), static_cast(numparams), this->children.back(), - annotation, guard)), ti)), function_name); + l_annotation, guard)), ti)), function_name); } } From 2ce55d81b37f3ec9e559331231605ad54f5892bf Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sun, 13 Mar 2011 19:24:42 -0600 Subject: [PATCH 4/4] Fix bug in installation of some files --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5500945..6984963 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ option(BUILD_SAMPLES "Build Samples Folder" FALSE) list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}") list(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.svn") +list(APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.git") list(APPEND CPACK_SOURCE_IGNORE_FILES ".swp") list(APPEND CPACK_SOURCE_IGNORE_FILES ".*~")