From 27bee4a266dc8d2469d1eb65b7a91d6338f1ba77 Mon Sep 17 00:00:00 2001 From: Alek Mosingiewicz Date: Fri, 10 Aug 2018 17:29:46 +0200 Subject: [PATCH] Bypass the mutex problem when looking for conversion, automatic test. --- .../dispatchkit/type_conversions.hpp | 8 +------- unittests/compiled_tests.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index 8ba6bfc8..05c03fc1 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -385,7 +385,7 @@ namespace chaiscript void add_conversion(const std::shared_ptr &conversion) { chaiscript::detail::threading::unique_lock l(m_mutex); - if (has_conversion(conversion)) { + if (find_bidir(conversion->to(), conversion->from()) != m_conversions.end()) { throw exception::conversion_error(conversion->to(), conversion->from(), "Trying to re-insert an existing conversion!"); } @@ -475,12 +475,6 @@ namespace chaiscript return find_bidir(to, from) != m_conversions.end(); } - /// \brief has_conversion overloaded for Type_Conversion_Base parameter - bool has_conversion(const std::shared_ptr &conversion) - { - return has_conversion(conversion->to(), conversion->from()); - } - std::shared_ptr get_conversion(const Type_Info &to, const Type_Info &from) const { chaiscript::detail::threading::shared_lock l(m_mutex); diff --git a/unittests/compiled_tests.cpp b/unittests/compiled_tests.cpp index 8723d23d..f6141b09 100644 --- a/unittests/compiled_tests.cpp +++ b/unittests/compiled_tests.cpp @@ -1354,4 +1354,23 @@ TEST_CASE("Test ability to get 'use' function from default construction") const auto use_function = chai.eval>("use"); } +TEST_CASE("Throw an exception when trying to add one conversion twice") +{ + struct my_int { + int value; + my_int(int val): value(val) {}; + }; + + chaiscript::ChaiScript chai; + chai.add(chaiscript::type_conversion([](int x) { + std::cout << "Foo type conversion 1\n"; + return my_int(x); + })); + CHECK_THROWS_AS(chai.add(chaiscript::type_conversion([](int x) { + std::cout << "Foo type conversion 2\n"; + return my_int(x); + })), chaiscript::exception::conversion_error); + +} +