mapi/new: use the static_data offsets in the new generator
authorEmil Velikov <emil.velikov@collabora.com>
Thu, 15 Nov 2018 18:40:21 +0000 (18:40 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Thu, 24 Jan 2019 18:13:25 +0000 (18:13 +0000)
Otherwise the incorrect ones will be used, effectively breaking the ABI.

Note: some entries in static_data.py list a suffixed API, while (for ES*
at least) we expect the one w/o suffix.

v2:
 - rework path handling (Dylan)
 - use else if chain (Erik)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
src/mapi/new/genCommon.py

index ec48d522c05459e83ac1ffbf5ba4afc80f3cfb87..bfcf6ed3eea87f922b9ee89fee82f0a7ca173f6c 100644 (file)
@@ -30,6 +30,11 @@ import re
 import sys
 import xml.etree.cElementTree as etree
 
+import os
+GLAPI = os.path.join(os.path.dirname(__file__), "..", "glapi", "gen")
+sys.path.insert(0, GLAPI)
+import static_data
+
 MAPI_TABLE_NUM_DYNAMIC = 4096
 
 _LIBRARY_FEATURE_NAMES = {
@@ -68,11 +73,24 @@ def getFunctionsFromRoots(roots):
     # Sort the function list by name.
     functions = sorted(functions, key=lambda f: f.name)
 
+    # Lookup for fixed offset/slot functions and use it if available.
     # Assign a slot number to each function. This isn't strictly necessary,
     # since you can just look at the index in the list, but it makes it easier
     # to include the slot when formatting output.
+
+    next_slot = 0
     for i in range(len(functions)):
-        functions[i] = functions[i]._replace(slot=i)
+        name = functions[i].name[2:]
+
+        if name in static_data.offsets:
+            functions[i] = functions[i]._replace(slot=static_data.offsets[name])
+        elif not name.endswith("ARB") and name + "ARB" in static_data.offsets:
+            functions[i] = functions[i]._replace(slot=static_data.offsets[name + "ARB"])
+        elif not name.endswith("EXT") and name + "EXT" in static_data.offsets:
+            functions[i] = functions[i]._replace(slot=static_data.offsets[name + "EXT"])
+        else:
+            functions[i] = functions[i]._replace(slot=next_slot)
+            next_slot += 1
 
     # Sort the function list by slot.... to simplify the diff
     functions = sorted(functions, key=lambda f: f.slot)