Module: Mesa
Branch: main
Commit: a8a50332a66352d06b17acd93f74103ec456d765
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a8a50332a66352d06b17acd93f74103ec456d765

Author: Jordan Justen <[email protected]>
Date:   Fri Dec 23 11:42:59 2022 -0800

intel/genxml: Convert gen_bits_header to use ElementTree

Signed-off-by: Jordan Justen <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24547>

---

 src/intel/genxml/gen_bits_header.py | 43 ++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/src/intel/genxml/gen_bits_header.py 
b/src/intel/genxml/gen_bits_header.py
index f6ddc569ce1..f0c3ab9cbc7 100644
--- a/src/intel/genxml/gen_bits_header.py
+++ b/src/intel/genxml/gen_bits_header.py
@@ -21,7 +21,7 @@
 
 import argparse
 import os
-import xml.parsers.expat
+import xml.etree.ElementTree as et
 
 from mako.template import Template
 from util import *
@@ -240,43 +240,42 @@ class Field(object):
 class XmlParser(object):
 
     def __init__(self, containers):
-        self.parser = xml.parsers.expat.ParserCreate()
-        self.parser.StartElementHandler = self.start_element
-        self.parser.EndElementHandler = self.end_element
-
         self.gen = None
         self.containers = containers
         self.container_stack = []
         self.container_stack.append(None)
 
     def parse(self, filename):
-        with open(filename, 'rb') as f:
-            self.parser.ParseFile(f)
-
-    def start_element(self, name, attrs):
-        if name == 'genxml':
-            self.gen = Gen(attrs['gen'])
-        elif name in ('instruction', 'struct', 'register'):
+        xml = et.parse(filename)
+        root = xml.getroot()
+        self.gen = Gen(root.attrib['gen'])
+        for item in root:
+            self.process_item(item)
+
+    def process_item(self, item):
+        name = item.tag
+        attrs = item.attrib
+        if name in ('instruction', 'struct', 'register'):
             if name == 'instruction' and 'engine' in attrs:
                 engines = set(attrs['engine'].split('|'))
                 if not engines & self.engines:
                     self.container_stack.append(None)
                     return
             self.start_container(attrs)
+            for struct_item in item:
+                self.process_item(struct_item)
+            self.container_stack.pop()
         elif name == 'group':
             self.container_stack.append(None)
+            for group_item in item:
+                self.process_item(group_item)
+            self.container_stack.pop()
         elif name == 'field':
-            self.start_field(attrs)
-        else:
+            self.process_field(attrs)
+        elif name == 'enum':
             pass
-
-    def end_element(self, name):
-        if name == 'genxml':
-            self.gen = None
-        elif name in ('instruction', 'struct', 'register', 'group'):
-            self.container_stack.pop()
         else:
-            pass
+            assert False
 
     def start_container(self, attrs):
         assert self.container_stack[-1] is None
@@ -286,7 +285,7 @@ class XmlParser(object):
         self.container_stack.append(self.containers[name])
         self.container_stack[-1].add_gen(self.gen, attrs)
 
-    def start_field(self, attrs):
+    def process_field(self, attrs):
         if self.container_stack[-1] is None:
             return
 

Reply via email to