Make stdlib
* Build the standard library as a module .so * Locate and load lib at runtime as a module if it is not provided to the ChaiScript constructor. Decreases compile time by 1/2 for common use cases where the user can use the dynamic library module.
This commit is contained in:
parent
a3e299fe1b
commit
4ebfe264e9
@ -103,8 +103,12 @@ if (CMAKE_COMPILER_2005)
|
|||||||
# ADD_DEFINITIONS(/wd4244)
|
# ADD_DEFINITIONS(/wd4244)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_library(chaiscript_stdlib MODULE src/chaiscript_stdlib.cpp)
|
||||||
|
target_link_libraries(chaiscript_stdlib ${LIBS} ${EXTRA_LINKER_FLAGS})
|
||||||
|
|
||||||
add_executable(chai src/main.cpp ${Chai_INCLUDES})
|
add_executable(chai src/main.cpp ${Chai_INCLUDES})
|
||||||
target_link_libraries(chai ${LIBS} ${EXTRA_LINKER_FLAGS})
|
target_link_libraries(chai ${LIBS} ${EXTRA_LINKER_FLAGS})
|
||||||
|
add_dependencies(chai chaiscript_stdlib)
|
||||||
|
|
||||||
if (BUILD_SAMPLES)
|
if (BUILD_SAMPLES)
|
||||||
add_executable(example samples/example.cpp)
|
add_executable(example samples/example.cpp)
|
||||||
|
@ -752,13 +752,9 @@
|
|||||||
#include "dispatchkit/dynamic_object.hpp"
|
#include "dispatchkit/dynamic_object.hpp"
|
||||||
#include "dispatchkit/boxed_number.hpp"
|
#include "dispatchkit/boxed_number.hpp"
|
||||||
|
|
||||||
#ifdef CHAISCRIPT_HAS_DECLSPEC
|
|
||||||
#define CHAISCRIPT_MODULE_EXPORT extern "C" __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define CHAISCRIPT_MODULE_EXPORT extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "language/chaiscript_eval.hpp"
|
#include "language/chaiscript_eval.hpp"
|
||||||
#include "language/chaiscript_engine.hpp"
|
#include "language/chaiscript_engine.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* CHAISCRIPT_HPP_ */
|
#endif /* CHAISCRIPT_HPP_ */
|
||||||
|
@ -16,5 +16,13 @@
|
|||||||
#define CHAISCRIPT_WINDOWS
|
#define CHAISCRIPT_WINDOWS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CHAISCRIPT_HAS_DECLSPEC
|
||||||
|
#define CHAISCRIPT_MODULE_EXPORT extern "C" __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define CHAISCRIPT_MODULE_EXPORT extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#ifndef CHAISCRIPT_STDLIB_HPP_
|
#ifndef CHAISCRIPT_STDLIB_HPP_
|
||||||
#define CHAISCRIPT_STDLIB_HPP_
|
#define CHAISCRIPT_STDLIB_HPP_
|
||||||
|
|
||||||
|
#include "chaiscript_defines.hpp"
|
||||||
#include "dispatchkit/bootstrap.hpp"
|
#include "dispatchkit/bootstrap.hpp"
|
||||||
#include "dispatchkit/bootstrap_stl.hpp"
|
#include "dispatchkit/bootstrap_stl.hpp"
|
||||||
|
|
||||||
|
@ -325,7 +325,10 @@ namespace chaiscript
|
|||||||
m_engine.add_reserved_word("false");
|
m_engine.add_reserved_word("false");
|
||||||
m_engine.add_reserved_word("_");
|
m_engine.add_reserved_word("_");
|
||||||
|
|
||||||
|
if (t_lib)
|
||||||
|
{
|
||||||
add(t_lib);
|
add(t_lib);
|
||||||
|
}
|
||||||
|
|
||||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_system, std::ref(m_engine)), "dump_system");
|
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_system, std::ref(m_engine)), "dump_system");
|
||||||
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_object, std::ref(m_engine)), "dump_object");
|
m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::dump_object, std::ref(m_engine)), "dump_object");
|
||||||
@ -399,6 +402,71 @@ namespace chaiscript
|
|||||||
build_eval_system(t_lib);
|
build_eval_system(t_lib);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \brief Constructor for ChaiScript.
|
||||||
|
///
|
||||||
|
/// This version of the ChaiScript constructor attempts to find the stdlib module to load
|
||||||
|
/// at runtime generates an error if it cannot be found.
|
||||||
|
///
|
||||||
|
/// \param[in] t_modulepaths Vector of paths to search when attempting to load a binary module
|
||||||
|
/// \param[in] t_usepaths Vector of paths to search when attempting to "use" an included ChaiScript file
|
||||||
|
ChaiScript( const std::vector<std::string> &t_modulepaths = std::vector<std::string>(),
|
||||||
|
const std::vector<std::string> &t_usepaths = std::vector<std::string>())
|
||||||
|
: m_modulepaths(t_modulepaths), m_usepaths(t_usepaths)
|
||||||
|
{
|
||||||
|
if (m_modulepaths.empty())
|
||||||
|
{
|
||||||
|
m_modulepaths.push_back("");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_usepaths.empty())
|
||||||
|
{
|
||||||
|
m_usepaths.push_back("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _POSIX_VERSION
|
||||||
|
// If on Unix, add the path of the current executable to the module search path
|
||||||
|
// as windows would do
|
||||||
|
|
||||||
|
union cast_union
|
||||||
|
{
|
||||||
|
void (ChaiScript::*in_ptr)(const std::string&);
|
||||||
|
void *out_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
Dl_info rInfo;
|
||||||
|
memset( &rInfo, 0, sizeof(rInfo) );
|
||||||
|
cast_union u;
|
||||||
|
u.in_ptr = &ChaiScript::use;
|
||||||
|
if ( dladdr((void*)(u.out_ptr), &rInfo) && rInfo.dli_fname ) {
|
||||||
|
std::string dllpath(rInfo.dli_fname);
|
||||||
|
size_t lastslash = dllpath.rfind('/');
|
||||||
|
if (lastslash != std::string::npos)
|
||||||
|
{
|
||||||
|
dllpath.erase(lastslash);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's see if this is a link that we should expand
|
||||||
|
std::vector<char> buf(2048);
|
||||||
|
size_t pathlen = readlink(dllpath.c_str(), &buf.front(), buf.size());
|
||||||
|
if (pathlen > 0 && pathlen < buf.size())
|
||||||
|
{
|
||||||
|
dllpath = std::string(&buf.front(), pathlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_modulepaths.push_back(dllpath+"/");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// attempt to load the stdlib
|
||||||
|
load_module("chaiscript_stdlib");
|
||||||
|
|
||||||
|
build_eval_system(ModulePtr());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// \brief Loads and parses a file. If the file is already, it is not reloaded
|
/// \brief Loads and parses a file. If the file is already, it is not reloaded
|
||||||
/// The use paths specified at ChaiScript construction time are searched for the
|
/// The use paths specified at ChaiScript construction time are searched for the
|
||||||
/// requested file.
|
/// requested file.
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
#define _CRT_SECURE_NO_WARNINGS
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#include <chaiscript/chaiscript.hpp>
|
#include <chaiscript/chaiscript.hpp>
|
||||||
#include <chaiscript/chaiscript_stdlib.hpp>
|
|
||||||
|
|
||||||
#ifdef READLINE_AVAILABLE
|
#ifdef READLINE_AVAILABLE
|
||||||
#include <readline/readline.h>
|
#include <readline/readline.h>
|
||||||
@ -177,7 +176,7 @@ int main(int argc, char *argv[])
|
|||||||
modulepaths.push_back(modulepath);
|
modulepaths.push_back(modulepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
chaiscript::ChaiScript chai(chaiscript::Std_Lib::library(), modulepaths,usepaths);
|
chaiscript::ChaiScript chai(modulepaths,usepaths);
|
||||||
|
|
||||||
chai.add(chaiscript::fun(&myexit), "exit");
|
chai.add(chaiscript::fun(&myexit), "exit");
|
||||||
chai.add(chaiscript::fun(&myexit), "quit");
|
chai.add(chaiscript::fun(&myexit), "quit");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user