Re: IndexError exception in platypus.paraparser
Germán M. Bravo <[email protected]>
| Newsgroups | gmane.comp.python.reportlab.user |
|---|---|
| Message-ID | <CA+98EDnp2a=uM0JHYxKSHT7StgKN9tqAOfVMfiXp23YtiZAgqA@mail.gmail.com> |
Please do consider changing this bit (at least I have not been having any more problems after this patch) On Thu, Dec 31, 2015 at 11:32 AM, Germán M. Bravo <[email protected]> wrote: > This definitely fixes the IndexError exception I've been getting. > > I applied this monkey patch to fix it: > > # FIXME: This monkeypatches rml2pdf.TTParagraphMixin so _parser is no > longer > # a shared instance of TTParser class defined as a class property > rml2pdf.TTParagraphMixin._parser = property(lambda self: setattr(self, > '__parser', self.__dict__.get('__parser') or rml2pdf.TTParser()) or > self.__parser) > > > On Thu, Dec 31, 2015 at 1:35 AM, Germán M. Bravo <[email protected]> > wrote: > >> I'm working with ReportLab in a threaded environment and I've been >> getting a weird exception about IndexError when doing some operations such >> as _pop() during platypus.paraparser.ParaParser.end_br(). I think I've >> tracked the error down the fact _stack is a member of the TTParser instance >> (using rml2pdf). >> >> After googling around, I found a place where the source code of rml2pdf >> shows this: >> >> class TTParagraphMixin: >> _CLEAN_SPACE = 0 >> _parser = TTParser() >> ... >> >> Then, doing: >> >> from rlextra.rml2pdf import rml2pdf >> print(repr(rml2pdf.TTParagraphMixin._parser)) >> >> confirms TTParser is an instance: <rlextra.rml2pdf.rml2pdf.TTParser >> instance at 0x1053eae18> >> >> This means TTParser instance there is an instance placed as a property of >> TTParagraphMixin at class level (which means it's shared by all instances >> of TTParagraph, TTXPreformatted and others) ...but (at least) >> TTParser._stack could be modified by several threads at the same time >> (causing the aforesaid exception to raise from time to time). >> >> >