diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 6ef59f020c19b610f48c67ef44f8037da0b5bd69..17191fe011e464ba18197c47b46c9d7288df198a 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 7e902fc31d8ae5037af3c5f82a4f161448134dff..10524db5b64fb6cc71124e51ab7de6ebdd965e06 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 e175d9c74e60eed5c81bcf5af9daaf64b9bad22f..6a1326a5f17aa0cc821a70d1c88f33d6f6f56b3b 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;