Re: IndexError exception in platypus.paraparser

Germán M. Bravo <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <CA+98EDkYrJRjFChdY692tE=v0Q7p6PoKBXk7R8ySdjW_8DX5pw@mail.gmail.com>
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).
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.