From cd7d0c6790b2e557c9399e1aab16fe6d485ae65c Mon Sep 17 00:00:00 2001 From: Bart Wyatt Date: Fri, 8 Sep 2017 11:58:14 -0400 Subject: [PATCH] changed inline transaction to be optional ref EOSIO/eos#175 --- libraries/chain/chain_controller.cpp | 18 ++++++++++++++---- .../chain/include/eos/chain/transaction.hpp | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libraries/chain/chain_controller.cpp b/libraries/chain/chain_controller.cpp index 113913977..7cb528d17 100644 --- a/libraries/chain/chain_controller.cpp +++ b/libraries/chain/chain_controller.cpp @@ -584,6 +584,14 @@ void check_output(const vector& expected, const vector& actual, const path } } +template +void check_output(const fc::optional& expected, const fc::optional& actual, const path_cons_list& path) { + check_output(expected.valid(), actual.valid(), path(".valid()")); + if (expected.valid()) { + check_output(*expected, *actual, path); + } +} + template<> void check_output(const types::Bytes& expected, const types::Bytes& actual, const path_cons_list& path) { check_output(expected.size(), actual.size(), path(".size()")); @@ -899,8 +907,10 @@ void chain_controller::process_message(const Transaction& trx, AccountName code, } // combine inline messages and process - output.inline_transaction = InlineTransaction(trx); - output.inline_transaction.messages = std::move(apply_ctx.inline_messages); + if (apply_ctx.inline_messages.size() > 0) { + output.inline_transaction = InlineTransaction(trx); + (*output.inline_transaction).messages = std::move(apply_ctx.inline_messages); + } for( auto& asynctrx : apply_ctx.deferred_transactions ) { digest_type::encoder enc; @@ -979,8 +989,8 @@ typename T::Processed chain_controller::process_transaction( const T& trx, int d for( uint32_t i = 0; i < trx.messages.size(); ++i ) { auto& output = ptrx.output[i]; process_message(trx, trx.messages[i].code, trx.messages[i], output); - if (output.inline_transaction.messages.size() > 0 ) { - output.inline_transaction = process_transaction(PendingInlineTransaction(output.inline_transaction), depth + 1, start_time); + if (output.inline_transaction.valid() ) { + output.inline_transaction = process_transaction(PendingInlineTransaction(*output.inline_transaction), depth + 1, start_time); } } diff --git a/libraries/chain/include/eos/chain/transaction.hpp b/libraries/chain/include/eos/chain/transaction.hpp index 93f0ecd1c..d57f4e3fc 100644 --- a/libraries/chain/include/eos/chain/transaction.hpp +++ b/libraries/chain/include/eos/chain/transaction.hpp @@ -187,7 +187,7 @@ namespace eos { namespace chain { */ struct MessageOutput { vector notify; ///< accounts to notify, may only be notified once - InlineTransaction inline_transaction; ///< transactions generated and applied after notify + fc::optional inline_transaction; ///< transactions generated and applied after notify vector deferred_transactions; ///< transactions generated but not applied }; -- GitLab