[Mesa-dev] [PATCH 5/6] vulkan: enum generator: Stop using iterparse

Jason Ekstrand jason at jlekstrand.net
Thu Sep 21 19:11:22 UTC 2017


On Thu, Sep 21, 2017 at 10:34 AM, Dylan Baker <dylan at pnwbakers.com> wrote:

> Quoting Jason Ekstrand (2017-09-21 08:32:22)
> > While using iterparse is potentially a little more efficient, the Vulkan
> > registry XML is not large and using regular element tree simplifies the
> > parsing logic substantially.
> > ---
> >  src/vulkan/util/gen_enum_to_str.py | 41 +++++++++++++++---------------
> --------
> >  1 file changed, 16 insertions(+), 25 deletions(-)
> >
> > diff --git a/src/vulkan/util/gen_enum_to_str.py
> b/src/vulkan/util/gen_enum_to_str.py
> > index 8f32102..e5f8964 100644
> > --- a/src/vulkan/util/gen_enum_to_str.py
> > +++ b/src/vulkan/util/gen_enum_to_str.py
> > @@ -157,31 +157,22 @@ def parse_xml(enum_factory, ext_factory, filename):
> >      of VkEnum objects.
> >      """
> >
> > -    with open(filename, 'rb') as f:
> > -        context = iter(et.iterparse(f, events=('start', 'end')))
> > -
> > -        # This gives the root element, since goal is to iterate over the
> > -        # elements without building a tree, this allows the root to be
> cleared
> > -        # (erase the elements) after the children have been processed.
> > -        _, root = next(context)
> > -
> > -        for event, elem in context:
> > -            if event == 'end' and elem.tag == 'enums':
> > -                type_ = elem.attrib.get('type')
> > -                if type_ == 'enum':
> > -                    enum = enum_factory(elem.attrib['name'])
> > -                    enum.values.extend([e.attrib['name'] for e in elem
> > -                                        if e.tag == 'enum'])
> > -            elif event == 'start' and elem.tag == 'extension':
> > -                ext_factory(elem.attrib['name'],
> int(elem.attrib['number']))
> > -            elif event == 'end' and elem.tag == 'extension':
> > -                if elem.attrib['supported'] != 'vulkan':
> > -                    continue
> > -                for e in elem.findall('.//enum[@extends][@offset]'):
> > -                    enum = enum_factory(e.attrib['extends'])
> > -                    enum.values.append(e.attrib['name'],)
> > -
> > -            root.clear()
> > +    xml = et.parse(filename)
> > +
> > +    for enum_type in xml.findall('./enums'):
> > +        if enum_type.attrib.get('type') != 'enum':
> > +            continue
>
> please do not use continue for iterating xlm. xpath is more than capable of
> representing this in less code, and it's implemented in C so it will be
> much
> faster.
>
> for enum_type in xml.findall('./enums[@type="enum"]')
>

Done.


> > +
> > +        enum = enum_factory(enum_type.attrib['name'])
> > +        for value in enum_type.findall('./enum'):
> > +            enum.values.append(value.attrib['name'])
> > +
> > +    for ext_elem in xml.findall('./extension'):
> > +        if ext_elem.attrib['supported'] != 'vulkan':
> > +            continue
>
> please do the same thing here.
>

Done.


> > +
> > +        ext_factory(ext_elem.attrib['name'],
> > +                    int(ext_elem.attrib['number']))
> >
> >  def main():
> >      parser = argparse.ArgumentParser()
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170921/bd42b88f/attachment.html>


More information about the mesa-dev mailing list