import stdapi
+from dispatch import Dispatcher
def interface_wrap_name(interface):
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)
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)
def dump_arg(self, function, arg):
print ' Trace::BeginArg(%u);' % (arg.index,)
- dump_instance(arg.type, arg.name)
+ self.dump_arg_instance(function, arg)
print ' Trace::EndArg();'
+ def dump_arg_instance(self, function, arg):
+ dump_instance(arg.type, arg.name)
+
def wrap_arg(self, function, arg):
wrap_instance(arg.type, arg.name)
def __init__(self, dllname):
self.dllname = dllname
- def get_function_address(self, function):
- return '__%s' % (function.name,)
-
def header(self, api):
- Tracer.header(self, api)
-
print '''
static HINSTANCE g_hDll = NULL;
static PROC
-__GetProcAddress(LPCSTR lpProcName)
+__getPublicProcAddress(LPCSTR lpProcName)
{
if (!g_hDll) {
char szDll[MAX_PATH] = {0};
return GetProcAddress(g_hDll, lpProcName);
}
- ''' % self.dllname
+#define __abort() OS::Abort()
+''' % self.dllname
+
+ dispatcher = Dispatcher()
+ dispatcher.dispatch_api(api)
+
+ Tracer.header(self, api)