{
protected:
PickleWriter &writer;
+ bool symbolic;
public:
- PickleVisitor(PickleWriter &_writer) :
- writer(_writer) {
+ PickleVisitor(PickleWriter &_writer, bool _symbolic) :
+ writer(_writer),
+ symbolic(_symbolic) {
}
void visit(Null *node) {
}
void visit(Enum *node) {
- // TODO: keep symbolic name
+ if (symbolic) {
+ const EnumValue *it = node->lookup();
+ if (it) {
+ writer.writeString(it->name);
+ return;
+ }
+ }
writer.writeInt(node->value);
}
void visit(Bitmask *node) {
- // TODO: keep symbolic name
- writer.writeInt(node->value);
+ if (symbolic) {
+ unsigned long long value = node->value;
+ const BitmaskSig *sig = node->sig;
+ writer.beginList();
+ for (const BitmaskFlag *it = sig->flags; it != sig->flags + sig->num_flags; ++it) {
+ if ((it->value && (value & it->value) == it->value) ||
+ (!it->value && value == 0)) {
+ writer.writeString(it->name);
+ value &= ~it->value;
+ }
+ if (value == 0) {
+ break;
+ }
+ }
+ if (value) {
+ writer.writeInt(value);
+ }
+ writer.endList();
+ } else {
+ writer.writeInt(node->value);
+ }
}
void visit(Struct *node) {
- writer.beginDict();
- for (unsigned i = 0; i < node->sig->num_members; ++i) {
- writer.beginItem(node->sig->member_names[i]);
- _visit(node->members[i]);
- writer.endItem();
+ if (false) {
+ writer.beginDict();
+ for (unsigned i = 0; i < node->sig->num_members; ++i) {
+ writer.beginItem(node->sig->member_names[i]);
+ _visit(node->members[i]);
+ writer.endItem();
+ }
+ writer.endDict();
+ } else {
+ writer.beginTuple();
+ for (unsigned i = 0; i < node->sig->num_members; ++i) {
+ _visit(node->members[i]);
+ }
+ writer.endTuple();
}
- writer.endDict();
}
void visit(Array *node) {
<< synopsis << "\n"
"\n"
" -h, --help show this help message and exit\n"
+ " -s, --symbolic dump symbolic names\n"
" --calls=CALLSET only dump specified calls\n"
;
}
};
const static char *
-shortOptions = "h";
+shortOptions = "hs";
const static struct option
longOptions[] = {
{"help", no_argument, 0, 'h'},
+ {"symbolic", no_argument, 0, 's'},
{"calls", required_argument, 0, CALLS_OPT},
{0, 0, 0, 0}
};
static int
command(int argc, char *argv[])
{
+ bool symbolic;
+
int opt;
while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
switch (opt) {
case 'h':
usage();
return 0;
+ case 's':
+ symbolic = true;
+ break;
case CALLS_OPT:
calls = trace::CallSet(optarg);
break;
}
os::setBinaryMode(stdout);
+
+ PickleWriter writer(std::cout);
+ PickleVisitor visitor(writer, symbolic);
for (int i = optind; i < argc; ++i) {
trace::Parser parser;
trace::Call *call;
while ((call = parser.parse_call())) {
if (calls.contains(*call)) {
- PickleWriter writer(std::cout);
- PickleVisitor visitor(writer);
-
+ writer.begin();
visitor.visit(call);
+ writer.end();
}
delete call;
}
}
void visit(Enum *node) {
- const EnumSig *sig = node->sig;
- for (const EnumValue *it = sig->values; it != sig->values + sig->num_values; ++it) {
- if (it->value == node->value) {
- os << literal << it->name << normal;
- return;
- }
+ const EnumValue *it = node->lookup();
+ if (it) {
+ os << literal << it->name << normal;
+ return;
}
os << literal << node->value << normal;
}
unsigned long long value = bitmask->value;
const BitmaskSig *sig = bitmask->sig;
bool first = true;
- for (const BitmaskFlag *it = sig->flags; value != 0 && it != sig->flags + sig->num_flags; ++it) {
+ for (const BitmaskFlag *it = sig->flags; it != sig->flags + sig->num_flags; ++it) {
if ((it->value && (value & it->value) == it->value) ||
(!it->value && value == 0)) {
if (!first) {
value &= ~it->value;
first = false;
}
+ if (value == 0) {
+ break;
+ }
}
if (value || first) {
if (!first) {
args = [
options.apitrace,
'pickle',
+ '--symbolic',
'--calls=' + options.calls,
trace
],
b_call = self.b[blo + i]
assert a_call.functionName == b_call.functionName
assert len(a_call.args) == len(b_call.args)
- self.equal_prefix()
+ self.replace_prefix()
self.highlighter.bold(True)
self.highlighter.write(b_call.functionName)
self.highlighter.bold(False)
+ self.highlighter.write('(')
sep = ''
for j in xrange(len(b_call.args)):
self.highlighter.write(sep)
def normal_suffix(self):
self.highlighter.normal()
+
+ def replace_prefix(self):
+ self.highlighter.write('| ')
def main():