def visit_blob(self, array):
pass
+ __enum_id = 0
+
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 ' static const Trace::EnumSig sig%u = {%u, "%s", %s};' % (i, DumpDeclarator.__enum_id, value, value)
+ DumpDeclarator.__enum_id += 1
print ' const Trace::EnumSig *sig;'
print ' switch(value) {'
for i in range(n):
print ' Trace::LiteralSInt(value);'
print ' return;'
print ' }'
- print ' Trace::LiteralEnum(sig);'
+ print ' Trace::LiteralEnum(sig);'
print '}'
print
print ' __traceStruct%s(%s);' % (struct.id, instance)
def visit_array(self, array, instance):
- print ' if(%s) {' % instance
+ print ' if (%s) {' % instance
index = '__i' + array.type.id
print ' Trace::BeginArray(%s);' % (array.length,)
print ' for (int %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index)
print ' Trace::LiteralBitmask(__bitmask%s_sig, %s);' % (bitmask.id, instance)
def visit_pointer(self, pointer, instance):
- print ' if(%s) {' % instance
+ print ' if (%s) {' % instance
print ' Trace::BeginArray(1);'
print ' Trace::BeginElement();'
dump_instance(pointer.type, "*" + instance)
def visit_interface(self, interface, instance):
assert instance.startswith('*')
instance = instance[1:]
- print " if(%s)" % instance
+ print " if (%s)" % instance
print " %s = new %s(%s);" % (instance, interface_wrap_name(interface), instance)
def visit_interface(self, interface, instance):
assert instance.startswith('*')
instance = instance[1:]
- print " if(%s)" % instance
+ print " if (%s)" % instance
print " %s = static_cast<%s *>(%s)->m_pInstance;" % (instance, interface_wrap_name(interface), instance)
class Tracer:
+ def __init__(self):
+ self.api = None
+
def trace_api(self, api):
+ self.api = api
+
self.header(api)
# Includes
def get_dispatch_function(self, function):
return '__' + function.name
+ def is_public_function(self, function):
+ return True
+
def trace_function_impl(self, function):
- print 'extern "C" ' + function.prototype() + ' {'
+ if self.is_public_function(function):
+ print 'extern "C" PUBLIC'
+ else:
+ print 'extern "C" PRIVATE'
+ print function.prototype() + ' {'
if function.type is not stdapi.Void:
print ' %s __result;' % function.type
self.trace_function_impl_body(function)
wrap_instance(method.type, '__result')
print ' Trace::EndLeave();'
if method.name == 'QueryInterface':
- print ' if (*ppvObj == m_pInstance)'
- print ' *ppvObj = this;'
+ print ' if (ppvObj && *ppvObj) {'
+ print ' if (*ppvObj == m_pInstance) {'
+ print ' *ppvObj = this;'
+ print ' }'
+ for iface in self.api.interfaces:
+ print ' else if (riid == IID_%s) {' % iface.name
+ print ' *ppvObj = new Wrap%s((%s *) *ppvObj);' % (iface.name, iface.name)
+ print ' }'
+ print ' }'
if method.name == 'Release':
assert method.type is not stdapi.Void
print ' if (!__result)'
def __init__(self, dllname):
self.dllname = dllname
- def get_function_address(self, function):
- return '__%s' % (function.name,)
-
def header(self, api):
print '''
static HINSTANCE g_hDll = NULL;
return GetProcAddress(g_hDll, lpProcName);
}
- ''' % self.dllname
+#define __abort() OS::Abort()
+''' % self.dllname
dispatcher = Dispatcher()
dispatcher.dispatch_api(api)