]> git.cworth.org Git - apitrace/blobdiff - retrace/dllretrace.py
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / retrace / dllretrace.py
index 4fd481ca967560d2226a4b15d5c2571e1cf749fb..aa7ed45ada0ffbbd143f7e42b2340828dbaede0e 100644 (file)
 
 from retrace import Retracer
 from dispatch import Dispatcher
+from specs.stdapi import API
 
 
 class DllDispatcher(Dispatcher):
 
-    def dispatchApi(self, api):
-        tag = api.name.upper()
+    def dispatchModule(self, module):
+        tag = module.name.upper()
         print r'const char *g_sz%sDllName = NULL;' % (tag,)
         print r'HMODULE g_h%sModule = NULL;' % (tag,)
         print r''
         print r'static PROC'
-        print r'_getPublicProcAddress(LPCSTR lpProcName) {'
+        print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
         print r'    if (!g_h%sModule) {' % tag
         print r'        if (g_sz%sDllName) {' % tag
         print r'            g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
@@ -45,10 +46,10 @@ class DllDispatcher(Dispatcher):
         print r'            }'
         print r'        }'
         print r'        if (!g_h%sModule) {' % tag
-        print r'            g_h%sModule = LoadLibraryA("%s.dll");' % (tag, api.name)
+        print r'            g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name)
         print r'        }'
         print r'        if (!g_h%sModule) {' % tag
-        print r'            os::log("error: failed to load %s.dll\n");' % api.name
+        print r'            os::log("error: failed to load %s.dll\n");' % module.name
         print r'            exit(1);'
         print r'        }'
         print r'    }'
@@ -56,14 +57,18 @@ class DllDispatcher(Dispatcher):
         print r'}'
         print r''
 
-        Dispatcher.dispatchApi(self, api)
+        Dispatcher.dispatchModule(self, module)
+
+    def getProcAddressName(self, module, function):
+        assert self.isFunctionPublic(module, function)
+        return '_get%sProcAddress' % (module.name.upper())
 
 
 class DllRetracer(Retracer):
 
     def retraceApi(self, api):
-        dispatcher = DllDispatcher()
-        dispatcher.dispatchApi(api)
+        for module in api.modules:
+            dispatcher = DllDispatcher()
+            dispatcher.dispatchModule(module)
 
         Retracer.retraceApi(self, api)
-