]> git.cworth.org Git - apitrace/commitdiff
A first working version of saving :)
authorZack Rusin <zack@kde.org>
Mon, 18 Apr 2011 04:22:50 +0000 (00:22 -0400)
committerZack Rusin <zack@kde.org>
Mon, 18 Apr 2011 04:22:50 +0000 (00:22 -0400)
gui/apitracecall.cpp
gui/saverthread.cpp

index 39e4f5515dd8b725dc76dfa5678cbadfe2085eb6..c9e61e2cb8c8e499dbd35de9a49849005b783518 100644 (file)
@@ -205,6 +205,14 @@ void VariantVisitor::visit(Trace::Array *array)
 
 void VariantVisitor::visit(Trace::Blob *blob)
 {
+    //XXX
+    //FIXME: this is a nasty hack. Trace::Blob's can't
+    //   delete the contents in the destructor because
+    //   the data is being used by other calls. We piggy back
+    //   on that assumption and don't deep copy the data. If
+    //   Blob's will start deleting the data we will need to
+    //   start deep copying it or switch to using something like
+    //   Boost's shared_ptr or Qt's QSharedPointer to handle it
     QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
     m_variant = QVariant(barray);
 }
@@ -619,19 +627,6 @@ ApiTraceCall::ApiTraceCall(const Trace::Call *call)
         VariantVisitor argVisitor;
         call->args[i]->visit(argVisitor);
         m_argValues += argVisitor.variant();
-
-        //XXX
-        //FIXME: this is a nasty hack. Trace::Blob's can't
-        //   delete the contents in the destructor because
-        //   the data is being used by other calls. we should
-        //   use something like Boost's shared_ptr or
-        //   Qt's QSharedPointer to handle it.
-        Trace::Blob *b = dynamic_cast<Trace::Blob*>(call->args[i]);
-        if (b && b->blob()) {
-            char *buf = (char*)b->blob();
-            delete [] buf;
-        }
-
     }
 }
 
index b8b1bfb4bf5d2a4d9ee1c081c4281fe7d4f2bb90..5e80244ed789198dc97be5304592804a3ca10f30 100644 (file)
@@ -118,7 +118,7 @@ deleteBitmaskSig(Trace::BitmaskSig *sig)
 }
 
 static void
-writeArgument(const QVariant &var, unsigned &id)
+writeValue(const QVariant &var, unsigned &id)
 {
     int arrayType   = QMetaType::type("ApiArray");
     int bitmaskType = QMetaType::type("ApiBitmask");
@@ -127,7 +127,6 @@ writeArgument(const QVariant &var, unsigned &id)
     int enumType    = QMetaType::type("ApiEnum");
     int type = var.userType();
 
-    Trace::BeginArg(++id);
     switch(type) {
     case QVariant::Bool:
         Trace::LiteralBool(var.toBool());
@@ -167,7 +166,7 @@ writeArgument(const QVariant &var, unsigned &id)
             Trace::BeginArray(vals.count());
             foreach(QVariant el, vals) {
                 Trace::BeginElement();
-                writeArgument(el, ++id);
+                writeValue(el, ++id);
                 Trace::EndElement();
             }
             Trace::EndArray();
@@ -182,7 +181,7 @@ writeArgument(const QVariant &var, unsigned &id)
             Trace::StructSig *str = createStructSig(apiStr, ++id);
             Trace::BeginStruct(str);
             foreach(QVariant val, vals) {
-                writeArgument(val, ++id);
+                writeValue(val, ++id);
             }
             Trace::EndStruct();
             deleteStructSig(str);
@@ -203,11 +202,8 @@ writeArgument(const QVariant &var, unsigned &id)
                       << QMetaType::typeName(type);
         }
     }
-
-    Trace::EndArg();
 }
 
-
 SaverThread::SaverThread(QObject *parent)
     : QThread(parent)
 {
@@ -230,12 +226,15 @@ void SaverThread::run()
     for (int i = 0; i < m_calls.count(); ++i) {
         ApiTraceCall *call = m_calls[i];
         Trace::FunctionSig *funcSig = createFunctionSig(call, ++id);
-        unsigned callNo = BeginEnter(*funcSig);
+        unsigned callNo = Trace::BeginEnter(*funcSig);
         {
             //args
             QVariantList vars = call->arguments();
+            int index = 0;
             foreach(QVariant var, vars) {
-                writeArgument(var, ++id);
+                Trace::BeginArg(index++);
+                writeValue(var, ++id);
+                Trace::EndArg();
             }
         }
         Trace::EndEnter();
@@ -244,7 +243,7 @@ void SaverThread::run()
             QVariant ret = call->returnValue();
             if (!ret.isNull()) {
                 Trace::BeginReturn();
-                writeArgument(ret, ++id);
+                writeValue(ret, ++id);
                 Trace::EndReturn();
             }
         }