file.write('} // namespace gfx\n')
+def GetUniquelyNamedFunctions(functions):
+ uniquely_named_functions = {}
+
+ for func in functions:
+ for version in func['versions']:
+ uniquely_named_functions[version['name']] = ({
+ 'name': version['name'],
+ 'return_type': func['return_type'],
+ 'arguments': func['arguments'],
+ 'known_as': func['known_as']
+ })
+ return uniquely_named_functions
+
+
def GenerateMockBindingsHeader(file, functions):
"""Headers for functions that invoke MockGLInterface members"""
// This file is automatically generated.
""")
- for func in functions:
+ uniquely_named_functions = GetUniquelyNamedFunctions(functions)
+
+ for key in sorted(uniquely_named_functions.iterkeys()):
+ func = uniquely_named_functions[key]
file.write('static %s GL_BINDING_CALL Mock_%s(%s);\n' %
- (func['return_type'], func['known_as'], func['arguments']))
+ (func['return_type'], func['name'], func['arguments']))
+
def GenerateMockBindingsSource(file, functions):
"""Generates functions that invoke MockGLInterface members and a
#include "ui/gl/gl_mock.h"
namespace gfx {
+
+// This is called mainly to prevent the compiler combining the code of mock
+// functions with identical contents, so that their function pointers will be
+// different.
+void MakeFunctionUnique(const char *func_name) {
+ VLOG(2) << "Calling mock " << func_name;
+}
+
""")
# Write functions that trampoline into the set MockGLInterface instance.
- for func in functions:
+ uniquely_named_functions = GetUniquelyNamedFunctions(functions)
+ sorted_function_names = sorted(uniquely_named_functions.iterkeys())
+
+ for key in sorted_function_names:
+ func = uniquely_named_functions[key]
file.write('\n')
file.write('%s GL_BINDING_CALL MockGLInterface::Mock_%s(%s) {\n' %
- (func['return_type'], func['known_as'], func['arguments']))
+ (func['return_type'], func['name'], func['arguments']))
+ file.write(' MakeFunctionUnique("%s");\n' % func['name'])
arg_re = r'(const )?[a-zA-Z0-9]+((\s*const\s*)?\*)* ([a-zA-Z0-9]+)'
argument_names = re.sub(arg_re, r'\4', func['arguments'])
if argument_names == 'void':
file.write('\n')
file.write('void* GL_BINDING_CALL ' +
'MockGLInterface::GetGLProcAddress(const char* name) {\n')
- for func in functions:
- unique_names = set([version['name'] for version in func['versions']])
- for name in unique_names:
- file.write(' if (strcmp(name, "%s") == 0)\n' % name)
- file.write(
- ' return reinterpret_cast<void*>(Mock_%s);\n' % func['known_as'])
+ for key in sorted_function_names:
+ name = uniquely_named_functions[key]['name']
+ file.write(' if (strcmp(name, "%s") == 0)\n' % name)
+ file.write(' return reinterpret_cast<void*>(Mock_%s);\n' % name)
# Always return a non-NULL pointer like some EGL implementations do.
file.write(' return reinterpret_cast<void*>(&MockInvalidFunction);\n')
file.write('}\n')