From 1b8dcab4c13e164ba5e6319e2f89f64496d33d5f Mon Sep 17 00:00:00 2001 From: Bart Wyatt Date: Fri, 17 Nov 2017 11:22:32 -0500 Subject: [PATCH] switch to using unique_ptrs for intrinsic functions, the internal class for that library has copy and move constructors but if they are used then the classes will segfault on destruction due to the use of a singleton mapping that breaks semantics necessary for copies and moves to work --- libraries/chain/CMakeLists.txt | 4 ++-- .../eosio/chain/wasm_interface_private.hpp | 18 ++++++++---------- libraries/chain/wasm_interface.cpp | 12 +++++++++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 6ef59f020..17191fe01 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -48,5 +48,5 @@ INSTALL( TARGETS ) INSTALL( FILES ${HEADERS} DESTINATION "include/eosio/chain" ) -#add_executable( test test.cpp ) -#target_link_libraries( test eos_chain ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ${Intl_LIBRARIES} ) +add_executable( test test.cpp ) +target_link_libraries( test eos_chain ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ${Intl_LIBRARIES} ) diff --git a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp index 7e902fc31..10524db5b 100644 --- a/libraries/chain/include/eosio/chain/wasm_interface_private.hpp +++ b/libraries/chain/include/eosio/chain/wasm_interface_private.hpp @@ -305,18 +305,16 @@ struct intrinsic_function_invoker { } }; -#define _REGISTER_INTRINSIC(R, CLS, METHOD)\ - {\ - std::piecewise_construct,\ - std::forward_as_tuple(#METHOD),\ - std::forward_as_tuple(\ +#define _REGISTER_INTRINSIC(R, DATA, METHOD)\ + BOOST_PP_TUPLE_ELEM(2, 0, DATA).emplace( #METHOD, \ + std::make_unique(\ #METHOD,\ - eosio::chain::intrinsic_function_invoker::wasm_function_type(),\ - (void *)eosio::chain::intrinsic_function_invoker::fn<&CLS::METHOD>()\ + eosio::chain::intrinsic_function_invoker::wasm_function_type(),\ + (void *)eosio::chain::intrinsic_function_invoker::fn<&BOOST_PP_TUPLE_ELEM(2, 1, DATA)::METHOD>()\ )\ - }, + ); -#define REGISTER_INTRINSICS(CLS, MEMBERS)\ - BOOST_PP_SEQ_FOR_EACH(_REGISTER_INTRINSIC, CLS, MEMBERS) +#define REGISTER_INTRINSICS(DATA, MEMBERS)\ + BOOST_PP_SEQ_FOR_EACH(_REGISTER_INTRINSIC, DATA, MEMBERS) } }; \ No newline at end of file diff --git a/libraries/chain/wasm_interface.cpp b/libraries/chain/wasm_interface.cpp index e175d9c74..6a1326a5f 100644 --- a/libraries/chain/wasm_interface.cpp +++ b/libraries/chain/wasm_interface.cpp @@ -348,14 +348,20 @@ class intrinsics { apply_context& context; }; -map intrinsic_registry = { - REGISTER_INTRINSICS(intrinsics, (read_action)(assert)) +static map> intrinsic_registry; +static void lazy_register_intrinsics() +{ + if (intrinsic_registry.size() !=0 ) { + return; + } + REGISTER_INTRINSICS((intrinsic_registry, intrinsics), (read_action)(assert)); }; FunctionInstance *resolve_intrinsic(const string& name) { + lazy_register_intrinsics(); auto iter = intrinsic_registry.find(name); if (iter != intrinsic_registry.end()) { - return (iter->second).function; + return (iter->second)->function; } return nullptr; -- GitLab