X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Ftrace.py;h=958c07279a1bf55eab84d44d349ef6a3fded764f;hb=537c507874cdde0b507d306ac058767f506da8e2;hp=8bffbfb74409077eb072b07566090eaa6223c10c;hpb=c328b8c328332783f95088cdb67700f6242a777d;p=apitrace diff --git a/wrappers/trace.py b/wrappers/trace.py index 8bffbfb..958c072 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -187,7 +187,7 @@ class ValueSerializer(stdapi.Visitor): length = '_c' + array.type.tag index = '_i' + array.type.tag print ' if (%s) {' % instance - print ' size_t %s = %s;' % (length, array.length) + print ' size_t %s = %s > 0 ? %s : 0;' % (length, array.length, array.length) print ' trace::localWriter.beginArray(%s);' % length print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index) print ' trace::localWriter.beginElement();' @@ -300,7 +300,7 @@ class ValueWrapper(stdapi.Traverser): if isinstance(elem_type, stdapi.Interface): self.visitInterfacePointer(elem_type, instance) else: - self.visitPointer(self, pointer, instance) + self.visitPointer(pointer, instance) def visitInterface(self, interface, instance): raise NotImplementedError @@ -388,7 +388,17 @@ class Tracer: self.footer(api) def header(self, api): - pass + print '#ifdef _WIN32' + print '# include // alloca' + print '# ifndef alloca' + print '# define alloca _alloca' + print '# endif' + print '#else' + print '# include // alloca' + print '#endif' + print + print '#include "trace.hpp"' + print def footer(self, api): pass @@ -396,12 +406,13 @@ class Tracer: def traceFunctionDecl(self, function): # Per-function declarations - if function.args: - print 'static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args])) - else: - print 'static const char ** _%s_args = NULL;' % (function.name,) - print 'static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, function.id, function.name, len(function.args), function.name) - print + if not function.internal: + if function.args: + print 'static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args])) + else: + print 'static const char ** _%s_args = NULL;' % (function.name,) + print 'static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, function.id, function.name, len(function.args), function.name) + print def isFunctionPublic(self, function): return True @@ -414,29 +425,42 @@ class Tracer: print function.prototype() + ' {' if function.type is not stdapi.Void: print ' %s _result;' % function.type + + # No-op if tracing is disabled + print ' if (!trace::isTracingEnabled()) {' + Tracer.invokeFunction(self, function) + if function.type is not stdapi.Void: + print ' return _result;' + else: + print ' return;' + print ' }' + self.traceFunctionImplBody(function) if function.type is not stdapi.Void: - self.wrapRet(function, "_result") print ' return _result;' print '}' print def traceFunctionImplBody(self, function): - print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,) - for arg in function.args: - if not arg.output: - self.unwrapArg(function, arg) - self.serializeArg(function, arg) - print ' trace::localWriter.endEnter();' + if not function.internal: + print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,) + for arg in function.args: + if not arg.output: + self.unwrapArg(function, arg) + self.serializeArg(function, arg) + print ' trace::localWriter.endEnter();' self.invokeFunction(function) - print ' trace::localWriter.beginLeave(_call);' - for arg in function.args: - if arg.output: - self.serializeArg(function, arg) - self.wrapArg(function, arg) - if function.type is not stdapi.Void: - self.serializeRet(function, "_result") - print ' trace::localWriter.endLeave();' + if not function.internal: + print ' trace::localWriter.beginLeave(_call);' + for arg in function.args: + if arg.output: + self.serializeArg(function, arg) + self.wrapArg(function, arg) + if function.type is not stdapi.Void: + self.serializeRet(function, "_result") + print ' trace::localWriter.endLeave();' + if function.type is not stdapi.Void: + self.wrapRet(function, "_result") def invokeFunction(self, function, prefix='_', suffix=''): if function.type is stdapi.Void: @@ -522,21 +546,24 @@ class Tracer: for method in interface.iterMethods(): print " " + method.prototype() + ";" print - self.declareWrapperInterfaceVariables(interface) + #print "private:" + for type, name, value in self.enumWrapperInterfaceVariables(interface): + print ' %s %s;' % (type, name) print "};" print - def declareWrapperInterfaceVariables(self, interface): - #print "private:" - print " DWORD m_dwMagic;" - print " %s * m_pInstance;" % (interface.name,) + def enumWrapperInterfaceVariables(self, interface): + return [ + ("DWORD", "m_dwMagic", "0xd8365d6c"), + ("%s *" % interface.name, "m_pInstance", "pInstance"), + ] def implementWrapperInterface(self, interface): self.interface = interface print '%s::%s(%s * pInstance) {' % (getWrapperInterfaceName(interface), getWrapperInterfaceName(interface), interface.name) - print ' m_dwMagic = 0xd8365d6c;' - print ' m_pInstance = pInstance;' + for type, name, value in self.enumWrapperInterfaceVariables(interface): + print ' %s = %s;' % (name, value) print '}' print print '%s::~%s() {' % (getWrapperInterfaceName(interface), getWrapperInterfaceName(interface)) @@ -562,8 +589,13 @@ class Tracer: print def implementWrapperInterfaceMethodBody(self, interface, base, method): + assert not method.internal + print ' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args])) print ' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (method.id, interface.name + '::' + method.name, len(method.args) + 1) + + print ' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base) + print ' unsigned _call = trace::localWriter.beginEnter(&_sig);' print ' trace::localWriter.beginArg(0);' print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);' @@ -583,11 +615,11 @@ class Tracer: self.wrapArg(method, arg) if method.type is not stdapi.Void: - print ' trace::localWriter.beginReturn();' - self.serializeValue(method.type, "_result") - print ' trace::localWriter.endReturn();' - self.wrapValue(method.type, '_result') + self.serializeRet(method, '_result') print ' trace::localWriter.endLeave();' + if method.type is not stdapi.Void: + self.wrapRet(method, '_result') + if method.name == 'Release': assert method.type is not stdapi.Void print ' if (!_result)' @@ -647,7 +679,7 @@ class Tracer: result = '' else: result = '_result = ' - print ' %sstatic_cast<%s *>(m_pInstance)->%s(%s);' % (result, base, method.name, ', '.join([str(arg.name) for arg in method.args])) + print ' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args])) def emit_memcpy(self, dest, src, length): print ' unsigned _call = trace::localWriter.beginEnter(&trace::memcpy_sig);'