Correctly copy "out" arguments to the "leave" portion of the trace
authorCarl Worth <cworth@cworth.org>
Thu, 17 Nov 2011 01:22:40 +0000 (17:22 -0800)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 27 Jan 2012 22:15:13 +0000 (22:15 +0000)
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
common/trace_dump.cpp
common/trace_model.cpp
common/trace_model.hpp
common/trace_parser.cpp
common/trace_writer_model.cpp
gui/apitracecall.cpp
gui/saverthread.cpp

index f435e20..8535b18 100644 (file)
@@ -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();
             }
index 6b2fdc3..fd1d16a 100644 (file)
@@ -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 << "?";
             }
index e05ca27..7e926ba 100644 (file)
@@ -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) {
index 076ff09..7973026 100644 (file)
@@ -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<Value *> args;
+    std::vector<Arg> 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);
     }
 };
 
index 88afa98..dc9634f 100644 (file)
@@ -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;
     }
 }
 
index cc3af28..96544d1 100644 (file)
@@ -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();
             }
         }
index 57d2d86..267dc09 100644 (file)
@@ -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;
index 7e7c471..54ef5d2 100644 (file)
@@ -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();
     }
 }