Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ui / gl / generate_bindings.py
index 3bcfb54..8840766 100755 (executable)
@@ -1724,6 +1724,20 @@ namespace gfx {
   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"""
 
@@ -1735,9 +1749,13 @@ def GenerateMockBindingsHeader(file, functions):
 // 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
@@ -1755,12 +1773,25 @@ def GenerateMockBindingsSource(file, functions):
 #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':
@@ -1786,12 +1817,10 @@ namespace gfx {
   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')