Mesa (master): genxml: Fix python crash when no dwords are found.

Kenneth Graunke kwg at kemper.freedesktop.org
Mon Apr 24 22:14:38 UTC 2017


Module: Mesa
Branch: master
Commit: 4ace73b1f6e8c8d96663a0d8f0f1d61f934e9cb2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4ace73b1f6e8c8d96663a0d8f0f1d61f934e9cb2

Author: Rafael Antognolli <rafael.antognolli at intel.com>
Date:   Fri Mar 31 09:57:22 2017 -0700

genxml: Fix python crash when no dwords are found.

If the 'dwords' dict is empty, max(dwords.keys()) throws an exception.
This case could happen when we have an instruction that is only an array
of other structs, with variable length.

v2:
   - Add another clause for empty dwords and make it work with python 3
   (Dylan)
   - Set the length to 0 if dwords is empty, and do not declare dw

Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
Reviewed-by: Dylan Baker <dylan at pnwbakers.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/intel/genxml/gen_pack_header.py | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/intel/genxml/gen_pack_header.py b/src/intel/genxml/gen_pack_header.py
index 81c64cbbc7..1b1949ff8a 100644
--- a/src/intel/genxml/gen_pack_header.py
+++ b/src/intel/genxml/gen_pack_header.py
@@ -347,7 +347,7 @@ class Group(object):
                 dwords[index + 1] = dwords[index]
                 index = index + 1
 
-    def emit_pack_function(self):
+    def collect_dwords_and_length(self):
         dwords = {}
         self.collect_dwords(dwords, 0, "")
 
@@ -357,9 +357,14 @@ class Group(object):
         # index we've seen plus one.
         if self.size > 0:
             length = self.size // 32
-        else:
+        elif dwords:
             length = max(dwords.keys()) + 1
+        else:
+            length = 0
+
+        return (dwords, length)
 
+    def emit_pack_function(self, dwords, length):
         for index in range(length):
             # Handle MBZ dwords
             if not index in dwords:
@@ -576,10 +581,12 @@ class Parser(object):
         print("static inline void\n%s_pack(__gen_user_data *data, void * restrict dst,\n%sconst struct %s * restrict values)\n{" %
               (name, ' ' * (len(name) + 6), name))
 
-        # Cast dst to make header C++ friendly
-        print("   uint32_t * restrict dw = (uint32_t * restrict) dst;")
+        (dwords, length) = group.collect_dwords_and_length()
+        if length:
+            # Cast dst to make header C++ friendly
+            print("   uint32_t * restrict dw = (uint32_t * restrict) dst;")
 
-        group.emit_pack_function()
+            group.emit_pack_function(dwords, length)
 
         print("}\n")
 




More information about the mesa-commit mailing list