From 2f8bb0b4507c6838bab6f02115a4e6fa31cc5347 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Mon, 18 Apr 2011 00:22:50 -0400 Subject: [PATCH] A first working version of saving :) --- gui/apitracecall.cpp | 21 ++++++++------------- gui/saverthread.cpp | 19 +++++++++---------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 39e4f55..c9e61e2 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -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(call->args[i]); - if (b && b->blob()) { - char *buf = (char*)b->blob(); - delete [] buf; - } - } } diff --git a/gui/saverthread.cpp b/gui/saverthread.cpp index b8b1bfb..5e80244 100644 --- a/gui/saverthread.cpp +++ b/gui/saverthread.cpp @@ -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(); } } -- 2.43.0