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);
}
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;
- }
-
}
}
}
static void
-writeArgument(const QVariant &var, unsigned &id)
+writeValue(const QVariant &var, unsigned &id)
{
int arrayType = QMetaType::type("ApiArray");
int bitmaskType = QMetaType::type("ApiBitmask");
int enumType = QMetaType::type("ApiEnum");
int type = var.userType();
- Trace::BeginArg(++id);
switch(type) {
case QVariant::Bool:
Trace::LiteralBool(var.toBool());
Trace::BeginArray(vals.count());
foreach(QVariant el, vals) {
Trace::BeginElement();
- writeArgument(el, ++id);
+ writeValue(el, ++id);
Trace::EndElement();
}
Trace::EndArray();
Trace::StructSig *str = createStructSig(apiStr, ++id);
Trace::BeginStruct(str);
foreach(QVariant val, vals) {
- writeArgument(val, ++id);
+ writeValue(val, ++id);
}
Trace::EndStruct();
deleteStructSig(str);
<< QMetaType::typeName(type);
}
}
-
- Trace::EndArg();
}
-
SaverThread::SaverThread(QObject *parent)
: QThread(parent)
{
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();
QVariant ret = call->returnValue();
if (!ret.isNull()) {
Trace::BeginReturn();
- writeArgument(ret, ++id);
+ writeValue(ret, ++id);
Trace::EndReturn();
}
}