From: Carl Worth Date: Thu, 17 Nov 2011 01:22:40 +0000 (-0800) Subject: Correctly copy "out" arguments to the "leave" portion of the trace X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;ds=sidebyside;h=a5b476eb4eed9b06e22f4a80b16251aea243207d;p=apitrace 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. --- 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(); } }