From a5b476eb4eed9b06e22f4a80b16251aea243207d Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 16 Nov 2011 17:22:40 -0800 Subject: [PATCH] Correctly copy "out" arguments to the "leave" portion of the trace To do this, we take advantage of the new Arg struct to save, for each arg, whether it was parsed after an ENTER event or after a LEAVE event. --- cli/cli_pickle.cpp | 4 ++-- common/trace_dump.cpp | 4 ++-- common/trace_model.cpp | 2 +- common/trace_model.hpp | 9 +++++++-- common/trace_parser.cpp | 2 +- common/trace_writer_model.cpp | 4 ++-- gui/apitracecall.cpp | 4 ++-- gui/saverthread.cpp | 4 ++-- 8 files changed, 19 insertions(+), 14 deletions(-) diff --git a/cli/cli_pickle.cpp b/cli/cli_pickle.cpp index f435e20..8535b18 100644 --- a/cli/cli_pickle.cpp +++ b/cli/cli_pickle.cpp @@ -127,8 +127,8 @@ public: writer.beginList(); for (unsigned i = 0; i < call->args.size(); ++i) { - if (call->args[i]) { - _visit(call->args[i]); + if (call->args[i].value) { + _visit(call->args[i].value); } else { writer.writeNone(); } diff --git a/common/trace_dump.cpp b/common/trace_dump.cpp index 6b2fdc3..fd1d16a 100644 --- a/common/trace_dump.cpp +++ b/common/trace_dump.cpp @@ -217,8 +217,8 @@ public: if (!(dumpFlags & DUMP_FLAG_NO_ARG_NAMES)) { os << italic << call->sig->arg_names[i] << normal << " = "; } - if (call->args[i]) { - _visit(call->args[i]); + if (call->args[i].value) { + _visit(call->args[i].value); } else { os << "?"; } diff --git a/common/trace_model.cpp b/common/trace_model.cpp index e05ca27..7e926ba 100644 --- a/common/trace_model.cpp +++ b/common/trace_model.cpp @@ -32,7 +32,7 @@ namespace trace { Call::~Call() { for (unsigned i = 0; i < args.size(); ++i) { - delete args[i]; + delete args[i].value; } if (ret) { diff --git a/common/trace_model.hpp b/common/trace_model.hpp index 076ff09..7973026 100644 --- a/common/trace_model.hpp +++ b/common/trace_model.hpp @@ -406,6 +406,11 @@ enum { }; +struct Arg +{ + Value *value; +}; + class Call { @@ -413,7 +418,7 @@ public: unsigned thread_id; unsigned no; const FunctionSig *sig; - std::vector args; + std::vector args; Value *ret; CallFlags flags; @@ -434,7 +439,7 @@ public: inline Value & arg(unsigned index) { assert(index < args.size()); - return *(args[index]); + return *(args[index].value); } }; diff --git a/common/trace_parser.cpp b/common/trace_parser.cpp index 88afa98..dc9634f 100644 --- a/common/trace_parser.cpp +++ b/common/trace_parser.cpp @@ -480,7 +480,7 @@ void Parser::parse_arg(Call *call, Mode mode) { if (index >= call->args.size()) { call->args.resize(index + 1); } - call->args[index] = value; + call->args[index].value = value; } } diff --git a/common/trace_writer_model.cpp b/common/trace_writer_model.cpp index cc3af28..96544d1 100644 --- a/common/trace_writer_model.cpp +++ b/common/trace_writer_model.cpp @@ -103,9 +103,9 @@ public: void visit(Call *call) { unsigned call_no = writer.beginEnter(call->sig, call->thread_id); for (unsigned i = 0; i < call->args.size(); ++i) { - if (call->args[i]) { + if (call->args[i].value) { writer.beginArg(i); - _visit(call->args[i]); + _visit(call->args[i].value); writer.endArg(); } } diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 57d2d86..267dc09 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -678,9 +678,9 @@ ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, } m_argValues.reserve(call->args.size()); for (int i = 0; i < call->args.size(); ++i) { - if (call->args[i]) { + if (call->args[i].value) { VariantVisitor argVisitor(loader); - call->args[i]->visit(argVisitor); + call->args[i].value->visit(argVisitor); m_argValues.append(argVisitor.variant()); if (m_argValues[i].type() == QVariant::ByteArray) { m_hasBinaryData = true; diff --git a/gui/saverthread.cpp b/gui/saverthread.cpp index 7e7c471..54ef5d2 100644 --- a/gui/saverthread.cpp +++ b/gui/saverthread.cpp @@ -314,12 +314,12 @@ static void overwriteValue(trace::Call *call, const QVariant &val, int index) { EditVisitor visitor(val); - trace::Value *origValue = call->args[index]; + trace::Value *origValue = call->args[index].value; origValue->visit(visitor); if (visitor.value() && origValue != visitor.value()) { delete origValue; - call->args[index] = visitor.value(); + call->args[index].value = visitor.value(); } } -- 2.43.0