@@ -53,27 +53,13 @@ EVM::Result EVM::execute(ExtVMFace& _ext, int64_t gas)
5353EVMC::EVMC (evmc_instance* _instance) : EVM(_instance)
5454{
5555 static const auto tracer = [](evmc_tracer_context * _context, size_t _codeOffset,
56- evmc_status_code _statusCode, int64_t _gasLeft, size_t _stackNumItems,
57- evmc_uint256be const * _pushedStackItem, size_t _memorySize,
56+ evmc_status_code _statusCode, int64_t _gasLeft, size_t /* _stackNumItems*/ ,
57+ evmc_uint256be const * /* _pushedStackItem*/ , size_t /* _memorySize*/ ,
5858 size_t /* changed_memory_offset*/ , size_t /* changed_memory_size*/ ,
5959 uint8_t const * /* changed_memory*/ ) noexcept
6060 {
6161 EVMC* evmc = reinterpret_cast <EVMC*>(_context);
62-
63- // TODO: It might be easier to just pass instruction from VM.
64- char const * name = evmc->m_instructionNames [evmc->m_code [_codeOffset]];
65-
66- std::ostringstream logMessage;
67- logMessage << " EVMC "
68- << " " << evmc->m_step ++ << " " << _codeOffset << " " << name << " "
69- << _statusCode << " " << _gasLeft << " " << _stackNumItems;
70-
71- if (_pushedStackItem)
72- logMessage << " +[" << fromEvmC (*_pushedStackItem) << " ]" ;
73-
74- logMessage << " " << _memorySize;
75-
76- LOG (evmc->m_vmTraceLogger ) << logMessage.str ();
62+ evmc->trace .emplace_back (InstructionTrace{evmc->m_code [_codeOffset], _codeOffset, _statusCode, _gasLeft});
7763 };
7864
7965 _instance->set_tracer (_instance, tracer, reinterpret_cast <evmc_tracer_context*>(this ));
@@ -94,18 +80,18 @@ owning_bytes_ref EVMC::exec(u256& io_gas, ExtVMFace& _ext, const OnOpFunc& _onOp
9480 assert (_ext.depth <= static_cast <size_t >(std::numeric_limits<int32_t >::max ()));
9581
9682 m_code = bytesConstRef{&_ext.code };
97- m_step = 0 ;
9883
99- // FIXME: EVMC revision found twice.
100- m_instructionNames = evmc_get_instruction_names_table (toRevision (_ext.evmSchedule ()));
84+ auto gas = static_cast <int64_t >(io_gas);
10185
86+ calls.emplace_back (CallTrace{static_cast <int >(_ext.depth ),
87+ _ext.isCreate ? EVMC_CREATE : EVMC_CALL, trace.size (), trace.size (), gas});
10288
103- auto gas = static_cast <int64_t >(io_gas);
104- LOG (m_vmTraceLogger) << " EVMC message START " << _ext.depth << " " << _ext.caller << " -> "
105- << _ext.myAddress << " gas: " << gas << " \n " ;
10689 EVM::Result r = execute (_ext, gas);
107- LOG (m_vmTraceLogger) << " EVMC message END " << _ext.depth << " status: " << r.status ()
108- << " gas left: " << r.gasLeft () << " \n " ;
90+
91+ calls.back ().end = trace.size ();
92+
93+ if (_ext.depth == 0 )
94+ dumpTrace ();
10995
11096 switch (r.status ())
11197 {
@@ -171,5 +157,24 @@ evmc_revision EVM::toRevision(EVMSchedule const& _schedule)
171157 return EVMC_HOMESTEAD;
172158 return EVMC_FRONTIER;
173159}
160+
161+ void EVMC::dumpTrace ()
162+ {
163+ auto names = evmc_get_instruction_names_table (EVMC_LATEST_REVISION);
164+
165+ for (auto & c : calls)
166+ {
167+ std::cout << " call " << c.kind << " " << c.gas << " \n " ;
168+ for (size_t i = c.begin ; i < c.end ; ++i)
169+ {
170+ std::cout << names[trace[i].opcode ] << " \n " ;
171+ }
172+ std::cout << " endcall \n " ;
173+ }
174+
175+ calls.clear ();
176+ trace.clear ();
177+ }
178+
174179} // namespace eth
175180} // namespace dev
0 commit comments