On Mon, Oct 27, 2008 at 07:08:26PM +0100, Abdelrazak Younes wrote:

> On 27/10/2008 12:58, rgheck wrote:
> > Tommaso Cucinotta wrote:
> >> Pavel Sanda ha scritto:
> >>> i have put it in. anyway at first try:
> >>> 1. load math manual
> >>> 2. search math exrp E/F
> >>> 3. search
> >>> 4. kaboom
> >> I have tracked down the problem to a much simpler example:
> >> 1. New document
> >> 2. Enter any text containing a double quote character (")
> >> 3. AdvSearch for whatever
> >> 4. Assertion fails
> >>
> >> With a debugger, I could verify that the InsetQuote object points to
> >> a NULL buffer, so the start of the LyX death is this segment:
> >>
> >> InsetQuotes.cpp:183
> >>
> >> docstring InsetQuotes::displayString() const
> >> {
> >>    Language const * loclang = buffer().params().language;
> >>
> >> (this is invoked during the stringification of the paragraphs as due to
> >> the Paragraph::asString() method, when the cursor is right on the quote)
> >>
> >> Now, on one hand I would suspect this to not be related to the AdvSearch
> >> patch, but on the other hand no assertion failure occurs during the 
> >> normal
> >> search.
> >>
> >> Any clue ?
> >>
> > One possibility is that the InsetQuote is being copied, but the copy 
> > isn't getting the buffer set right. I used to know about this but 
> > can't remember now exactly what the issue was or how it got fixed. 
> > Maybe Andre or Abdel will remember.
> 
> As for all insets, the buffer is unset (== set to zero) when the inset 
> is copied (i.e. when put in the c&p stack). It is set again when it is 
> pasted, it is of course set to the Buffer to which the inset is pasted 
> which is not necessarily the same). In the interim period, the buffer is 
> not set and any manipulation not involving cut&paste can be dangerous. I 
> guess the problem here is that AdvSearch manipulates a copy without 
> setting the buffer. The solution I think is to use an interim, internal 
> Buffer in the AdvSearch workArea.

The attached patch avoids the assertion, but then lyx seems to hang
on quit. Maybe something similar to what you fixed recently?

-- 
Enrico
Index: src/lyxfindadv.cpp
===================================================================
--- src/lyxfindadv.cpp  (revisione 27147)
+++ src/lyxfindadv.cpp  (copia locale)
@@ -380,6 +380,7 @@ docstring stringifyFromCursor(Buffer con
   LYXERR(Debug::DEBUG, "Stringifying with len=" << len << " from cursor at 
pos: " << cur);
        if (cur.inTexted()) {
                Paragraph par = cur.paragraph();
+               par.setBuffer(const_cast<Buffer &>(buf));
                // TODO what about searching beyond/across paragraph breaks ?
                // TODO Try adding a AS_STR_INSERTS as last arg
                return par.asString(cur.pos(), ( len == -1 || cur.pos() + len > 
int(par.size()) ) ? int(par.size()) : cur.pos() + len, AS_STR_INSETS);

Reply via email to