for type, name in struct.members:
self.visit(type)
print 'static void __traceStruct%s(const %s &value) {' % (struct.id, struct.expr)
- print ' Trace::BeginStruct(%u);' % len(struct.members)
+ print ' static const char * members[%u] = {' % (len(struct.members),)
+ for type, name, in struct.members:
+ print ' "%s",' % (name,)
+ print ' };'
+ print ' static const Trace::StructSig sig = {'
+ print ' %u, "%s", %u, members' % (int(struct.id), struct.name, len(struct.members))
+ print ' };'
+ print ' Trace::BeginStruct(&sig);'
for type, name in struct.members:
- print ' Trace::BeginMember("%s");' % (name,)
dump_instance(type, 'value.%s' % (name,))
- print ' Trace::EndMember();'
print ' Trace::EndStruct();'
print '}'
print
def visit_enum(self, enum):
print 'static void __traceEnum%s(const %s value) {' % (enum.id, enum.expr)
+ n = len(enum.values)
+ for i in range(n):
+ value = enum.values[i]
+ print ' static const Trace::EnumSig sig%u = {%u, "%s", %s};' % (i, enum.vid + i, value, value)
+ print ' const Trace::EnumSig *sig;'
print ' switch(value) {'
- for value in enum.values:
+ for i in range(n):
+ value = enum.values[i]
print ' case %s:' % value
- print ' Trace::LiteralNamedConstant("%s", %s);' % (value, value)
+ print ' sig = &sig%u;' % i
print ' break;'
print ' default:'
print ' Trace::LiteralSInt(value);'
- print ' break;'
+ print ' return;'
print ' }'
+ print ' Trace::LiteralEnum(sig);'
print '}'
print
print 'typedef ' + function.prototype('* %s' % ptype) + ';'
print 'static %s %s = NULL;' % (ptype, pvalue)
print
+ print 'static const char * __%s_args[] = {' % (function.name)
+ for arg in function.args:
+ print ' "%s",' % (arg.name,)
+ print '};'
+ print
+ print 'static const Trace::FunctionSig __%s_sig = {' % (function.name)
+ print ' %u, "%s", %u, __%s_args' % (int(function.id), function.name, len(function.args), function.name)
+ print '};'
+ print
+
def trace_function_fail(self, function):
if function.fail is not None:
print ' %s __result;' % function.type
result = '__result = '
self._get_true_pointer(function)
- print ' unsigned __call = Trace::BeginEnter("%s");' % (function.name)
+ print ' unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name)
for arg in function.args:
if not arg.output:
self.unwrap_arg(function, arg)
print
def dump_arg(self, function, arg):
- print ' Trace::BeginArg(%u, "%s");' % (arg.index, arg.name,)
+ print ' Trace::BeginArg(%u);' % (arg.index,)
dump_instance(arg.type, arg.name)
print ' Trace::EndArg();'
print ' %s __result;' % method.type
result = '__result = '
print ' Trace::BeginCall("%s");' % (interface.name + '::' + method.name)
- print ' Trace::BeginArg(0, "this");'
+ print ' Trace::BeginArg(0);'
print ' Trace::LiteralOpaque((const void *)m_pInstance);'
print ' Trace::EndArg();'
for arg in method.args: