From aef99bd63fde958f08e3a69668741107735a339c Mon Sep 17 00:00:00 2001 From: Sylvain Corlay Date: Tue, 4 Apr 2023 21:27:25 +0200 Subject: [PATCH] First functional kernel based on clang-repl --- .gitignore | 3 + CMakeLists.txt | 31 +- README.md | 4 +- environment-dev.yml | 4 + include/xcpp/xdisplay.hpp | 61 ++ include/xcpp/xmime.hpp | 47 ++ include/xeus-cpp/xbuffer.hpp | 128 +++++ include/xeus-cpp/xeus_cpp_config.hpp | 14 +- include/xeus-cpp/xholder.hpp | 58 ++ include/xeus-cpp/xinterpreter.hpp | 73 ++- include/xeus-cpp/xmagics.hpp | 42 ++ include/xeus-cpp/xmanager.hpp | 201 +++++++ include/xeus-cpp/xoptions.hpp | 29 + include/xeus-cpp/xpreamble.hpp | 37 ++ notebooks/images/marie.png | Bin 0 -> 108937 bytes notebooks/images/xeus-cling.png | Bin 0 -> 15954 bytes notebooks/images/xtensor.png | Bin 0 -> 16748 bytes notebooks/xeus-cpp.ipynb | 118 +++- share/jupyter/kernels/xcpp/logo-32x32.png | Bin 1202 -> 1520 bytes share/jupyter/kernels/xcpp/logo-64x64.png | Bin 2479 -> 3113 bytes share/jupyter/kernels/xcpp/logo-svg.svg | 25 + share/jupyter/kernels/xcpp/xeus_small.svg | 54 -- src/main.cpp | 104 ++-- src/main_emscripten_kernel.cpp | 3 +- src/xdemangle.hpp | 75 +++ src/xholder.cpp | 85 +++ src/xinput.cpp | 49 ++ src/xinput.hpp | 37 ++ src/xinspect.hpp | 348 ++++++++++++ src/xinterpreter.cpp | 659 ++++++++++++++++++---- src/xmagics/os.cpp | 80 +++ src/xmagics/os.hpp | 31 + src/xoptions.cpp | 46 ++ src/xparser.cpp | 29 + src/xparser.hpp | 19 + src/xsystem.hpp | 79 +++ test/test_xcpp_kernel.py | 77 +-- 37 files changed, 2357 insertions(+), 293 deletions(-) create mode 100644 include/xcpp/xdisplay.hpp create mode 100644 include/xcpp/xmime.hpp create mode 100644 include/xeus-cpp/xbuffer.hpp create mode 100644 include/xeus-cpp/xholder.hpp create mode 100644 include/xeus-cpp/xmagics.hpp create mode 100644 include/xeus-cpp/xmanager.hpp create mode 100644 include/xeus-cpp/xoptions.hpp create mode 100644 include/xeus-cpp/xpreamble.hpp create mode 100644 notebooks/images/marie.png create mode 100644 notebooks/images/xeus-cling.png create mode 100644 notebooks/images/xtensor.png create mode 100644 share/jupyter/kernels/xcpp/logo-svg.svg delete mode 100644 share/jupyter/kernels/xcpp/xeus_small.svg create mode 100644 src/xdemangle.hpp create mode 100644 src/xholder.cpp create mode 100644 src/xinput.cpp create mode 100644 src/xinput.hpp create mode 100644 src/xinspect.hpp create mode 100644 src/xmagics/os.cpp create mode 100644 src/xmagics/os.hpp create mode 100644 src/xoptions.cpp create mode 100644 src/xparser.cpp create mode 100644 src/xparser.hpp create mode 100644 src/xsystem.hpp diff --git a/.gitignore b/.gitignore index 799df2a5..cf893f62 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,9 @@ # Jupyter .ipynb_checkpoints/ +# Python +__pycache__/ + # Generated kernelspec share/jupyter/kernels/xcpp/kernel.json diff --git a/CMakeLists.txt b/CMakeLists.txt index f61eae47..c53e0d7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,6 @@ OPTION(XEUS_CPP_USE_SHARED_XEUS_CPP "Link xcpp with the xeus shared library (in OPTION(XEUS_CPP_EMSCRIPTEN_WASM_BUILD "Build for wasm with emscripten" OFF) - if(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) add_compile_definitions(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) message("Build with emscripten") @@ -106,6 +105,9 @@ if(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) set(EMSCRIPTEN_FEATURES "${EMSCRIPTEN_FEATURES} -s \"EXTRA_EXPORTED_RUNTIME_METHODS=[ENV']\"") endif() +find_package(Clang REQUIRED) +find_package(argparse REQUIRED) +find_package(pugixml REQUIRED) # Source files # ============ @@ -116,14 +118,17 @@ set(XEUS_CPP_HEADERS ) set(XEUS_CPP_SRC + src/xholder.cpp + src/xinput.cpp src/xinterpreter.cpp + src/xoptions.cpp + src/xparser.cpp ) set(XEUS_CPP_MAIN_SRC src/main.cpp ) - # Targets and link - Macros # ========================= @@ -170,7 +175,7 @@ macro(xeus_cpp_set_common_options target_name) ) endmacro() -# Common macro kernels (xcpp ) +# Common macro kernels (xcpp) macro(xeus_cpp_set_kernel_options target_name) if (XEUS_CPP_USE_SHARED_XEUS_CPP) target_link_libraries(${target_name} PRIVATE xeus-cpp) @@ -221,7 +226,7 @@ macro(xeus_cpp_create_target target_name linkage output_name) set(XEUS_CPP_XEUS_TARGET xeus-static) endif () - target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} xtl) + target_link_libraries(${target_name} PUBLIC ${XEUS_CPP_XEUS_TARGET} clangInterpreter pugixml argparse::argparse xtl) if (WIN32 OR CYGWIN) # elseif (APPLE) @@ -234,8 +239,20 @@ macro(xeus_cpp_create_target target_name linkage output_name) endmacro() +# xeus-cpp-headers +# ================ + +set(XCPP_HEADERS + include/xcpp/xmime.hpp + include/xcpp/xdisplay.hpp +) +add_library(xeus-cpp-headers INTERFACE) +set_target_properties(xeus-cpp-headers PROPERTIES PUBLIC_HEADER "${XCPP_HEADERS}") + +install(TARGETS xeus-cpp-headers PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/xcpp) + # xeus-cpp -# =========== +# ======== set(XEUS_CPP_TARGETS "") @@ -257,7 +274,8 @@ if (XEUS_CPP_BUILD_STATIC) endif () # xcpp -# ======= +# ==== + if (XEUS_CPP_BUILD_EXECUTABLE) find_package(xeus-zmq 1.0.2 REQUIRED) add_executable(xcpp ${XEUS_CPP_MAIN_SRC}) @@ -277,7 +295,6 @@ if(XEUS_CPP_EMSCRIPTEN_WASM_BUILD) xeus_wasm_link_options(xcpp_wasm "web,worker") endif() - # Installation # ============ include(CMakePackageConfigHelpers) diff --git a/README.md b/README.md index 76634962..fe11a5ae 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ mamba install`xeus-cpp` notebook -c conda-forge Or you can install it from the sources, you will first need to install dependencies ```bash -mamba install cmake cxx-compiler xeus-zmq nlohmann_json cppzmq xtl jupyterlab -c conda-forge +mamba install cmake cxx-compiler xeus-zmq nlohmann_json cppzmq xtl jupyterlab clangdev cpp-argparse -c conda-forge ``` Then you can compile the sources (replace `$CONDA_PREFIX` with a custom installation @@ -72,6 +72,8 @@ http://xeus-cpp.readthedocs.io - [xtl](https://github.com/xtensor-stack/xtl) - [nlohmann_json](https://github.com/nlohmann/json) - [cppzmq](https://github.com/zeromq/cppzmq) +- [clang](https://github.com/llvm/llvm-project/) +- [argparse](https://github.com/p-ranav/argparse) ## Contributing diff --git a/environment-dev.yml b/environment-dev.yml index 6b9278c4..7e3c1888 100644 --- a/environment-dev.yml +++ b/environment-dev.yml @@ -11,6 +11,10 @@ dependencies: - nlohmann_json - cppzmq - xtl + - clangdev >=16 + - pugixml + - cpp-argparse + - zlib # Test dependencies - pytest - jupyter_kernel_test>=0.4.3 diff --git a/include/xcpp/xdisplay.hpp b/include/xcpp/xdisplay.hpp new file mode 100644 index 00000000..1cb1d443 --- /dev/null +++ b/include/xcpp/xdisplay.hpp @@ -0,0 +1,61 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XCPP_DISPLAY_HPP +#define XCPP_DISPLAY_HPP + +#include + +#include "xcpp/xmime.hpp" + +namespace nl = nlohmann; + +namespace xcpp +{ + // Adding a dummy non-template display overload as a workaround to + // Issue https://reviews.llvm.org/D147319 + class dummy_display + { + }; + + void display(dummy_display i) + { + } + + template + void display(const T& t) + { + using ::xcpp::mime_bundle_repr; + xeus::get_interpreter().display_data(mime_bundle_repr(t), nl::json::object(), nl::json::object()); + } + + template + void display(const T& t, xeus::xguid id, bool update = false) + { + nl::json transient; + transient["display_id"] = id; + using ::xcpp::mime_bundle_repr; + if (update) + { + xeus::get_interpreter() + .update_display_data(mime_bundle_repr(t), nl::json::object(), std::move(transient)); + } + else + { + xeus::get_interpreter().display_data(mime_bundle_repr(t), nl::json::object(), std::move(transient)); + } + } + + inline void clear_output(bool wait = false) + { + xeus::get_interpreter().clear_output(wait); + } +} + +#endif diff --git a/include/xcpp/xmime.hpp b/include/xcpp/xmime.hpp new file mode 100644 index 00000000..e849a98d --- /dev/null +++ b/include/xcpp/xmime.hpp @@ -0,0 +1,47 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XCPP_MIME_HPP +#define XCPP_MIME_HPP + +#include + +#include + +namespace nl = nlohmann; + +namespace xcpp +{ + namespace detail + { + // Generic mime_bundle_repr() implementation + // via std::ostringstream. + template + nl::json mime_bundle_repr_via_sstream(const T& value) + { + auto bundle = nl::json::object(); + + std::ostringstream oss; + oss << value; + + bundle["text/plain"] = oss.str(); + return bundle; + } + + } + + // Default implementation of mime_bundle_repr + template + nl::json mime_bundle_repr(const T& value) + { + return detail::mime_bundle_repr_via_sstream(&value); + } +} + +#endif diff --git a/include/xeus-cpp/xbuffer.hpp b/include/xeus-cpp/xbuffer.hpp new file mode 100644 index 00000000..8d46a108 --- /dev/null +++ b/include/xeus-cpp/xbuffer.hpp @@ -0,0 +1,128 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_BUFFER_HPP +#define XEUS_CPP_BUFFER_HPP + +#include +#include +#include +#include +#include + +namespace xcpp +{ + /******************** + * output streambuf * + ********************/ + + class xoutput_buffer : public std::streambuf + { + public: + + using base_type = std::streambuf; + using callback_type = std::function; + using traits_type = base_type::traits_type; + + xoutput_buffer(callback_type callback) + : m_callback(std::move(callback)) + { + } + + protected: + + traits_type::int_type overflow(traits_type::int_type c) override + { + std::lock_guard lock(m_mutex); + // Called for each output character. + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + m_output.push_back(traits_type::to_char_type(c)); + } + return c; + } + + std::streamsize xsputn(const char* s, std::streamsize count) override + { + std::lock_guard lock(m_mutex); + // Called for a string of characters. + m_output.append(s, count); + return count; + } + + traits_type::int_type sync() override + { + std::lock_guard lock(m_mutex); + // Called in case of flush. + if (!m_output.empty()) + { + m_callback(m_output); + m_output.clear(); + } + return 0; + } + + callback_type m_callback; + std::string m_output; + std::mutex m_mutex; + }; + + /******************* + * input streambuf * + *******************/ + + class xinput_buffer : public std::streambuf + { + public: + + using base_type = std::streambuf; + using callback_type = std::function; + using traits_type = base_type::traits_type; + + xinput_buffer(callback_type callback) + : m_callback(std::move(callback)) + , m_value() + { + char* data = const_cast(m_value.data()); + this->setg(data, data, data); + } + + protected: + + traits_type::int_type underflow() override + { + m_callback(m_value); + // Terminate the string to trigger parsing. + m_value += '\n'; + char* data = const_cast(m_value.data()); + setg(data, data, data + m_value.size()); + return traits_type::to_int_type(*gptr()); + } + + callback_type m_callback; + std::string m_value; + }; + + /************************* + * output null streambuf * + *************************/ + + class xnull : public std::streambuf + { + using base_type = std::streambuf; + using traits_type = base_type::traits_type; + + traits_type::int_type overflow(traits_type::int_type c) override + { + return c; + } + }; +} + +#endif diff --git a/include/xeus-cpp/xeus_cpp_config.hpp b/include/xeus-cpp/xeus_cpp_config.hpp index 2c8bdda8..eaa9f02e 100644 --- a/include/xeus-cpp/xeus_cpp_config.hpp +++ b/include/xeus-cpp/xeus_cpp_config.hpp @@ -1,10 +1,10 @@ -/*************************************************************************** - * Copyright (c) 2023, xeus-cpp contributors - * - * Distributed under the terms of the BSD 3-Clause License. - * - * The full license is in the file LICENSE, distributed with this software. - ****************************************************************************/ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ #ifndef XEUS_CPP_CONFIG_HPP #define XEUS_CPP_CONFIG_HPP diff --git a/include/xeus-cpp/xholder.hpp b/include/xeus-cpp/xholder.hpp new file mode 100644 index 00000000..fd36acc2 --- /dev/null +++ b/include/xeus-cpp/xholder.hpp @@ -0,0 +1,58 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_HOLDER_HPP +#define XEUS_CPP_HOLDER_HPP + +#include +#include + +#include + +#include "xpreamble.hpp" + +namespace nl = nlohmann; + +namespace xcpp +{ + class xholder_preamble + { + public: + + xholder_preamble(); + ~xholder_preamble(); + xholder_preamble(const xholder_preamble& rhs); + xholder_preamble(xholder_preamble&& rhs); + xholder_preamble(xpreamble* holder); + + xholder_preamble& operator=(const xholder_preamble& rhs); + xholder_preamble& operator=(xholder_preamble&& rhs); + + xholder_preamble& operator=(xpreamble* holder); + + void swap(xholder_preamble& rhs) + { + std::swap(p_holder, rhs.p_holder); + } + + void apply(const std::string& s, nl::json& kernel_res); + bool is_match(const std::string& s) const; + + template + D& get_cast() + { + return dynamic_cast(*p_holder); + } + + private: + + xpreamble* p_holder; + }; +} +#endif diff --git a/include/xeus-cpp/xinterpreter.hpp b/include/xeus-cpp/xinterpreter.hpp index dc1ec88f..bec47613 100644 --- a/include/xeus-cpp/xinterpreter.hpp +++ b/include/xeus-cpp/xinterpreter.hpp @@ -1,28 +1,30 @@ -/*************************************************************************** - * Copyright (c) 2023, xeus-cpp contributors - * - * Distributed under the terms of the BSD 3-Clause License. - * - * The full license is in the file LICENSE, distributed with this software. - ****************************************************************************/ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ #ifndef XEUS_CPP_INTERPRETER_HPP #define XEUS_CPP_INTERPRETER_HPP -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif - #include +#include #include +#include -#include "nlohmann/json.hpp" +#include -#include "xeus/xinterpreter.hpp" -#include "xeus_cpp_config.hpp" +#include +#include + +#include "xbuffer.hpp" +#include "xeus_cpp_config.hpp" +#include "xmanager.hpp" namespace nl = nlohmann; @@ -32,10 +34,13 @@ namespace xcpp { public: - interpreter(); - virtual ~interpreter() = default; + interpreter(int argc, const char* const* argv); + virtual ~interpreter(); - protected: + void publish_stdout(const std::string&); + void publish_stderr(const std::string&); + + private: void configure_impl() override; @@ -57,11 +62,35 @@ namespace xcpp nl::json kernel_info_request_impl() override; void shutdown_request_impl() override; + + nl::json get_error_reply( + const std::string& ename, + const std::string& evalue, + const std::vector& trace_back + ); + + void redirect_output(); + void restore_output(); + + void init_includes(); + void init_preamble(); + void init_magic(); + + std::string get_stdopt(int argc, const char* const* argv); + + std::unique_ptr m_interpreter; + + std::string m_version; + + xmagics_manager xmagics; + xpreamble_manager preamble_manager; + + std::streambuf* p_cout_strbuf; + std::streambuf* p_cerr_strbuf; + + xoutput_buffer m_cout_buffer; + xoutput_buffer m_cerr_buffer; }; } -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif - #endif diff --git a/include/xeus-cpp/xmagics.hpp b/include/xeus-cpp/xmagics.hpp new file mode 100644 index 00000000..24ac1891 --- /dev/null +++ b/include/xeus-cpp/xmagics.hpp @@ -0,0 +1,42 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_MAGICS_HPP +#define XEUS_CPP_MAGICS_HPP + +#include +#include + +#include "xoptions.hpp" +#include "xpreamble.hpp" + +namespace xcpp +{ + enum struct xmagic_type + { + cell, + line + }; + + struct xmagic_line + { + virtual void operator()(const std::string& line) = 0; + }; + + struct xmagic_cell + { + virtual void operator()(const std::string& line, const std::string& cell) = 0; + }; + + struct xmagic_line_cell : public xmagic_line, + xmagic_cell + { + }; +} +#endif diff --git a/include/xeus-cpp/xmanager.hpp b/include/xeus-cpp/xmanager.hpp new file mode 100644 index 00000000..483c0632 --- /dev/null +++ b/include/xeus-cpp/xmanager.hpp @@ -0,0 +1,201 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_MANAGER_HPP +#define XEUS_CPP_MANAGER_HPP + +#include +#include +#include +#include +#include + +#include + +#include "xholder.hpp" +#include "xmagics.hpp" +#include "xpreamble.hpp" + +namespace nl = nlohmann; + +namespace xcpp +{ + struct xpreamble_manager + { + std::map preamble; + + template + void register_preamble(const std::string& name, preamble_type* pre) + { + preamble[name] = xholder_preamble(pre); + } + + void unregister_preamble(const std::string& name) + { + preamble.erase(name); + } + + xholder_preamble& operator[](const std::string& name) + { + return preamble[name]; + } + }; + + class xmagics_manager : public xpreamble + { + public: + + using xpreamble::pattern; + + xmagics_manager() + { + pattern = R"(^(?:\%{2}|\%)(\w+))"; + } + + template + void register_magic(const std::string& magic_name, xmagic_type magic) + { + auto shared = std::make_shared(magic); + if (std::is_base_of::value) + { + m_magic_line[magic_name] = std::dynamic_pointer_cast(shared); + } + if (std::is_base_of::value) + { + m_magic_cell[magic_name] = std::dynamic_pointer_cast(shared); + } + } + + void unregister_magic(const std::string& magic_name) + { + m_magic_cell.erase(magic_name); + m_magic_line.erase(magic_name); + } + + bool contains(const std::string& magic_name, const xmagic_type type = xmagic_type::cell) + { + if (type == xmagic_type::cell) + { + return m_magic_cell.find(magic_name) != m_magic_cell.end(); + } + if (type == xmagic_type::line) + { + return m_magic_line.find(magic_name) != m_magic_line.end(); + } + return false; + } + + void apply(const std::string& magic_name, const std::string& line, const std::string& cell) + { + if (cell.empty()) + { + std::cerr << "UsageError: %%" << magic_name << " is a cell magic, but the cell body is empty." + << std::endl; + std::cerr << "If you only intend to display %%" << magic_name + << " help, please use a double line break to fill in the cell body."; + if (contains(magic_name, xmagic_type::line)) + { + std::cerr << " Did you mean the line magic %" << magic_name << " (single %)?"; + } + std::cerr << "\n"; + return; + } + try + { + (*m_magic_cell[magic_name])(line, cell); + } + catch (const std::exception& e) + { + std::cerr << e.what() << std::endl; + } + catch (...) + { + std::cerr << "Exception occurred. Recovering...\n"; + } + } + + void apply(const std::string& magic_name, const std::string& line) + { + try + { + (*m_magic_line[magic_name])(line); + } + catch (const std::runtime_error& e) + { + std::cerr << e.what() << std::endl; + } + catch (const std::logic_error& e) + { + std::cerr << e.what() << std::endl; + } + catch (...) + { + std::cerr << "Exception occurred. Recovering...\n"; + } + } + + void apply(const std::string& code, nl::json& kernel_res) override + { + std::regex re_magic_cell(R"(^\%{2}(\w+))"); + std::smatch magic_name; + if (std::regex_search(code, magic_name, re_magic_cell)) + { + if (!contains(magic_name.str(1))) + { + std::cerr << "Unknown magic cell function %%" << magic_name[1] << "\n"; + std::cout << std::flush; + kernel_res["status"] = "error"; + kernel_res["ename"] = "ename"; + kernel_res["evalue"] = "evalue"; + kernel_res["traceback"] = nl::json::array(); + return; + } + std::regex re_magic_cell(R"(^\%{2}(\w+(?:\s.*)?)\n((?:.*\n?)*))"); + std::smatch split_code; + std::regex_search(code, split_code, re_magic_cell); + apply(magic_name[1], split_code[1], split_code[2]); + std::cout << std::flush; + kernel_res["status"] = "ok"; + } + + std::regex re_magic_line(R"(^\%(\w+))"); + if (std::regex_search(code, magic_name, re_magic_line)) + { + if (!contains(magic_name.str(1), xmagic_type::line)) + { + std::cerr << "Unknown magic line function %" << magic_name[1] << "\n"; + std::cout << std::flush; + kernel_res["status"] = "error"; + kernel_res["ename"] = "ename"; + kernel_res["evalue"] = "evalue"; + kernel_res["traceback"] = {}; + return; + } + std::regex re_magic_line(R"(^\%(\w+(?:\s.*)?))"); + std::smatch split_code; + std::regex_search(code, split_code, re_magic_line); + apply(magic_name[1], split_code[1]); + std::cout << std::flush; + kernel_res["status"] = "ok"; + } + } + + virtual xpreamble* clone() const override + { + return new xmagics_manager(*this); + } + + private: + + std::map> m_magic_cell; + std::map> m_magic_line; + }; +} + +#endif diff --git a/include/xeus-cpp/xoptions.hpp b/include/xeus-cpp/xoptions.hpp new file mode 100644 index 00000000..b833b1b1 --- /dev/null +++ b/include/xeus-cpp/xoptions.hpp @@ -0,0 +1,29 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_OPTIONS_HPP +#define XEUS_CPP_OPTIONS_HPP + +#include + +#include + +#include "xeus_cpp_config.hpp" + +namespace xcpp +{ + struct argparser : public argparse::ArgumentParser + { + using base_type = argparse::ArgumentParser; + using base_type::ArgumentParser; + + void parse(const std::string& line); + }; +} +#endif diff --git a/include/xeus-cpp/xpreamble.hpp b/include/xeus-cpp/xpreamble.hpp new file mode 100644 index 00000000..9d6b66ea --- /dev/null +++ b/include/xeus-cpp/xpreamble.hpp @@ -0,0 +1,37 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_PREAMBLE_HPP +#define XEUS_CPP_PREAMBLE_HPP + +#include +#include + +#include "nlohmann/json.hpp" + +namespace nl = nlohmann; + +namespace xcpp +{ + struct xpreamble + { + std::regex pattern; + + bool is_match(const std::string& s) const + { + std::smatch match; + return std::regex_search(s, match, pattern); + } + + virtual void apply(const std::string& s, nl::json& kernel_res) = 0; + virtual xpreamble* clone() const = 0; + virtual ~xpreamble(){}; + }; +} +#endif diff --git a/notebooks/images/marie.png b/notebooks/images/marie.png new file mode 100644 index 0000000000000000000000000000000000000000..faf5fea63ec694f4d5abaa2044a585fb56ee475b GIT binary patch literal 108937 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 R5sv@>002ovPDHLkV1i_`mw*5O literal 0 HcmV?d00001 diff --git a/notebooks/images/xeus-cling.png b/notebooks/images/xeus-cling.png new file mode 100644 index 0000000000000000000000000000000000000000..0323f483350b71094ce78d7867a17239d3f818ee GIT binary patch literal 15954 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 O4amP%kuH%m4g5dlTzyOc literal 0 HcmV?d00001 diff --git a/notebooks/images/xtensor.png b/notebooks/images/xtensor.png new file mode 100644 index 0000000000000000000000000000000000000000..f52c74002c72e1ff9587eff95d6ddf774c354e26 GIT binary patch literal 16748 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 literal 0 HcmV?d00001 diff --git a/notebooks/xeus-cpp.ipynb b/notebooks/xeus-cpp.ipynb index 3f47e234..5c03fa01 100644 --- a/notebooks/xeus-cpp.ipynb +++ b/notebooks/xeus-cpp.ipynb @@ -5,7 +5,7 @@ "metadata": {}, "source": [ "
\n", - "

cpp kernel based on xeus

\n", + "

C++ kernel based on xeus

\n", "
" ] }, @@ -18,24 +18,124 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello, world\n" + ] + } + ], + "source": [ + "#include \n", + "\n", + "std::cout << \"hello, world\" << std::endl;" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#include \n", + "#include \n", + "\n", + "#include \"nlohmann/json.hpp\"\n", + "\n", + "#include \"xtl/xbase64.hpp\"\n", + "\n", + "namespace nl = nlohmann;\n", + "\n", + "namespace im\n", + "{\n", + " struct image\n", + " { \n", + " inline image(const std::string& filename)\n", + " {\n", + " std::ifstream fin(filename, std::ios::binary); \n", + " m_buffer << fin.rdbuf();\n", + " }\n", + " \n", + " std::stringstream m_buffer;\n", + " };\n", + " \n", + " nl::json mime_bundle_repr(const image& i)\n", + " {\n", + " auto bundle = nl::json::object();\n", + " bundle[\"image/png\"] = xtl::base64encode(i.m_buffer.str());\n", + " return bundle;\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "im::image marie(\"images/marie.png\");" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "a = 3" + "#include \"xcpp/xdisplay.hpp\"" ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xcpp::display(marie);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 14 (xcpp)", - "language": "x-c++src", + "display_name": "C++ 14 (xcpp)", + "language": "cpp", "name": "xcpp" }, "language_info": { - "file_extension": "cpp", - "mimetype": "x-c++src", - "name": "xcpp", + "codemirror_mode": "text/x-c++src", + "file_extension": ".cpp", + "mimetype": "text/x-c++src", + "name": "c++", "version": "14" } }, diff --git a/share/jupyter/kernels/xcpp/logo-32x32.png b/share/jupyter/kernels/xcpp/logo-32x32.png index 933825e3fbb29be6d65330222435d7485cf43f3b..c09c458544bb83b9e3ff4d38f5758bda10ceebe8 100644 GIT binary patch delta 1467 zcmV;s1w{I?3GfS$Bq9WJLP=Bz2nYy#2xN!=000SaNLh0L00Bt=00Bt>L_FBfkv1oP z1#L-0K~z|Ut(R+1lw}mhf6u%763Z$#l~4*&L9|8_oH9c))2YeCsWF{ux|k+4))>`f zj+1!di&IS(aK;ELYw|L~OnvC0l61ks3o346fp`H$NMM0omj!m;_kH@H6w9)^K>k0T z=Y7uqf1dN4=RHR-3_SCt%^Kb<)&MVm0pU`Jow~`p;q&F`EkpGshPq+J$F?j*p#Vfu zzoiafOL({C!-CZ*JvUrHcA+g@3gsh^vqQM71zs=8p8DMl5s+PYY_y@M>xC3A1E#?^ zy^aH5

F3KRqk~*@eecDb!UUHUp7EAnpsV6mpwpHa6^dKCNTW0!c z3P700l@N&BY!bZs@c2QK!?lxoYtaNoTK+psDY4rwHXi({i@J%I<|iTq-WG@J;Lh?B;^?`COewFIvT-em0rL%iFyZD1GE)5` z@AeoRtZC!y-<<#?jkYj5HI~Q-Uw67;ILoSQ?bVI#nSnTh3V0+f&aX}z+PcZ#S4T&u z_g`COos*JNt-LrdktqoyXmNVH?|fTz?!E6TCllfg2`C^uOkv8n5k5ALX0Ua?FL^KA zJv!TdtaGQ2w_aYgqb#w1t4Et0j5wr#q)`^kCg1oEpY5Q{JemPOq(x;-)>PVDJqX~ysm9;}LP1KJj#d46{$$PBXd+{OG}N1hhDC2nuMZ^0r;k(9>6CBLI}SUD1ijjw|1fF zz7Og>$T8fy&`(a0d|+4^C1r^pxbNk z*JYQFO*JdZS8Eo3#@{l=zp`RSS}4w45|Q`x?36#ZJgPh~V{COG-+dtfR%}0=tQdN2 z|Hb5ZOWT_ZlVkh;c&@rVY~NeSZ&eoom@#QA%O9Ffe5`NTmYurjT$2Bjy}45#@5d}z z$etIz4|E5-jV-N*zWDk`T8!yIRxU{QSsWP=#%qgb^4j8mnV|xVY^`sIz+^s1)Tld9 zl-T|sm;p?>A?5WbU2gZGAIi!T98TAL0IwA6BY9jbbEn@Hip&RR8tgp2sTe~_GnzLO z`;~SgtmRlEX96Y^DdGAZ@Pv)Htm)c`((;O5*weLL*~>(2Ks@X zsBPlC;=}Cur3x9eBVjY8xf^^10L;xx#Uw+vWO30}X5D@Zw~mPd!Ax1OKAjKP$uD>y( znI9h9l!Y$x5!}{qr2`?hV2=8by{m8haOx}KT`PLm8U!x_;UIURsvFq5Zph>LKb687 VXTZG<3Wopy002ovPDHLkV1nVN#?=4- delta 1146 zcmV-=1cm$X3$h82BoYa5NLh0L00Srh00SriZ)uy6kwzzf1V2ecK~z|Uy_aohR%IB+ zfB*ZOxw5p;5JgS;U@uZ+hGgh+ds<*)&f%hk+6!q(C795Q6%_^2hr|*K(uGP8L?*NO zEX!(pp0;UQSp-p#SdV|q1lY4j6=w_WxV_7KxNU{p5@TcorWEE;;6%&1KJR6k+)facnMTE!sL^Z zTbZgT+S{{ITH96_g_+wWKTRdcX6s&$5nnl6oe}>I5SuG-umNo5u%h9xd{CaQoPPu$ zQQuVVjVFZ`0fE7(z5uE;qBoB=bouw}h@6mt&0Eh*k>Moc4X>!}L zO*h!oxTLrd;4B?Ag4+i34h{eqddPdO2atTy#4lOo|9ZYNcoiT~-?9X>Vkq;F0DwTx zc+)t4nVDo88DbO$9`xup)$=<`YugIV?2=u(6aW%49Ckl|jAMq?4C*!8lCCIf0f_R> zZvm!^7y!Ub%e{gd0OYiHz)?tla4vospg7rFAy}SG?W_P0BKGUexO|XNn8mD4S10~0 z*^?^her&T+b^w6HR4J&2u2JCay*_+fzpgBQ`Vv54xCNLt>Hq-d{j$h23xH5{-J|%+ zqRflX^`|IGn2QClC4TFO`I;-lPd70L2uB}0RYUH?qe+n@Xp#& zix=((APhDOrj9uPfJC*NyY9v*R~!K--rG_JdU!ash6Mm%o})E$=VmIBhsHbS=M1-h z&hP+CAEXv{o$sgVxEc7~%zyTO0kj8E-a3GiPn+)vab4dE&h0dGYRmy7t!b#5cd~3> z>qI;?$euGv4m*SQo5vJD;=|P9qFR8CIP(^8jTy7e>n;En@U4u`#|q#?-g(#6`ugU( z1&{QCnXQ%A)d1eH1GCd(0ANpiQMKTI@3MWZ6V2ETsP~e{H^=(kQAk;jBD>R2>`GTG z+zrqfN1FsQ`gx4m=1BlZ){59aS^y`)IBzXLBH2_5wrVh=jHifPA%Mkf2mTo`fJ|!| zD(^U6wy$-fM?2`-`hI5eE#z5~Qp``FOpFgY@|qQ=-1*O}rglk*u|`V&M;6yG@Du1IrBC3QWi~{6Y|pIot+_f9qL` zj0u4;-EfmGXlu!yQ~_b$17ME>H;p8?zx18NCvn7&LFi+EIJW%%06-bbgd`UBA^-pY M07*qoM6N<$g1uiVmjD0& diff --git a/share/jupyter/kernels/xcpp/logo-64x64.png b/share/jupyter/kernels/xcpp/logo-64x64.png index 08fa7cc2326e7779a969b888f7ee6040f663a5ee..396c24463156c7b2c5cb48a9e1b8919c4a808607 100644 GIT binary patch delta 3072 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 diff --git a/share/jupyter/kernels/xcpp/logo-svg.svg b/share/jupyter/kernels/xcpp/logo-svg.svg new file mode 100644 index 00000000..4c4b9645 --- /dev/null +++ b/share/jupyter/kernels/xcpp/logo-svg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/share/jupyter/kernels/xcpp/xeus_small.svg b/share/jupyter/kernels/xcpp/xeus_small.svg deleted file mode 100644 index d33974f5..00000000 --- a/share/jupyter/kernels/xcpp/xeus_small.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - diff --git a/src/main.cpp b/src/main.cpp index 6fccd9de..8ebd0611 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,40 +1,40 @@ -/*************************************************************************** - * Copyright (c) 2023, xeus-cpp contributors - * - * Distributed under the terms of the BSD 3-Clause License. - * - * The full license is in the file LICENSE, distributed with this software. +/**************************************************************************** + * Copyright (c) 2023, xeus-cpp contributors * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * ****************************************************************************/ -#include -#include +#include +#include #include #include +#include + #ifdef __GNUC__ #include -#include #include #include #include #endif -#include "xeus-zmq/xserver_zmq.hpp" -#include "xeus/xkernel.hpp" -#include "xeus/xkernel_configuration.hpp" +#include +#include +#include #include "xeus-cpp/xeus_cpp_config.hpp" #include "xeus-cpp/xinterpreter.hpp" - #ifdef __GNUC__ void handler(int sig) { void* array[10]; // get void*'s for all entries on the stack - size_t size = backtrace(array, 10); + std::size_t size = backtrace(array, 10); // print out all the frames to stderr fprintf(stderr, "Error: signal %d:\n", sig); @@ -43,6 +43,11 @@ void handler(int sig) } #endif +void stop_handler(int /*sig*/) +{ + exit(0); +} + bool should_print_version(int argc, char* argv[]) { for (int i = 0; i < argc; ++i) @@ -74,6 +79,26 @@ std::string extract_filename(int argc, char* argv[]) return res; } +using interpreter_ptr = std::unique_ptr; + +interpreter_ptr build_interpreter(int argc, char** argv) +{ + int interpreter_argc = argc; // + 1; // ... + const char** interpreter_argv = new const char*[interpreter_argc]; + interpreter_argv[0] = "xeus-cpp"; + // Copy all arguments in the new array excepting the process name. + for (int i = 1; i < argc; i++) + { + interpreter_argv[i] = argv[i]; + } + // std::string include_dir = std::string(LLVM_DIR) + std::string("/include"); // ... + // interpreter_argv[interpreter_argc - 1] = include_dir.c_str(); // ... + + interpreter_ptr interp_ptr = interpreter_ptr(new xcpp::interpreter(interpreter_argc, interpreter_argv)); + delete[] interpreter_argv; + return interp_ptr; +} + int main(int argc, char* argv[]) { if (should_print_version(argc, argv)) @@ -85,8 +110,8 @@ int main(int argc, char* argv[]) // If we are called from the Jupyter launcher, silence all logging. This // is important for a JupyterHub configured with cleanup_servers = False: // Upon restart, spawned single-user servers keep running but without the - // std* streams. When a user then tries to start a new kernel, xcpp - // will get a SIGPIPE and exit. + // std* streams. When a user then tries to start a new kernel, xeus-cpp + // will get a SIGPIPE when writing to any of these and exit. if (std::getenv("JPY_PARENT_PID") != NULL) { std::clog.setstate(std::ios_base::failbit); @@ -96,43 +121,59 @@ int main(int argc, char* argv[]) #ifdef __GNUC__ std::clog << "registering handler for SIGSEGV" << std::endl; signal(SIGSEGV, handler); -#endif - auto context = xeus::make_context(); + // Registering SIGINT and SIGKILL handlers + signal(SIGKILL, stop_handler); +#endif + signal(SIGINT, stop_handler); - // Instantiating the xeus xinterpreter - using interpreter_ptr = std::unique_ptr; - interpreter_ptr interpreter = interpreter_ptr(new xcpp::interpreter()); + std::string file_name = extract_filename(argc, argv); + interpreter_ptr interpreter = build_interpreter(argc, argv); - std::string connection_filename = extract_filename(argc, argv); + auto context = xeus::make_context(); - if (!connection_filename.empty()) + if (!file_name.empty()) { - xeus::xconfiguration config = xeus::load_configuration(connection_filename); + xeus::xconfiguration config = xeus::load_configuration(file_name); + xeus::xkernel kernel( config, xeus::get_user_name(), std::move(context), std::move(interpreter), - xeus::make_xserver_zmq + xeus::make_xserver_zmq, + xeus::make_in_memory_history_manager(), + xeus::make_console_logger( + xeus::xlogger::msg_type, + xeus::make_file_logger(xeus::xlogger::content, "xeus.log") + ) ); - std::cout << "Starting xcpp kernel...\n\n" + std::clog << "Starting xcpp kernel...\n\n" "If you want to connect to this kernel from an other client, you can use" " the " - + connection_filename + " file." + + file_name + " file." << std::endl; kernel.start(); } else { - xeus::xkernel - kernel(xeus::get_user_name(), std::move(context), std::move(interpreter), xeus::make_xserver_zmq); + xeus::xkernel kernel( + xeus::get_user_name(), + std::move(context), + std::move(interpreter), + xeus::make_xserver_zmq, + xeus::make_in_memory_history_manager(), + xeus::make_console_logger( + xeus::xlogger::msg_type, + xeus::make_file_logger(xeus::xlogger::content, "xeus.log") + ) + ); const auto& config = kernel.get_config(); - std::cout << "Starting xcpp kernel...\n\n" + std::clog << "Starting xcpp kernel...\n\n" "If you want to connect to this kernel from an other client, just copy" " and paste the following content inside of a `kernel.json` file. And then run for example:\n\n" "# jupyter console --existing kernel.json\n\n" @@ -164,8 +205,7 @@ int main(int argc, char* argv[]) " \"key\": \"" + config.m_key + "\"\n" - "}\n```" - << std::endl; + "}\n```\n"; kernel.start(); } diff --git a/src/main_emscripten_kernel.cpp b/src/main_emscripten_kernel.cpp index e72cdd25..200a58e3 100644 --- a/src/main_emscripten_kernel.cpp +++ b/src/main_emscripten_kernel.cpp @@ -11,8 +11,9 @@ #include +#include + #include "xeus-cpp/xinterpreter.hpp" -#include "xeus/xembind.hpp" EMSCRIPTEN_BINDINGS(my_module) { diff --git a/src/xdemangle.hpp b/src/xdemangle.hpp new file mode 100644 index 00000000..98d40cee --- /dev/null +++ b/src/xdemangle.hpp @@ -0,0 +1,75 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_DEMANGLE_HPP +#define XEUS_CPP_DEMANGLE_HPP + +#include +#include + +// __has_include is currently supported by GCC and Clang. However GCC 4.9 may have issues and +// returns 1 for 'defined( __has_include )', while '__has_include' is actually not supported: +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63662 +#if defined(__has_include) && (!defined(__GNUC__) || (__GNUC__ + 0) >= 5) +#if __has_include() +#define XEUS_HAS_CXXABI_H +#endif +#elif defined(__GLIBCXX__) || defined(__GLIBCPP__) +#define XEUS_HAS_CXXABI_H +#endif + +#if defined(XEUS_HAS_CXXABI_H) +#include +// For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library +// (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement +// abi::__cxa_demangle(). We detect this implementation by checking the include guard here. +#if defined(_GABIXX_CXXABI_H__) +#undef XEUS_HAS_CXXABI_H +#else +#include +#endif +#endif + +namespace xcpp +{ + const char* demangle(const char* name) noexcept; + const char* demangle(const std::string& name) noexcept; + +#if defined(XEUS_HAS_CXXABI_H) + + inline const char* demangle(const char* name) noexcept + { + std::size_t size = 0; + int status = 0; + return abi::__cxa_demangle(name, 0, &size, &status); + } + + inline const char* demangle(const std::string& name) noexcept + { + std::size_t size = 0; + int status = 0; + return abi::__cxa_demangle(name.c_str(), 0, &size, &status); + } + +#else + + inline const char* demangle(const char* name) noexcept + { + return name; + } + + inline const char* demangle(const std::string& name) noexcept + { + return demangle(name.c_str()); + } + +#endif +} + +#endif diff --git a/src/xholder.cpp b/src/xholder.cpp new file mode 100644 index 00000000..44938564 --- /dev/null +++ b/src/xholder.cpp @@ -0,0 +1,85 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include "xeus-cpp/xholder.hpp" + +#include + +#include "xeus-cpp/xpreamble.hpp" + +namespace xcpp +{ + /*********************************** + * xholder_preamble implementation * + ***********************************/ + + xholder_preamble::xholder_preamble() + : p_holder(nullptr) + { + } + + xholder_preamble::xholder_preamble(xpreamble* holder) + : p_holder(holder) + { + } + + xholder_preamble::~xholder_preamble() + { + delete p_holder; + } + + xholder_preamble::xholder_preamble(const xholder_preamble& rhs) + : p_holder(rhs.p_holder ? rhs.p_holder->clone() : nullptr) + { + } + + xholder_preamble::xholder_preamble(xholder_preamble&& rhs) + : p_holder(rhs.p_holder) + { + rhs.p_holder = nullptr; + } + + xholder_preamble& xholder_preamble::operator=(const xholder_preamble& rhs) + { + xholder_preamble tmp(rhs); + swap(tmp); + return *this; + } + + xholder_preamble& xholder_preamble::operator=(xholder_preamble&& rhs) + { + xholder_preamble tmp(std::move(rhs)); + swap(tmp); + return *this; + } + + xholder_preamble& xholder_preamble::operator=(xpreamble* holder) + { + delete p_holder; + p_holder = holder; + return *this; + } + + void xholder_preamble::apply(const std::string& s, nl::json& kernel_res) + { + if (p_holder != nullptr) + { + p_holder->apply(s, kernel_res); + } + } + + bool xholder_preamble::is_match(const std::string& s) const + { + if (p_holder != nullptr) + { + return p_holder->is_match(s); + } + return false; + } +} diff --git a/src/xinput.cpp b/src/xinput.cpp new file mode 100644 index 00000000..d1ba1c05 --- /dev/null +++ b/src/xinput.cpp @@ -0,0 +1,49 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include +#include +#include + +#include +#include + +#include "xinput.hpp" + +namespace xcpp +{ + void notimplemented(const std::string&) + { + throw std::runtime_error("This frontend does not support input requests"); + } + + /*************************************** + * Implementation of input_redirection * + ***************************************/ + + input_redirection::input_redirection(bool allow_stdin) + : p_cin_strbuf(std::cin.rdbuf()) + , m_cin_buffer( + allow_stdin ? xinput_buffer( + [](std::string& value) + { + value = xeus::blocking_input_request("", false); + } + ) + : xinput_buffer(notimplemented) + ) + { + std::cin.rdbuf(&m_cin_buffer); + } + + input_redirection::~input_redirection() + { + std::cin.rdbuf(p_cin_strbuf); + } +} diff --git a/src/xinput.hpp b/src/xinput.hpp new file mode 100644 index 00000000..e9716d03 --- /dev/null +++ b/src/xinput.hpp @@ -0,0 +1,37 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_INPUT_HPP +#define XEUS_CPP_INPUT_HPP + +#include + +#include "xeus-cpp/xbuffer.hpp" + +namespace xcpp +{ + /** + * Input_redirection is a scope guard implementing the redirection of + * std::cin() to the frontend through an input_request message. + */ + class input_redirection + { + public: + + input_redirection(bool allow_stdin); + ~input_redirection(); + + private: + + std::streambuf* p_cin_strbuf; + xinput_buffer m_cin_buffer; + }; +} + +#endif diff --git a/src/xinspect.hpp b/src/xinspect.hpp new file mode 100644 index 00000000..e39b0060 --- /dev/null +++ b/src/xinspect.hpp @@ -0,0 +1,348 @@ +*/*********************************************************************************** + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_INSPECT_HPP +#define XEUS_CPP_INSPECT_HPP + +#include +#include + +#include + +#include "cling/Interpreter/Interpreter.h" +#include "cling/Interpreter/Value.h" +#include "cling/Utils/Output.h" + +#include + +#include + +#include "xeus-cpp/xbuffer.hpp" +#include "xeus-cpp/xpreamble.hpp" + +#include "xdemangle.hpp" +#include "xparser.hpp" + +namespace xcpp +{ + struct node_predicate + { + std::string kind; + std::string child_value; + + bool operator()(pugi::xml_node node) const + { + return static_cast(node.attribute("kind").value()) == kind + && static_cast(node.child("name").child_value()) == child_value; + } + }; + + struct class_member_predicate + { + std::string class_name; + std::string kind; + std::string child_value; + + std::string get_filename(pugi::xml_node node) + { + for (pugi::xml_node child : node.children()) + { + if (static_cast(child.attribute("kind").value()) == kind + && static_cast(child.child("name").child_value()) == child_value) + { + return child.child("anchorfile").child_value(); + } + } + return ""; + } + + bool operator()(pugi::xml_node node) + { + auto parent = (static_cast(node.attribute("kind").value()) == "class" + || static_cast(node.attribute("kind").value()) == "struct") + && static_cast(node.child("name").child_value()) == class_name; + auto found = false; + if (parent) + { + for (pugi::xml_node child : node.children()) + { + if (static_cast(child.attribute("kind").value()) == kind + && static_cast(child.child("name").child_value()) == child_value) + { + found = true; + break; + } + } + } + return found; + } + }; + + /* std::string find_type(const std::string& expression, cling::Interpreter& interpreter) + { + cling::Value result; + std::string typeString; + + // add typeinfo in include files in order to use typeid + std::string code = "#include "; + auto compilation_result = interpreter.process(code.c_str(), &result); + + // try to find the typename of the class + code = "typeid(" + expression + ").name();"; + + // Temporarily dismissing all std::cerr and std::cout resulting from `interpreter.process` + compilation_result = interpreter.process(code.c_str(), &result); + { + auto cout_strbuf = std::cout.rdbuf(); + auto cerr_strbuf = std::cerr.rdbuf(); + auto null = xnull(); + std::cout.rdbuf(&null); + std::cerr.rdbuf(&null); + + compilation_result = interpreter.process(code.c_str(), &result); + + std::cout.rdbuf(cout_strbuf); + std::cerr.rdbuf(cerr_strbuf); + } + + if (compilation_result == cling::Interpreter::kSuccess) + { + // we found the typeid + std::string valueString; + { + llvm::raw_string_ostream os(valueString); + result.print(os); + } + + // search the typename in the output between "" + std::regex re_typename("\\\"(.*)\\\""); + std::smatch typename_; + std::regex_search(valueString, typename_, re_typename); + // set in valueString the typename given by typeid + valueString = typename_.str(1); + // we need demangling in order to have its string representation + valueString = demangle(valueString); + + re_typename = "(\\w*(?:\\:{2}?\\w*)*)"; + std::regex_search(valueString, typename_, re_typename); + if (!typename_.str(1).empty()) + { + typeString = typename_[1]; + } + } + + return typeString; + } + */ + + static nl::json read_tagconfs(const char* path) + { + nl::json result = nl::json::array(); + DIR* directory = opendir(path); + if (directory == nullptr) + { + return result; + } + dirent* item = readdir(directory); + while (item != nullptr) + { + std::string extension = "json"; + if (item->d_type == DT_REG) + { + std::string fname = item->d_name; + + if (fname.find(extension, (fname.length() - extension.length())) != std::string::npos) + { + std::ifstream i(path + ('/' + fname)); + nl::json entry; + i >> entry; + result.emplace_back(std::move(entry)); + } + } + item = readdir(directory); + } + closedir(directory); + return result; + } + + void inspect(const std::string& code, nl::json& kernel_res, cling::Interpreter& interpreter) + { + /* + std::string tagconf_dir = XCPP_TAGCONFS_DIR; + std::string tagfiles_dir = XCPP_TAGFILES_DIR; + + nl::json tagconfs = read_tagconfs(tagconf_dir.c_str()); + + std::vector check{"class", "struct", "function"}; + + std::string url, tagfile; + + std::regex re_expression(R"((((?:\w*(?:\:{2}|\<.*\>|\(.*\)|\[.*\])?)\.?)*))"); + std::smatch inspect; + std::regex_search(code, inspect, re_expression); + + std::string inspect_result; + + std::smatch method; + std::string to_inspect = inspect[1]; + + // Method or variable of class found (xxxx.yyyy) + if (std::regex_search(to_inspect, method, std::regex(R"((.*)\.(\w*)$)"))) + { + std::string typename_ = find_type(method[1], interpreter); + + if (!typename_.empty()) + { + for (nl::json::const_iterator it = tagconfs.cbegin(); it != tagconfs.cend(); ++it) + { + url = it->at("url"); + tagfile = it->at("tagfile"); + std::string filename = tagfiles_dir + "/" + tagfile; + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(filename.c_str()); + class_member_predicate predicate{typename_, "function", method[2]}; + auto node = doc.find_node(predicate); + if (!node.empty()) + { + inspect_result = url + predicate.get_filename(node); + } + } + } + } + else + { + std::string find_string; + + // check if we try to find the documentation of a namespace + // if yes, don't try to find the type using typeid + std::regex is_namespace(R"(\w+(\:{2}\w+)+)"); + std::smatch namespace_match; + if (std::regex_match(to_inspect, namespace_match, is_namespace)) + { + find_string = to_inspect; + } + else + { + std::string typename_ = find_type(to_inspect, interpreter); + find_string = (typename_.empty()) ? to_inspect : typename_; + } + + for (nl::json::const_iterator it = tagconfs.cbegin(); it != tagconfs.cend(); ++it) + { + url = it->at("url"); + tagfile = it->at("tagfile"); + std::string filename = tagfiles_dir + "/" + tagfile; + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(filename.c_str()); + for (auto c : check) + { + node_predicate predicate{c, find_string}; + std::string node; + + if (c == "class" || c == "struct") + { + node = doc.find_node(predicate).child("filename").child_value(); + } + else + { + node = doc.find_node(predicate).child("anchorfile").child_value(); + } + + if (!node.empty()) + { + inspect_result = url + node; + } + } + } + } + + if (inspect_result.empty()) + { + std::cerr << "No documentation found for " << code << "\n"; + std::cout << std::flush; + kernel_res["found"] = false; + kernel_res["status"] = "error"; + kernel_res["ename"] = "No documentation found"; + kernel_res["evalue"] = ""; + kernel_res["traceback"] = nl::json::array(); + } + else + { + // Format html content. + std::string html_content = R"( + )"; + + // Note: Adding "?action=purge" suffix to force cppreference's + // Mediawiki to purge the HTTP cache. + + kernel_res["payload"] = nl::json::array(); + kernel_res["payload"][0] = nl::json::object({ + {"data", { + {"text/plain", inspect_result}, + {"text/html", html_content}} + }, + {"source", "page"}, + {"start", 0} + }); + kernel_res["user_expressions"] = nl::json::object(); + + std::cout << std::flush; + kernel_res["found"] = true; + kernel_res["status"] = "ok"; + } + */ + } + + class xintrospection : public xpreamble + { + public: + + using xpreamble::pattern; + const std::string spattern = R"(^\?)"; + + xintrospection(cling::Interpreter& p) + : m_interpreter{p} + { + pattern = spattern; + } + + void apply(const std::string& code, nl::json& kernel_res) override + { + std::regex re(spattern + R"((.*))"); + std::smatch to_inspect; + std::regex_search(code, to_inspect, re); + inspect(to_inspect[1], kernel_res, m_interpreter); + } + + virtual xpreamble* clone() const override + { + return new xintrospection(*this); + } + + private: + + cling::Interpreter& m_interpreter; + }; +} +#endif diff --git a/src/xinterpreter.cpp b/src/xinterpreter.cpp index 9e36612f..563dc539 100644 --- a/src/xinterpreter.cpp +++ b/src/xinterpreter.cpp @@ -1,161 +1,598 @@ -/*************************************************************************** - * Copyright (c) 2023, xeus-cpp contributors - * - * Distributed under the terms of the BSD 3-Clause License. - * - * The full license is in the file LICENSE, distributed with this software. - ****************************************************************************/ - -#include +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include +#include // required before including llvm/ExecutionEngine/Orc/LLJIT.h because missing llvm/Object/SymbolicFile.h +#include +#include +#include +#include #include #include -#include "nlohmann/json.hpp" +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include -#include "xeus/xhelper.hpp" -#include "xeus/xinput.hpp" -#include "xeus/xinterpreter.hpp" +#include +#include "xeus-cpp/xbuffer.hpp" +#include "xeus-cpp/xeus_cpp_config.hpp" #include "xeus-cpp/xinterpreter.hpp" +#include "xeus-cpp/xmagics.hpp" + +#include "xinput.hpp" +// #include "xinspect.hpp" +// #include "xmagics/executable.hpp" +// #include "xmagics/execution.hpp" +#include "xmagics/os.hpp" +#include "xparser.hpp" +#include "xsystem.hpp" + + +std::string DiagnosticOutput; +llvm::raw_string_ostream DiagnosticsOS(DiagnosticOutput); +auto DiagPrinter = std::make_unique(DiagnosticsOS, new clang::DiagnosticOptions()); + +///\returns true on error. +static bool +process_code(clang::Interpreter& Interp, const std::string& code, llvm::raw_string_ostream& error_stream) +{ + auto PTU = Interp.Parse(code); + if (!PTU) + { + auto Err = PTU.takeError(); + error_stream << DiagnosticsOS.str(); + // avoid printing the "Parsing failed error" + // llvm::logAllUnhandledErrors(std::move(Err), error_stream, "error: "); + return true; + } + if (PTU->TheModule) + { + llvm::Error ex = Interp.Execute(*PTU); + error_stream << DiagnosticsOS.str(); + if (code.substr(0, 3) == "int") + { + for (clang::Decl* D : PTU->TUPart->decls()) + { + if (clang::VarDecl* VD = llvm::dyn_cast(D)) + { + auto Name = VD->getNameAsString(); + auto Addr = Interp.getSymbolAddress(clang::GlobalDecl(VD)); + if (!Addr) + { + llvm::logAllUnhandledErrors(std::move(Addr.takeError()), error_stream, "error: "); + return true; + } + } + } + } + else if (code.substr(0, 16) == "std::vector") + { + for (clang::Decl* D : PTU->TUPart->decls()) + { + if (clang::VarDecl* VD = llvm::dyn_cast(D)) + { + auto Name = VD->getNameAsString(); + auto Addr = Interp.getSymbolAddress(clang::GlobalDecl(VD)); + if (!Addr) + { + llvm::logAllUnhandledErrors(std::move(Addr.takeError()), error_stream, "error: "); + return true; + } + } + } + } + + llvm::logAllUnhandledErrors(std::move(ex), error_stream, "error: "); + return false; + } + return false; +} + +using Args = std::vector; + +static std::unique_ptr +create_interpreter(const Args& ExtraArgs = {}, clang::DiagnosticConsumer* Client = nullptr) +{ + llvm::InitializeNativeTarget(); + llvm::InitializeNativeTargetAsmPrinter(); + + Args ClangArgs = {"-Xclang", "-emit-llvm-only", "-Xclang", "-diagnostic-log-file", "-Xclang", "-", "-xc++"}; + ClangArgs.insert(ClangArgs.end(), ExtraArgs.begin(), ExtraArgs.end()); + auto CI = cantFail(clang::IncrementalCompilerBuilder::create(ClangArgs)); + if (Client) + { + CI->getDiagnostics().setClient(Client, /*ShouldOwnClient=*/false); + } + return cantFail(clang::Interpreter::create(std::move(CI))); +} + +static void +inject_symbol(llvm::StringRef LinkerMangledName, llvm::JITTargetAddress KnownAddr, clang::Interpreter& Interp) +{ + using namespace llvm; + using namespace llvm::orc; + + auto Symbol = Interp.getSymbolAddress(LinkerMangledName); //, /*IncludeFromHost=*/true); + + if (Error Err = Symbol.takeError()) + { + logAllUnhandledErrors(std::move(Err), errs(), "[IncrementalJIT] define() failed1: "); + return; + } + + // Nothing to define, we are redefining the same function. FIXME: Diagnose. + if (*Symbol && (JITTargetAddress) *Symbol == KnownAddr) + { + return; + } + + // Let's inject it + bool Inserted; + SymbolMap::iterator It; + static llvm::orc::SymbolMap m_InjectedSymbols; + + llvm::orc::LLJIT* Jit = const_cast(Interp.getExecutionEngine()); + JITDylib& DyLib = Jit->getMainJITDylib(); + + std::tie(It, Inserted) = m_InjectedSymbols.try_emplace( + Jit->getExecutionSession().intern(LinkerMangledName), + JITEvaluatedSymbol(KnownAddr, JITSymbolFlags::Exported) + ); + assert(Inserted && "Why wasn't this found in the initial Jit lookup?"); + + // We want to replace a symbol with a custom provided one. + if (Symbol && KnownAddr) + { + // The symbol be in the DyLib or in-process. + if (auto Err = DyLib.remove({It->first})) + { + logAllUnhandledErrors(std::move(Err), errs(), "[IncrementalJIT] define() failed2: "); + return; + } + } -namespace nl = nlohmann; + if (Error Err = DyLib.define(absoluteSymbols({*It}))) + { + logAllUnhandledErrors(std::move(Err), errs(), "[IncrementalJIT] define() failed3: "); + } +} + +namespace utils +{ + void AddIncludePath(llvm::StringRef Path, clang::HeaderSearchOptions& HOpts) + { + bool Exists = false; + for (const clang::HeaderSearchOptions::Entry& E : HOpts.UserEntries) + { + if ((Exists = E.Path == Path)) + { + break; + } + } + if (Exists) + { + return; + } + + HOpts.AddPath(Path, clang::frontend::Angled, false /* IsFramework */, true /* IsSysRootRelative */); + + if (HOpts.Verbose) + { + // std::clog << "Added include paths " << Path << std::endl; + } + } +} + +void AddIncludePath(clang::Interpreter& Interp, llvm::StringRef Path) +{ + clang::CompilerInstance* CI = const_cast(Interp.getCompilerInstance()); + clang::HeaderSearchOptions& HOpts = CI->getHeaderSearchOpts(); + + // Save the current number of entries + std::size_t Idx = HOpts.UserEntries.size(); + utils::AddIncludePath(Path, HOpts); + + clang::Preprocessor& PP = CI->getPreprocessor(); + clang::SourceManager& SM = CI->getSourceManager(); + clang::FileManager& FM = SM.getFileManager(); + clang::HeaderSearch& HSearch = PP.getHeaderSearchInfo(); + const bool isFramework = false; + + // Add all the new entries into Preprocessor + for (; Idx < HOpts.UserEntries.size(); ++Idx) + { + const clang::HeaderSearchOptions::Entry& E = HOpts.UserEntries[Idx]; + if (auto DE = FM.getOptionalDirectoryRef(E.Path)) + { + HSearch.AddSearchPath( + clang::DirectoryLookup(*DE, clang::SrcMgr::C_User, isFramework), + E.Group == clang::frontend::Angled + ); + } + } +} + +using namespace std::placeholders; namespace xcpp { + void interpreter::configure_impl() + { + // todo: why is error_stream necessary + std::string error_message; + llvm::raw_string_ostream error_stream(error_message); + // Expose xinterpreter instance to interpreted C++ + process_code(*m_interpreter, "#include \"xeus/xinterpreter.hpp\"", error_stream); + std::string code = "xeus::register_interpreter(static_cast((void*)" + + std::to_string(intptr_t(this)) + "));"; + process_code(*m_interpreter, code.c_str(), error_stream); + } - interpreter::interpreter() + interpreter::interpreter(int argc, const char* const* argv) + : m_interpreter(std::move(create_interpreter(Args() /*argv + 1, argv + argc)*/, DiagPrinter.get()))) + , m_version(get_stdopt(argc, argv)) + , // Extract C++ language standard version from command-line option + xmagics() + , p_cout_strbuf(nullptr) + , p_cerr_strbuf(nullptr) + , m_cout_buffer(std::bind(&interpreter::publish_stdout, this, _1)) + , m_cerr_buffer(std::bind(&interpreter::publish_stderr, this, _1)) { - xeus::register_interpreter(this); + redirect_output(); + init_includes(); + init_preamble(); + init_magic(); + } + + interpreter::~interpreter() + { + restore_output(); } nl::json interpreter::execute_request_impl( - int execution_counter, // Typically the cell number - const std::string& code, // Code to execute - bool /*silent*/, + int execution_counter, + const std::string& code, + bool silent, bool /*store_history*/, nl::json /*user_expressions*/, - bool /*allow_stdin*/ + bool allow_stdin ) { - // Use this method for publishing the execution result to the client, - // this method takes the ``execution_counter`` as first argument, - // the data to publish (mime type data) as second argument and metadata - // as third argument. - // Replace "Hello World !!" by what you want to be displayed under the execution cell - nl::json pub_data; - pub_data["text/plain"] = "Hello World !!"; + nl::json kernel_res; + + // Check for magics + for (auto& pre : preamble_manager.preamble) + { + if (pre.second.is_match(code)) + { + pre.second.apply(code, kernel_res); + return kernel_res; + } + } - // If silent is set to true, do not publish anything! - // Otherwise: - // Publish the execution result - publish_execution_result(execution_counter, std::move(pub_data), nl::json::object()); + auto errorlevel = 0; + std::string ename; + std::string evalue; + bool compilation_result = false; - // You can also use this method for publishing errors to the client, if the code - // failed to execute - // publish_execution_error(error_name, error_value, error_traceback); - publish_execution_error("TypeError", "123", {"!@#$", "*(*"}); + // If silent is set to true, temporarily dismiss all std::cerr and + // std::cout outputs resulting from `process_code`. - // Use publish_stream to publish a stream message or error: - publish_stream("stdout", "I am publishing a message"); - publish_stream("stderr", "Error!"); + auto cout_strbuf = std::cout.rdbuf(); + auto cerr_strbuf = std::cerr.rdbuf(); - // Use Helpers that create replies to the server to be returned - return xeus::create_successful_reply(/*payload, user_expressions*/); - // Or in case of error: - // return xeus::create_error_reply(evalue, ename, trace_back); + if (silent) + { + auto null = xnull(); + std::cout.rdbuf(&null); + std::cerr.rdbuf(&null); + } + + // Scope guard performing the temporary redirection of input requests. + auto input_guard = input_redirection(allow_stdin); + + std::string error_message; + llvm::raw_string_ostream error_stream(error_message); + // Attempt normal evaluation + try + { + compilation_result = process_code(*m_interpreter, code, error_stream); + } + catch (std::exception& e) + { + errorlevel = 1; + ename = "Standard Exception"; + evalue = e.what(); + } + catch (...) + { + errorlevel = 1; + ename = "Error"; + } + + if (compilation_result) + { + errorlevel = 1; + ename = "Error"; + evalue = error_stream.str(); + } + + error_stream.str().clear(); + DiagnosticsOS.str().clear(); + + // Flush streams + std::cout << std::flush; + std::cerr << std::flush; + + // Reset non-silent output buffers + if (silent) + { + std::cout.rdbuf(cout_strbuf); + std::cerr.rdbuf(cerr_strbuf); + } + + // Depending of error level, publish execution result or execution + // error, and compose execute_reply message. + if (errorlevel) + { + // Classic Notebook does not make use of the "evalue" or "ename" + // fields, and only displays the traceback. + // + // JupyterLab displays the "{ename}: {evalue}" if the traceback is + // empty. + std::vector traceback({ename + ": " + evalue}); + if (!silent) + { + publish_execution_error(ename, evalue, traceback); + } + + // Compose execute_reply message. + kernel_res["status"] = "error"; + kernel_res["ename"] = ename; + kernel_res["evalue"] = evalue; + kernel_res["traceback"] = traceback; + } + else + { + /* + // Publish a mime bundle for the last return value if + // the semicolon was omitted. + if (!silent && output.hasValue() && trim(code).back() != ';') + { + nl::json pub_data = mime_repr(output); + publish_execution_result(execution_counter, std::move(pub_data), nl::json::object()); + } + */ + // Compose execute_reply message. + kernel_res["status"] = "ok"; + kernel_res["payload"] = nl::json::array(); + kernel_res["user_expressions"] = nl::json::object(); + } + return kernel_res; } - void interpreter::configure_impl() + nl::json interpreter::complete_request_impl(const std::string& code, int cursor_pos) { - // `configure_impl` allows you to perform some operations - // after the custom_interpreter creation and before executing any request. - // This is optional, but can be useful; - // you can for example initialize an engine here or redirect output. + return xeus::create_complete_reply( + nl::json::array(), /*matches*/ + cursor_pos, /*cursor_start*/ + cursor_pos /*cursor_end*/ + ); + } + + nl::json interpreter::inspect_request_impl(const std::string& code, int cursor_pos, int /*detail_level*/) + { + nl::json kernel_res; + + auto dummy = code.substr(0, cursor_pos); + // TODO: same pattern as in inspect function (keep only one) + std::string exp = R"(\w*(?:\:{2}|\<.*\>|\(.*\)|\[.*\])?)"; + std::regex re_method{"(" + exp + R"(\.?)*$)"}; + std::smatch magic; + if (std::regex_search(dummy, magic, re_method)) + { + // inspect(magic[0], kernel_res, m_interpreter); + } + return kernel_res; } nl::json interpreter::is_complete_request_impl(const std::string& code) { - // Insert code here to validate the ``code`` - // and use `create_is_complete_reply` with the corresponding status - // "unknown", "incomplete", "invalid", "complete" - return xeus::create_is_complete_reply("complete" /*status*/, " " /*indent*/); + return xeus::create_is_complete_reply("complete", " "); } - nl::json interpreter::complete_request_impl(const std::string& code, int cursor_pos) + nl::json interpreter::kernel_info_request_impl() + { + nl::json result; + result["implementation"] = "xeus-cpp"; + result["implementation_version"] = XEUS_CPP_VERSION; + + /* The jupyter-console banner for xeus-cpp is the following: + __ _____ _ _ ___ + \ \/ / _ \ | | / __| + > < __/ |_| \__ \ + /_/\_\___|\__,_|___/ + + xeus-cpp: a C++ Jupyter kernel based on Clang + */ + + std::string banner = "" + " __ _____ _ _ ___\n" + " \\ \\/ / _ \\ | | / __|\n" + " > < __/ |_| \\__ \\\n" + " /_/\\_\\___|\\__,_|___/\n" + "\n" + " xeus-cpp: a C++ Jupyter kernel - based on Clang\n"; + banner.append(m_version); + result["banner"] = banner; + result["language_info"]["name"] = "C++"; + result["language_info"]["version"] = m_version; + result["language_info"]["mimetype"] = "text/x-c++src"; + result["language_info"]["codemirror_mode"] = "text/x-c++src"; + result["language_info"]["file_extension"] = ".cpp"; + result["help_links"] = nl::json::array(); + result["help_links"][0] = nl::json::object( + {{"text", "Xeus-cpp Reference"}, {"url", "https://xeus-cpp.readthedocs.io"}} + ); + result["status"] = "ok"; + return result; + } + + void interpreter::shutdown_request_impl() + { + restore_output(); + } + + static std::string c_format(const char* format, std::va_list args) { - // Should be replaced with code performing the completion - // and use the returned `matches` to `create_complete_reply` - // i.e if the code starts with 'H', it could be the following completion - if (code[0] == 'H') + // Call vsnprintf once to determine the required buffer length. The + // return value is the number of characters _excluding_ the null byte. + std::va_list args_bufsz; + va_copy(args_bufsz, args); + std::size_t bufsz = vsnprintf(NULL, 0, format, args_bufsz); + va_end(args_bufsz); + + // Create an empty string of that size. + std::string s(bufsz, 0); + + // Now format the data into this string and return it. + std::va_list args_format; + va_copy(args_format, args); + // The second parameter is the maximum number of bytes that vsnprintf + // will write _including_ the terminating null byte. + vsnprintf(&s[0], s.size() + 1, format, args_format); + va_end(args_format); + + return s; + } + + static int printf_jit(const char* format, ...) + { + std::va_list args; + va_start(args, format); + + std::string buf = c_format(format, args); + std::cout << buf; + + va_end(args); + + return buf.size(); + } + + static int fprintf_jit(std::FILE* stream, const char* format, ...) + { + std::va_list args; + va_start(args, format); + + int ret; + if (stream == stdout || stream == stderr) { - return xeus::create_complete_reply( - {std::string("Hello"), std::string("Hey"), std::string("Howdy")}, /*matches*/ - 5, /*cursor_start*/ - cursor_pos /*cursor_end*/ - ); + std::string buf = c_format(format, args); + if (stream == stdout) + { + std::cout << buf; + } + else if (stream == stderr) + { + std::cerr << buf; + } + ret = buf.size(); } - - // No completion result else { - return xeus::create_complete_reply( - nl::json::array(), /*matches*/ - cursor_pos, /*cursor_start*/ - cursor_pos /*cursor_end*/ - ); + // Just forward to vfprintf. + ret = vfprintf(stream, format, args); } + + va_end(args); + + return ret; } - nl::json - interpreter::inspect_request_impl(const std::string& /*code*/, int /*cursor_pos*/, int /*detail_level*/) + void interpreter::redirect_output() { - return xeus::create_inspect_reply( - true /*found*/, - {{std::string("text/plain"), std::string("hello!")}}, /*data*/ - {{std::string("text/plain"), std::string("hello!")}} /*meta-data*/ - ); + p_cout_strbuf = std::cout.rdbuf(); + p_cerr_strbuf = std::cerr.rdbuf(); + + std::cout.rdbuf(&m_cout_buffer); + std::cerr.rdbuf(&m_cerr_buffer); + + // Inject versions of printf and fprintf that output to std::cout + // and std::cerr (see implementation above). + inject_symbol("printf", llvm::pointerToJITTargetAddress(printf_jit), *m_interpreter); + inject_symbol("fprintf", llvm::pointerToJITTargetAddress(fprintf_jit), *m_interpreter); } - void interpreter::shutdown_request_impl() + void interpreter::restore_output() { - std::cout << "Bye!!" << std::endl; + std::cout.rdbuf(p_cout_strbuf); + std::cerr.rdbuf(p_cerr_strbuf); + + // No need to remove the injected versions of [f]printf: As they forward + // to std::cout and std::cerr, these are handled implicitly. } - nl::json interpreter::kernel_info_request_impl() + void interpreter::publish_stdout(const std::string& s) { - const std::string protocol_version = "5.3"; - const std::string implementation = "xcpp"; - const std::string implementation_version = XEUS_CPP_VERSION; - const std::string language_name = "cpp"; - const std::string language_version = "14"; - const std::string language_mimetype = "x-c++src"; - ; - const std::string language_file_extension = "cpp"; - ; - const std::string language_pygments_lexer = ""; - const std::string language_codemirror_mode = ""; - const std::string language_nbconvert_exporter = ""; - const std::string banner = "xcpp"; - const bool debugger = false; - - const nl::json help_links = nl::json::array(); - - - return xeus::create_info_reply( - protocol_version, - implementation, - implementation_version, - language_name, - language_version, - language_mimetype, - language_file_extension, - language_pygments_lexer, - language_codemirror_mode, - language_nbconvert_exporter, - banner, - debugger, - help_links - ); + publish_stream("stdout", s); + } + + void interpreter::publish_stderr(const std::string& s) + { + publish_stream("stderr", s); + } + + void interpreter::init_includes() + { + AddIncludePath(*m_interpreter, xtl::prefix_path() + "/include/"); } + void interpreter::init_preamble() + { + // preamble_manager.register_preamble("introspection", new xintrospection(m_interpreter)); + preamble_manager.register_preamble("magics", new xmagics_manager()); + preamble_manager.register_preamble("shell", new xsystem()); + } + + void interpreter::init_magic() + { + // preamble_manager["magics"].get_cast().register_magic("executable", + // executable(m_interpreter)); + // preamble_manager["magics"].get_cast().register_magic("file", writefile()); + // preamble_manager["magics"].get_cast().register_magic("timeit", + // timeit(&m_interpreter)); + } + + std::string interpreter::get_stdopt(int argc, const char* const* argv) + { + std::string res = "14"; + for (int i = 0; i < argc; ++i) + { + std::string tmp(argv[i]); + auto pos = tmp.find("-std=c++"); + if (pos != std::string::npos) + { + res = tmp.substr(pos + 8); + break; + } + } + return res; + } } diff --git a/src/xmagics/os.cpp b/src/xmagics/os.cpp new file mode 100644 index 00000000..089f8f68 --- /dev/null +++ b/src/xmagics/os.cpp @@ -0,0 +1,80 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include +#include +#include +#include + +#include "os.hpp" +#include "../xparser.hpp" + +#include "xeus-cpp/xoptions.hpp" + +namespace xcpp +{ + argparser writefile::get_options() + { + argparser argpars("file", XEUS_CLING_VERSION, argparse::default_arguments::none); + argpars.add_description("write file"); + argpars.add_argument("-a", "--append").help("append").default_value(false).implicit_value(true); + argpars.add_argument("filename").help("filename").required(); + // Add custom help (does not call `exit` avoiding to restart the kernel) + argpars.add_argument("-h", "--help") + .action( + [&](const std::string& /*unused*/) + { + std::cout << argpars.help().str(); + } + ) + .default_value(false) + .help("shows help message") + .implicit_value(true) + .nargs(0); + return argpars; + } + + void writefile::operator()(const std::string& line, const std::string& cell) + { + auto argpars = get_options(); + argpars.parse(line); + + auto filename = argpars.get("filename"); + + std::ofstream file; + + // TODO: check permission rights + if (is_file_exist(filename.c_str())) + { + if (argpars["-a"] == true) + { + file.open(filename, std::ios::app); + std::cout << "Appending to " << filename << "\n"; + } + else + { + file.open(filename); + std::cout << "Overwriting " << filename << "\n"; + } + } + else + { + file.open(filename); + std::cout << "Writing " << filename << "\n"; + } + file << cell << "\n"; + file.close(); + } + + bool writefile::is_file_exist(const char* fileName) + { + std::ifstream infile(fileName); + return infile.good(); + } +} diff --git a/src/xmagics/os.hpp b/src/xmagics/os.hpp new file mode 100644 index 00000000..9f39b071 --- /dev/null +++ b/src/xmagics/os.hpp @@ -0,0 +1,31 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_OS_MAGIC_HPP +#define XEUS_CPP_OS_MAGIC_HPP + +#include + +#include "xeus-cpp/xmagics.hpp" +#include "xeus-cpp/xoptions.hpp" + +namespace xcpp +{ + class writefile: public xmagic_cell + { + public: + + argparser get_options(); + virtual void operator()(const std::string& line, const std::string& cell) override; + + private: + + static bool is_file_exist(const char* fileName); + }; +} +#endif diff --git a/src/xoptions.cpp b/src/xoptions.cpp new file mode 100644 index 00000000..ba277f35 --- /dev/null +++ b/src/xoptions.cpp @@ -0,0 +1,46 @@ +/*********************************************************************************** + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include +#include +#include +#include + +#include "xeus-cpp/xoptions.hpp" + +namespace xcpp +{ + void argparser::parse(const std::string& line) + { + std::istringstream iss(line); + std::vector opt_strings( + (std::istream_iterator(iss)), + std::istream_iterator() + ); + + std::vector copt_strings; + + for (std::size_t i = 0; i < opt_strings.size(); ++i) + { + copt_strings.push_back(opt_strings[i].c_str()); + } + + int argc = copt_strings.size(); + auto argv = &copt_strings[0]; + + try + { + base_type::parse_args(argc, argv); + } + catch (const std::runtime_error& err) + { + std::cerr << err.what() << std::endl; + } + } +} diff --git a/src/xparser.cpp b/src/xparser.cpp new file mode 100644 index 00000000..8be51bfa --- /dev/null +++ b/src/xparser.cpp @@ -0,0 +1,29 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#include "xparser.hpp" + +#include +#include + +namespace xcpp +{ + std::string trim(const std::string& str) + { + if (str.empty()) + { + return str; + } + + std::size_t firstScan = str.find_first_not_of(' '); + std::size_t first = firstScan == std::string::npos ? str.length() : firstScan; + std::size_t last = str.find_last_not_of(' '); + return str.substr(first, last - first + 1); + } +} diff --git a/src/xparser.hpp b/src/xparser.hpp new file mode 100644 index 00000000..b22d43a2 --- /dev/null +++ b/src/xparser.hpp @@ -0,0 +1,19 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_PARSER_HPP +#define XEUS_CPP_PARSER_HPP + +#include + +namespace xcpp +{ + std::string trim(const std::string& str); +} +#endif diff --git a/src/xsystem.hpp b/src/xsystem.hpp new file mode 100644 index 00000000..042027b2 --- /dev/null +++ b/src/xsystem.hpp @@ -0,0 +1,79 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ************************************************************************************/ + +#ifndef XEUS_CPP_SYSTEM_HPP +#define XEUS_CPP_SYSTEM_HPP + +#include + +#include "xeus-cpp/xpreamble.hpp" + +namespace xcpp +{ + struct xsystem : xpreamble + { + const std::string spattern = R"(^\!)"; + using xpreamble::pattern; + + xsystem() + { + pattern = spattern; + } + + void apply(const std::string& code, nl::json& kernel_res) override + { + std::regex re(spattern + R"((.*))"); + std::smatch to_execute; + std::regex_search(code, to_execute, re); + + int ret = 1; + + // Redirection of stderr to stdout + std::string command = to_execute.str(1) + " 2>&1"; + +#if defined(WIN32) + FILE* shell_result = _popen(command.c_str(), "r"); +#else + FILE* shell_result = popen(command.c_str(), "r"); +#endif + if (shell_result) + { + char buff[512]; + ret = 0; + while (fgets(buff, sizeof(buff), shell_result)) + { + std::cout << buff; + } +#if defined(WIN32) + _pclose(shell_result); +#else + pclose(shell_result); +#endif + + std::cout << std::flush; + kernel_res["status"] = "ok"; + } + else + { + std::cerr << "Unable to execute the shell command\n"; + std::cout << std::flush; + kernel_res["status"] = "error"; + kernel_res["ename"] = "ename"; + kernel_res["evalue"] = "evalue"; + kernel_res["traceback"] = nl::json::array(); + } + } + + virtual xpreamble* clone() const override + { + return new xsystem(*this); + } + }; +} +#endif diff --git a/test/test_xcpp_kernel.py b/test/test_xcpp_kernel.py index 44772962..c1ac33a3 100644 --- a/test/test_xcpp_kernel.py +++ b/test/test_xcpp_kernel.py @@ -6,64 +6,43 @@ # The full license is in the file LICENSE, distributed with this software. ############################################################################# - -########################################################################################## -# TODO -# Please remove fake test and uncomment the code lines underneath it in order to enable -# the actual tests (to be modified/adapted) -######################################################################################### -# These tests examples (to be modified) check that the given code "hello, world" would be -# published as text stdout stream message and "error" as stderr -# Other tests are performed during the initialization of `jupyter_kernel_test.KernelTests` -# and inside the `execute_helper` function based on the given variables defined within -# the class -######################################################################################### -# TO BE REMOVED # -######################################################################################### - import unittest +import jupyter_kernel_test -class TestFake(unittest.TestCase): - - def test_fake(self): - pass -######################################################################################### -# TO UNCOMMENT AND ADAPT # -######################################################################################### +class XCppTests(jupyter_kernel_test.KernelTests): -#import tempfile -#import unittest -#import jupyter_kernel_test + kernel_name = 'xcpp' + # language_info.name in a kernel_info_reply should match this + language_name = 'C++' -#class KernelTests(jupyter_kernel_test.KernelTests): + # Code that should write the exact string `hello, world` to STDOUT + code_hello_world = '#include \nstd::cout << "hello, world" << std::endl;' - #kernel_name = "xcpp" - #language_name = "cpp" - #code_hello_world = "hello, world" - #code_page_something = "?" - #completion_samples = [{"text": "H", "matches": {"Hello", "Hey", "Howdy"}}] - #complete_code_samples = ["hello, world"] - #incomplete_code_samples = ["incomplete"] - #invalid_code_samples = ["invalid"] - #code_inspect_sample = "print" + # Code that should cause (any) text to be written to STDERR + code_stderr = '#include \nstd::cerr << "oops" << std::endl;' - #def test_stdout(self): - #self.flush_channels() - #reply, output_msgs = self.execute_helper(code="hello, world") - #self.assertEqual(output_msgs[0]["msg_type"], "stream") - #self.assertEqual(output_msgs[0]["content"]["name"], "stdout") - #self.assertEqual(output_msgs[0]["content"]["text"], "hello, world") + # Pager: code that should display something (anything) in the pager + #code_page_something = "?std::vector" - #def test_stderr(self): - #self.flush_channels() - #reply, output_msgs = self.execute_helper(code="error") - #self.assertEqual(output_msgs[0]["msg_type"], "stream") - #self.assertEqual(output_msgs[0]["content"]["name"], "stderr") + # Samples of code which generate a result value (ie, some text + # displayed as Out[n]) + #code_execute_result = [ + # { + # 'code': '6 * 7', + # 'result': '42' + # } + #] -######################################################################################### -######################################################################################### + # Samples of code which should generate a rich display output, and + # the expected MIME type + code_display_data = [ + { + 'code': '#include \n#include "xcpp/xdisplay.hpp"\nstd::string test("foobar");\nxcpp::display(test);', + 'mime': 'text/plain' + } + ] -if __name__ == "__main__": +if __name__ == '__main__': unittest.main()