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.
writer.beginList();
for (unsigned i = 0; i < call->args.size(); ++i) {
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();
}
} else {
writer.writeNone();
}
if (!(dumpFlags & DUMP_FLAG_NO_ARG_NAMES)) {
os << italic << call->sig->arg_names[i] << normal << " = ";
}
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);
Call::~Call() {
for (unsigned i = 0; i < args.size(); ++i) {
Call::~Call() {
for (unsigned i = 0; i < args.size(); ++i) {
+struct Arg
+{
+ Value *value;
+};
+
unsigned thread_id;
unsigned no;
const FunctionSig *sig;
unsigned thread_id;
unsigned no;
const FunctionSig *sig;
- std::vector<Value *> args;
Value *ret;
CallFlags flags;
Value *ret;
CallFlags flags;
inline Value & arg(unsigned index) {
assert(index < args.size());
inline Value & arg(unsigned index) {
assert(index < args.size());
+ return *(args[index].value);
if (index >= call->args.size()) {
call->args.resize(index + 1);
}
if (index >= call->args.size()) {
call->args.resize(index + 1);
}
- call->args[index] = value;
+ call->args[index].value = value;
void visit(Call *call) {
unsigned call_no = writer.beginEnter(call->sig, call->thread_id);
for (unsigned i = 0; i < call->args.size(); ++i) {
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].value) {
+ _visit(call->args[i].value);
}
m_argValues.reserve(call->args.size());
for (int i = 0; i < call->args.size(); ++i) {
}
m_argValues.reserve(call->args.size());
for (int i = 0; i < call->args.size(); ++i) {
+ if (call->args[i].value) {
VariantVisitor argVisitor(loader);
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;
m_argValues.append(argVisitor.variant());
if (m_argValues[i].type() == QVariant::ByteArray) {
m_hasBinaryData = true;
overwriteValue(trace::Call *call, const QVariant &val, int index)
{
EditVisitor visitor(val);
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;
origValue->visit(visitor);
if (visitor.value() && origValue != visitor.value()) {
delete origValue;
- call->args[index] = visitor.value();
+ call->args[index].value = visitor.value();