X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=dispatch.py;h=95bc36d761d0472ec265fe67fd358f2086d6a32a;hb=4fdd5632465440b4f584a74bd4c171aa225a16e5;hp=bfd332bd5dfd029d54f98dcc43ff6b6ba94e338b;hpb=669b2008e4244152c1c624ca190afaba1a0f2c9a;p=apitrace diff --git a/dispatch.py b/dispatch.py index bfd332b..95bc36d 100644 --- a/dispatch.py +++ b/dispatch.py @@ -28,7 +28,7 @@ """ -import stdapi +import specs.stdapi as stdapi def function_pointer_type(function): @@ -49,34 +49,30 @@ class Dispatcher: # # static __PROC __getPublicProcAddress(const char *name); # static __PROC __getPrivateProcAddress(const char *name); - # static void __abort(void); # raise NotImplementedError def dispatch_api(self, api): for function in api.functions: - self.dispatch_function(function) + self.invokeFunction(function) # define standard name aliases for convenience, but only when not # tracing, as that would cause symbol clashing with the tracing # functions print '#ifdef RETRACE' for function in api.functions: - if not self.is_public_function(function): - print '#define %s __%s' % (function.name, function.name) + print '#define %s __%s' % (function.name, function.name) print '#endif /* RETRACE */' print - def dispatch_function(self, function): - if self.is_public_function(function): - print '#ifndef RETRACE' - print + def invokeFunction(self, function): ptype = function_pointer_type(function) pvalue = function_pointer_value(function) print 'typedef ' + function.prototype('* %s' % ptype) + ';' print 'static %s %s = NULL;' % (ptype, pvalue) print print 'static inline ' + function.prototype('__' + function.name) + ' {' + print ' const char *__name = "%s";' % function.name if function.type is stdapi.Void: ret = '' else: @@ -85,37 +81,35 @@ class Dispatcher: print ' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args])) print '}' print - if self.is_public_function(function): - print '#endif /* !RETRACE */' - print - def is_public_function(self, function): + def isFunctionPublic(self, function): return True def get_true_pointer(self, function): ptype = function_pointer_type(function) pvalue = function_pointer_value(function) - if self.is_public_function(function): + if self.isFunctionPublic(function): get_proc_address = '__getPublicProcAddress' else: get_proc_address = '__getPrivateProcAddress' print ' if (!%s) {' % (pvalue,) - print ' %s = (%s)%s("%s");' % (pvalue, ptype, get_proc_address, function.name) + print ' %s = (%s)%s(__name);' % (pvalue, ptype, get_proc_address) print ' if (!%s) {' % (pvalue,) - self.fail_function(function) + self.failFunction(function) print ' }' print ' }' - def fail_function(self, function): - print ' OS::DebugMessage("error: unavailable function \\"%s\\"\\n");' % function.name - if function.fail is not None: + def failFunction(self, function): + if function.type is stdapi.Void or function.fail is not None: + print r' os::log("warning: ignoring call to unavailable function %s\n", __name);' if function.type is stdapi.Void: - assert function.fail == '' + assert function.fail is None print ' return;' else: - assert function.fail != '' + assert function.fail is not None print ' return %s;' % function.fail else: - print ' __abort();' + print r' os::log("error: unavailable function %s\n", __name);' + print r' os::abort();'