提交 7c6f91a2 编写于 作者: B Bucky Kittinger

Fix index offset and modified test to ensure this works after injection

上级 88c89350
......@@ -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) {
......
......@@ -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);
......
......@@ -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)
......
......@@ -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<permission_level>{{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
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册