diff --git a/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp b/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp index d33d821ea067b8c486dcaf6baed0f113cbe6bf13..54f27191df9ab0b76b8fe883c78fe8c1b28ab1a7 100644 --- a/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp +++ b/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp @@ -57,8 +57,7 @@ namespace eosio { namespace chain { namespace wasm_injections { if ( exp.kind == IR::ObjectKind::function ) exports++; - next_function_index = module.functions.imports.size() + module.functions.defs.size() + registered_injected.size(); // + exports + registered_injected.size()-1; - ; + next_function_index = module.functions.imports.size() + module.functions.defs.size() + registered_injected.size(); next_actual_index = next_injected_index++; } @@ -75,12 +74,17 @@ namespace eosio { namespace chain { namespace wasm_injections { module.functions.imports.insert( module.functions.imports.begin()+(registered_injected.size()-1), new_import.begin(), new_import.end() ); injected_index_mapping.emplace( index, actual_index ); // shift all exported functions by 1 + bool have_updated_start = false; for ( int i=0; i < module.exports.size(); i++ ) { - if ( module.exports[i].kind == IR::ObjectKind::function ) + if ( module.exports[i].kind == IR::ObjectKind::function ) { + // update the start function + if ( !have_updated_start && module.exports[i].index == module.startFunctionIndex ) { + module.startFunctionIndex++; + have_updated_start = true; + } module.exports[i].index++; + } } - // shift the start index by 1 - module.startFunctionIndex++; // shift all table entries for call indirect for(TableSegment& ts : module.tableSegments) { diff --git a/libraries/chain/webassembly/binaryen.cpp b/libraries/chain/webassembly/binaryen.cpp index 750cd65624f147721c0002f8adc5d0ef3c979920..9cc6fd94e3d547aa1b855367006d8019242d6c15 100644 --- a/libraries/chain/webassembly/binaryen.cpp +++ b/libraries/chain/webassembly/binaryen.cpp @@ -43,7 +43,9 @@ class binaryen_instantiated_module : public wasm_instantiated_module_interface { memset(_shared_linear_memory.data, 0, initial_memory_size); //copy back in the initial data memcpy(_shared_linear_memory.data, _initial_memory.data(), _initial_memory.size()); - + //std::cout << "_module start " << _module->start << std::endl; + //_module->addStart("apply"); + //std::cout << "_module start " << _module->start << std::endl; //be aware that construction of the ModuleInstance implictly fires the start function ModuleInstance instance(*_module.get(), &local_interface); instance.callExport(Name(entry_point), args); diff --git a/tests/wasm_tests/test_wasts.hpp b/tests/wasm_tests/test_wasts.hpp index abe14973e1e802ec6b22c706d7e604e3d00cd3ef..cf2a2c90f3aa0d55826aebf38f2cb921db650ec4 100644 --- a/tests/wasm_tests/test_wasts.hpp +++ b/tests/wasm_tests/test_wasts.hpp @@ -17,7 +17,7 @@ static const char f32_add_wast[] = R"=====( )====="; */ -static const char start_index_wast[] = R"=====( +static const char entry_wast[] = R"=====( (module (import "env" "require_auth" (func $require_auth (param i64))) (import "env" "eosio_assert" (func $eosio_assert (param i32 i32))) @@ -29,61 +29,24 @@ static const char start_index_wast[] = R"=====( (export "apply" (func $apply)) (func $entry (block - (call $eosio_assert - (i32.eq - (i32.load offset=4 - (i32.const 0) - ) + (i32.store offset=4 + (i32.const 0) (call $now) ) - (i32.const 0) - ) ) ) (func $apply (param $0 i64) (param $1 i64) (param $2 i64) - (call $require_auth (i64.const 6121376101093867520)) (block - (call $eosio_assert - (i32.eq - (i32.load offset=4 - (i32.const 0) - ) - (call $now) - ) - (i32.const 0) - ) - ) - ) - (start $entry) -) -)====="; - -static const char entry_wast[] = R"=====( -(module - (import "env" "require_auth" (func $require_auth (param i64))) - (import "env" "eosio_assert" (func $eosio_assert (param i32 i32))) - (import "env" "now" (func $now (result i32))) - (table 0 anyfunc) - (memory $0 1) - (export "memory" (memory $0)) - (export "entry" (func $entry)) - (export "apply" (func $apply)) - (func $entry - (i32.store offset=4 - (i32.const 0) - (call $now) - ) - ) - (func $apply (param $0 i64) (param $1 i64) (param $2 i64) - (call $require_auth (i64.const 6121376101093867520)) - (call $eosio_assert - (i32.eq - (i32.load offset=4 - (i32.const 0) + (call $require_auth (i64.const 6121376101093867520)) + (call $eosio_assert + (i32.eq + (i32.load offset=4 + (i32.const 0) + ) + (call $now) ) - (call $now) + (i32.const 0) ) - (i32.const 0) ) ) (start $entry) diff --git a/tests/wasm_tests/wasm_tests.cpp b/tests/wasm_tests/wasm_tests.cpp index 61cb363aed8328c526a5c57c48ff5471164de4b3..f85d09c8c826f18cd3d9cf9393a7bdbecd8acf05 100644 --- a/tests/wasm_tests/wasm_tests.cpp +++ b/tests/wasm_tests/wasm_tests.cpp @@ -612,31 +612,6 @@ BOOST_FIXTURE_TEST_CASE( check_entry_behavior, TESTER ) try { BOOST_CHECK_EQUAL(transaction_receipt::executed, receipt.status); } FC_LOG_AND_RETHROW() -BOOST_FIXTURE_TEST_CASE( check_start_index_behavior, TESTER ) try { - produce_blocks(2); - create_accounts( {N(check)} ); - produce_block(); - - set_code(N(check), start_index_wast); - produce_blocks(10); - - signed_transaction trx; - action act; - act.account = N(check); - act.name = N(); - act.authorization = vector{{N(check),config::active_name}}; - trx.actions.push_back(act); - - set_transaction_headers(trx); - trx.sign(get_private_key( N(check), "active" ), chain_id_type()); - push_transaction(trx); - produce_blocks(1); - BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id())); - const auto& receipt = get_transaction_receipt(trx.id()); - BOOST_CHECK_EQUAL(transaction_receipt::executed, receipt.status); -} FC_LOG_AND_RETHROW() - - /** * Ensure we can load a wasm w/o memory */