mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2025-12-06 16:57:04 +08:00
parent
be8726b41a
commit
eb93760f1b
@ -170,6 +170,10 @@ endif()
|
|||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions(/W4 /w14545 /w34242 /w34254 /w34287 /w44263 /w44265 /w44296 /w44311 /w44826 /we4289 /w14546 /w14547 /w14549 /w14555 /w14619 /w14905 /w14906 /w14928)
|
add_definitions(/W4 /w14545 /w34242 /w34254 /w34287 /w44263 /w44265 /w44296 /w44311 /w44826 /we4289 /w14546 /w14547 /w14549 /w14555 /w14619 /w14905 /w14906 /w14928)
|
||||||
|
|
||||||
|
if (BUILD_IN_CPP17_MODE)
|
||||||
|
add_definitions(/std:c++17)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (MSVC_VERSION STREQUAL "1800")
|
if (MSVC_VERSION STREQUAL "1800")
|
||||||
# VS2013 doesn't have magic statics
|
# VS2013 doesn't have magic statics
|
||||||
add_definitions(/w44640)
|
add_definitions(/w44640)
|
||||||
|
|||||||
@ -170,7 +170,7 @@ namespace chaiscript {
|
|||||||
auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type
|
auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type
|
||||||
{
|
{
|
||||||
T t = 0;
|
T t = 0;
|
||||||
T base;
|
T base{};
|
||||||
T decimal_place = 0;
|
T decimal_place = 0;
|
||||||
int exponent = 0;
|
int exponent = 0;
|
||||||
|
|
||||||
|
|||||||
@ -86,7 +86,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
// only compile this bit if noexcept is part of the type system
|
// only compile this bit if noexcept is part of the type system
|
||||||
//
|
//
|
||||||
#if __cpp_noexcept_function_type >= 201510
|
#if __cpp_noexcept_function_type >= 201510 || (_MSVC_LANG > 201403L && _MSC_VER >= 1912)
|
||||||
template<typename Ret, typename ... Param>
|
template<typename Ret, typename ... Param>
|
||||||
Proxy_Function fun(Ret (*func)(Param...) noexcept)
|
Proxy_Function fun(Ret (*func)(Param...) noexcept)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -54,8 +54,8 @@
|
|||||||
#include "../dispatchkit/exception_specification.hpp"
|
#include "../dispatchkit/exception_specification.hpp"
|
||||||
|
|
||||||
namespace chaiscript
|
namespace chaiscript
|
||||||
{
|
{
|
||||||
/// Namespace alias to provide cleaner and more explicit syntax to users.
|
/// Namespace alias to provide cleaner and more explicit syntax to users.
|
||||||
using Namespace = dispatch::Dynamic_Object;
|
using Namespace = dispatch::Dynamic_Object;
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
@ -200,7 +200,7 @@ namespace chaiscript
|
|||||||
m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ add_global(t_bv, t_name); }), "add_global");
|
m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ add_global(t_bv, t_name); }), "add_global");
|
||||||
m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ set_global(t_bv, t_name); }), "set_global");
|
m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ set_global(t_bv, t_name); }), "set_global");
|
||||||
|
|
||||||
m_engine.add(fun([this](const std::string& t_namespace_name) { register_namespace([](Namespace& space) {}, t_namespace_name); import(t_namespace_name); }), "namespace");
|
m_engine.add(fun([this](const std::string& t_namespace_name) { register_namespace([](Namespace& /*space*/) {}, t_namespace_name); import(t_namespace_name); }), "namespace");
|
||||||
m_engine.add(fun([this](const std::string& t_namespace_name) { import(t_namespace_name); }), "import");
|
m_engine.add(fun([this](const std::string& t_namespace_name) { import(t_namespace_name); }), "import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,39 +711,39 @@ explicit ChaiScript_Basic(std::unique_ptr<parser::ChaiScript_Parser_Base> &&pars
|
|||||||
return m_engine.boxed_cast<T>(eval_file(t_filename, t_handler));
|
return m_engine.boxed_cast<T>(eval_file(t_filename, t_handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Imports a namespace object into the global scope of this ChaiScript instance.
|
/// \brief Imports a namespace object into the global scope of this ChaiScript instance.
|
||||||
/// \param[in] t_namespace_name Name of the namespace to import.
|
/// \param[in] t_namespace_name Name of the namespace to import.
|
||||||
/// \throw std::runtime_error In the case that the namespace name was never registered.
|
/// \throw std::runtime_error In the case that the namespace name was never registered.
|
||||||
void import(const std::string& t_namespace_name)
|
void import(const std::string& t_namespace_name)
|
||||||
{
|
{
|
||||||
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> l(m_use_mutex);
|
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> l(m_use_mutex);
|
||||||
|
|
||||||
if (m_engine.get_scripting_objects().count(t_namespace_name)) {
|
if (m_engine.get_scripting_objects().count(t_namespace_name)) {
|
||||||
throw std::runtime_error("Namespace: " + t_namespace_name + " was already defined");
|
throw std::runtime_error("Namespace: " + t_namespace_name + " was already defined");
|
||||||
}
|
}
|
||||||
else if (m_namespace_generators.count(t_namespace_name)) {
|
else if (m_namespace_generators.count(t_namespace_name)) {
|
||||||
m_engine.add_global(var(std::ref(m_namespace_generators[t_namespace_name]())), t_namespace_name);
|
m_engine.add_global(var(std::ref(m_namespace_generators[t_namespace_name]())), t_namespace_name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw std::runtime_error("No registered namespace: " + t_namespace_name);
|
throw std::runtime_error("No registered namespace: " + t_namespace_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Registers a namespace generator, which delays generation of the namespace until it is imported, saving memory if it is never used.
|
/// \brief Registers a namespace generator, which delays generation of the namespace until it is imported, saving memory if it is never used.
|
||||||
/// \param[in] t_namespace_generator Namespace generator function.
|
/// \param[in] t_namespace_generator Namespace generator function.
|
||||||
/// \param[in] t_namespace_name Name of the Namespace function being registered.
|
/// \param[in] t_namespace_name Name of the Namespace function being registered.
|
||||||
/// \throw std::runtime_error In the case that the namespace name was already registered.
|
/// \throw std::runtime_error In the case that the namespace name was already registered.
|
||||||
void register_namespace(const std::function<void(Namespace&)>& t_namespace_generator, const std::string& t_namespace_name)
|
void register_namespace(const std::function<void(Namespace&)>& t_namespace_generator, const std::string& t_namespace_name)
|
||||||
{
|
{
|
||||||
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> l(m_use_mutex);
|
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> l(m_use_mutex);
|
||||||
|
|
||||||
if (!m_namespace_generators.count(t_namespace_name)) {
|
if (!m_namespace_generators.count(t_namespace_name)) {
|
||||||
// contain the namespace object memory within the m_namespace_generators map
|
// contain the namespace object memory within the m_namespace_generators map
|
||||||
m_namespace_generators.emplace(std::make_pair(t_namespace_name, [=, space = Namespace()]() mutable -> Namespace& { t_namespace_generator(space); return space; }));
|
m_namespace_generators.emplace(std::make_pair(t_namespace_name, [=, space = Namespace()]() mutable -> Namespace& { t_namespace_generator(space); return space; }));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw std::runtime_error("Namespace: " + t_namespace_name + " was already registered.");
|
throw std::runtime_error("Namespace: " + t_namespace_name + " was already registered.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user