"""Generic retracing code generator."""
+
+import sys
+
import specs.stdapi as stdapi
import specs.glapi as glapi
-from codegen import *
class ConstRemover(stdapi.Rebuilder):
try:
ValueWrapper().visit(arg_type, lvalue, rvalue)
except NotImplementedError:
- print ' // FIXME: %s' % arg.name
+ print ' // XXX: %s' % arg.name
if function.type is not stdapi.Void:
rvalue = '*call.ret'
lvalue = '__result'
try:
ValueWrapper().visit(function.type, lvalue, rvalue)
except NotImplementedError:
- print ' // FIXME: result'
+ success = False
+ print ' // FIXME: result'
+ if not success:
+ if function.name[-1].islower():
+ sys.stderr.write('warning: unsupported %s call\n' % function.name)
def fail_function(self, function):
- print ' if (retrace::verbosity >= 0)'
- print ' std::cerr << "warning: unsupported call %s\\n";' % function.name
+ print ' if (retrace::verbosity >= 0) {'
+ print ' retrace::unsupported(call);'
+ print ' }'
print ' return;'
def extract_arg(self, function, arg, arg_type, lvalue, rvalue):
def filter_function(self, function):
return True
+ table_name = 'retrace::callbacks'
+
def retrace_functions(self, functions):
functions = filter(self.filter_function, functions)
for function in functions:
self.retrace_function(function)
- print 'void retrace::retrace_call(Trace::Call &call) {'
- print ' const char *name = call.name();'
- print
-
- func_dict = dict([(function.name, function) for function in functions])
-
- def handle_case(function_name):
- function = func_dict[function_name]
- print ' retrace_%s(call);' % function.name
- print ' return;'
-
- string_switch('name', func_dict.keys(), handle_case)
-
- print ' retrace_unknown(call);'
- print '}'
+ print 'const retrace::Entry %s[] = {' % self.table_name
+ for function in functions:
+ print ' {"%s", &retrace_%s},' % (function.name, function.name)
+ print ' {NULL, NULL}'
+ print '};'
print