diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index e6c669b..c2cd20e 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -251,8 +251,9 @@ namespace chaiscript ~Sentinel() { // save new pointer data - m_data.get().m_data_ptr = m_ptr.get().get(); - m_data.get().m_const_data_ptr = m_ptr.get().get(); + const auto ptr = m_ptr.get().get(); + m_data.get().m_data_ptr = ptr; + m_data.get().m_const_data_ptr = ptr; } Sentinel& operator=(Sentinel&&s) = default; diff --git a/include/chaiscript/language/chaiscript_algebraic.hpp b/include/chaiscript/language/chaiscript_algebraic.hpp index 36516dd..022a295 100644 --- a/include/chaiscript/language/chaiscript_algebraic.hpp +++ b/include/chaiscript/language/chaiscript_algebraic.hpp @@ -53,6 +53,11 @@ namespace chaiscript static Opers to_operator(const std::string &t_str, bool t_is_unary = false) { +#ifdef CHAISCRIPT_MSVC +#pragma warning(push) +#pragma warning(disable : 4307) +#endif + const auto op_hash = utility::fnv1a_32(t_str.c_str()); switch (op_hash) { case utility::fnv1a_32("=="): { return Opers::equals; } @@ -86,6 +91,10 @@ namespace chaiscript case utility::fnv1a_32("*"): { return Opers::product; } default: { return Opers::invalid; } } +#ifdef CHAISCRIPT_MSVC +#pragma warning(pop) +#endif + } }; diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 8116c83..a044155 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -433,13 +433,13 @@ namespace chaiscript try { if (lhs.is_undef()) { - if ((!this->children.empty() + if (!this->children.empty() && ((this->children[0]->identifier == AST_Node_Type::Reference) || (!this->children[0]->children.empty() && this->children[0]->children[0]->identifier == AST_Node_Type::Reference) ) - ) ) + { /// \todo This does not handle the case of an unassigned reference variable /// being assigned outside of its declaration diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index a4199a3..18c4220 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -884,6 +884,11 @@ namespace chaiscript validate_object_name(text); } +#ifdef CHAISCRIPT_MSVC +#pragma warning(push) +#pragma warning(disable : 4307) +#endif + switch (text_hash) { case utility::fnv1a_32("true"): { m_match_stack.push_back(make_node>(std::move(text), start.line, start.col, const_var(true))); @@ -948,6 +953,11 @@ namespace chaiscript } break; } +#ifdef CHAISCRIPT_MSVC +#pragma warning(pop) +#endif + + return true; } else { return false; diff --git a/include/chaiscript/utility/fnv1a.hpp b/include/chaiscript/utility/fnv1a.hpp index fcf9b1e..54378cd 100644 --- a/include/chaiscript/utility/fnv1a.hpp +++ b/include/chaiscript/utility/fnv1a.hpp @@ -7,16 +7,34 @@ #ifndef CHAISCRIPT_UTILITY_FNV1A_HPP_ #define CHAISCRIPT_UTILITY_FNV1A_HPP_ + #include +#include "../chaiscript_defines.hpp" + namespace chaiscript { + + namespace utility { + + static constexpr std::uint32_t fnv1a_32(const char *s, std::uint32_t h = 0x811c9dc5) { +#ifdef CHAISCRIPT_MSVC +#pragma warning(push) +#pragma warning(disable : 4307) +#endif return (*s == 0) ? h : fnv1a_32(s+1, ((h ^ (*s)) * 0x01000193)); +#ifdef CHAISCRIPT_MSVC +#pragma warning(pop) +#endif } + + } + + } #endif