From 5d56051532188778b8b23af6ba806007afbc5a0c Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 10 Aug 2017 19:47:03 -0600 Subject: [PATCH] Various noexcept additions --- include/chaiscript/chaiscript_threading.hpp | 4 +++- include/chaiscript/dispatchkit/proxy_functions.hpp | 7 ++++--- .../chaiscript/dispatchkit/type_conversions.hpp | 14 +++++++------- .../chaiscript/language/chaiscript_algebraic.hpp | 2 +- include/chaiscript/language/chaiscript_common.hpp | 14 ++++++++------ include/chaiscript/language/chaiscript_eval.hpp | 2 +- .../chaiscript/language/chaiscript_optimizer.hpp | 1 + 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/include/chaiscript/chaiscript_threading.hpp b/include/chaiscript/chaiscript_threading.hpp index cd2c1bd3..ab455983 100644 --- a/include/chaiscript/chaiscript_threading.hpp +++ b/include/chaiscript/chaiscript_threading.hpp @@ -102,7 +102,9 @@ namespace chaiscript void *m_key; private: - static std::unordered_map &t() + /// todo: is it valid to make this noexcept? The allocation could fail, but if it + /// does there is no possible way to recover + static std::unordered_map &t() noexcept { thread_local std::unordered_map my_t; return my_t; diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index 566792b5..75a67a64 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -212,7 +212,7 @@ namespace chaiscript /// \returns the types of all parameters. const std::vector &get_param_types() const noexcept { return m_types; } - virtual bool operator==(const Proxy_Function_Base &) const = 0; + virtual bool operator==(const Proxy_Function_Base &) const noexcept = 0; virtual bool call_match(const std::vector &vals, const Type_Conversions_State &t_conversions) const = 0; virtual bool is_attribute_function() const noexcept { return false; } @@ -268,8 +268,9 @@ namespace chaiscript } } - virtual bool compare_first_type(const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const + virtual bool compare_first_type(const Boxed_Value &bv, const Type_Conversions_State &t_conversions) const noexcept { + /// TODO is m_types guaranteed to be at least 2?? return compare_type_to_param(m_types[1], bv, t_conversions); } @@ -379,7 +380,7 @@ namespace chaiscript return bool(m_guard); } - Proxy_Function get_guard() const + Proxy_Function get_guard() const noexcept { return m_guard; } diff --git a/include/chaiscript/dispatchkit/type_conversions.hpp b/include/chaiscript/dispatchkit/type_conversions.hpp index 353afddc..dd327bf7 100644 --- a/include/chaiscript/dispatchkit/type_conversions.hpp +++ b/include/chaiscript/dispatchkit/type_conversions.hpp @@ -371,18 +371,18 @@ namespace chaiscript } template - bool convertable_type() const + bool convertable_type() const noexcept { return thread_cache().count(user_type().bare_type_info()) != 0; } template - bool converts() const + bool converts() const noexcept { return converts(user_type(), user_type()); } - bool converts(const Type_Info &to, const Type_Info &from) const + bool converts(const Type_Info &to, const Type_Info &from) const noexcept { const auto &types = thread_cache(); if (types.count(to.bare_type_info()) != 0 && types.count(from.bare_type_info()) != 0) @@ -464,7 +464,7 @@ namespace chaiscript } } - Conversion_Saves &conversion_saves() const { + Conversion_Saves &conversion_saves() const noexcept { return *m_conversion_saves; } @@ -519,15 +519,15 @@ namespace chaiscript { } - const Type_Conversions *operator->() const { + const Type_Conversions *operator->() const noexcept { return &m_conversions.get(); } - const Type_Conversions *get() const { + const Type_Conversions *get() const noexcept { return &m_conversions.get(); } - Type_Conversions::Conversion_Saves &saves() const { + Type_Conversions::Conversion_Saves &saves() const noexcept { return m_saves; } diff --git a/include/chaiscript/language/chaiscript_algebraic.hpp b/include/chaiscript/language/chaiscript_algebraic.hpp index b52debbe..2030d061 100644 --- a/include/chaiscript/language/chaiscript_algebraic.hpp +++ b/include/chaiscript/language/chaiscript_algebraic.hpp @@ -36,7 +36,7 @@ namespace chaiscript invalid }; - static const char *to_string(Opers t_oper) { + static const char *to_string(Opers t_oper) noexcept { static const char *opers[] = { "", "==", "<", ">", "<=", ">=", "!=", diff --git a/include/chaiscript/language/chaiscript_common.hpp b/include/chaiscript/language/chaiscript_common.hpp index 2085d52e..c8adbb6c 100644 --- a/include/chaiscript/language/chaiscript_common.hpp +++ b/include/chaiscript/language/chaiscript_common.hpp @@ -31,16 +31,18 @@ struct AST_Node; namespace chaiscript { struct Name_Validator { - static bool is_reserved_word(const std::string &name) + static bool is_reserved_word(const std::string &name) noexcept { - static const std::set m_reserved_words + static const char *m_reserved_words[] = {"def", "fun", "while", "for", "if", "else", "&&", "||", ",", "auto", "return", "break", "true", "false", "class", "attr", "var", "global", "GLOBAL", "_", "__LINE__", "__FILE__", "__FUNC__", "__CLASS__"}; - return m_reserved_words.count(name) > 0; + + return std::any_of(std::begin(m_reserved_words), std::end(m_reserved_words), + [&name](const char *str){ return str == name; }); } - static bool valid_object_name(const std::string &name) + static bool valid_object_name(const std::string &name) noexcept { return name.find("::") == std::string::npos && !is_reserved_word(name); } @@ -136,7 +138,7 @@ namespace chaiscript /// \brief Thrown if an error occurs while attempting to load a binary module struct load_module_error : std::runtime_error { - explicit load_module_error(const std::string &t_reason) noexcept + explicit load_module_error(const std::string &t_reason) : std::runtime_error(t_reason) { } @@ -479,7 +481,7 @@ namespace chaiscript /// Errors generated when loading a file struct file_not_found_error : std::runtime_error { - explicit file_not_found_error(const std::string &t_filename) noexcept + explicit file_not_found_error(const std::string &t_filename) : std::runtime_error("File Not Found: " + t_filename) { } diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index efd54203..23557ca1 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -741,7 +741,7 @@ namespace chaiscript return std::move(vec.back()); } - static bool has_guard(const std::vector> &t_children, const std::size_t offset) + static bool has_guard(const std::vector> &t_children, const std::size_t offset) noexcept { if ((t_children.size() > 2 + offset) && (t_children[1+offset]->identifier == AST_Node_Type::Arg_List)) { if (t_children.size() > 3 + offset) { diff --git a/include/chaiscript/language/chaiscript_optimizer.hpp b/include/chaiscript/language/chaiscript_optimizer.hpp index ae32f130..3df867f1 100644 --- a/include/chaiscript/language/chaiscript_optimizer.hpp +++ b/include/chaiscript/language/chaiscript_optimizer.hpp @@ -447,3 +447,4 @@ namespace chaiscript { #endif +