]> git.cworth.org Git - apitrace/blobdiff - trace.py
Several DX7 corrections.
[apitrace] / trace.py
index 7b2ba73941fa60c91aab68326b4838221b050a02..368462a917579a90c16989fef5a84dff0c6aa159 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -73,12 +73,15 @@ class DumpDeclarator(stdapi.OnceVisitor):
     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):
@@ -90,7 +93,7 @@ class DumpDeclarator(stdapi.OnceVisitor):
         print '        Trace::LiteralSInt(value);'
         print '        return;'
         print '    }'
-        print '        Trace::LiteralEnum(sig);'
+        print '    Trace::LiteralEnum(sig);'
         print '}'
         print
 
@@ -152,7 +155,7 @@ class DumpImplementer(stdapi.Visitor):
         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)
@@ -175,7 +178,7 @@ class DumpImplementer(stdapi.Visitor):
         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)
@@ -249,7 +252,7 @@ class Wrapper(stdapi.Visitor):
     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)
 
 
@@ -258,7 +261,7 @@ class Unwrapper(Wrapper):
     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)
 
 
@@ -268,7 +271,12 @@ unwrap_instance = Unwrapper().visit
 
 class Tracer:
 
+    def __init__(self):
+        self.api = None
+
     def trace_api(self, api):
+        self.api = api
+
         self.header(api)
 
         # Includes
@@ -313,8 +321,15 @@ class Tracer:
     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)
@@ -417,8 +432,15 @@ class Tracer:
             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)'
@@ -434,9 +456,6 @@ class DllTracer(Tracer):
     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;
@@ -462,7 +481,8 @@ __getPublicProcAddress(LPCSTR lpProcName)
     return GetProcAddress(g_hDll, lpProcName);
 }
 
-    ''' % self.dllname
+#define __abort() OS::Abort()
+''' % self.dllname
 
         dispatcher = Dispatcher()
         dispatcher.dispatch_api(api)