def retraceFunctionBody(self, function):
assert function.sideeffects
+ if function.type is not stdapi.Void:
+ self.checkOrigResult(function)
+
self.deserializeArgs(function)
+ self.declareRet(function)
self.invokeFunction(function)
self.swizzleValues(function)
def retraceInterfaceMethodBody(self, interface, method):
assert method.sideeffects
+ if method.type is not stdapi.Void:
+ self.checkOrigResult(method)
+
self.deserializeThisPointer(interface)
self.deserializeArgs(method)
+ self.declareRet(method)
self.invokeInterfaceMethod(interface, method)
self.swizzleValues(method)
+ def checkOrigResult(self, function):
+ '''Hook for checking the original result, to prevent succeeding now
+ where the original did not, which would cause diversion and potentially
+ unpredictable results.'''
+
+ assert function.type is not stdapi.Void
+
+ if str(function.type) == 'HRESULT':
+ print r' if (call.ret && FAILED(call.ret->toSInt())) {'
+ print r' return;'
+ print r' }'
+
def deserializeThisPointer(self, interface):
print r' %s *_this;' % (interface.name,)
print r' _this = static_cast<%s *>(_obj_map[call.arg(0).toUIntPtr()]);' % (interface.name,)
visitor = SwizzledValueRegistrator()
visitor.visit(type, lvalue, rvalue)
+ def declareRet(self, function):
+ if function.type is not stdapi.Void:
+ print ' %s _result;' % (function.type)
+
def invokeFunction(self, function):
arg_names = ", ".join(function.argNames())
if function.type is not stdapi.Void:
- print ' %s _result;' % (function.type)
print ' _result = %s(%s);' % (function.name, arg_names)
print ' (void)_result;'
else:
arg_names = ", ".join(method.argNames())
if method.type is not stdapi.Void:
- print ' %s _result;' % (method.type)
print ' _result = _this->%s(%s);' % (method.name, arg_names)
print ' (void)_result;'
else:
functions = filter(self.filterFunction, api.functions)
for function in functions:
- if function.sideeffects:
+ if function.sideeffects and not function.internal:
self.retraceFunction(function)
interfaces = api.getAllInterfaces()
for interface in interfaces:
for method in interface.iterMethods():
- if method.sideeffects:
+ if method.sideeffects and not method.internal:
self.retraceInterfaceMethod(interface, method)
print 'const retrace::Entry %s[] = {' % self.table_name
for function in functions:
- if function.sideeffects:
- print ' {"%s", &retrace_%s},' % (function.name, function.name)
- else:
- print ' {"%s", &retrace::ignore},' % (function.name,)
+ if not function.internal:
+ if function.sideeffects:
+ print ' {"%s", &retrace_%s},' % (function.name, function.name)
+ else:
+ print ' {"%s", &retrace::ignore},' % (function.name,)
for interface in interfaces:
for method in interface.iterMethods():
if method.sideeffects: