Hmm... I did step 4 in order to have the status bar deleted and that's why I was removing myself (the QTMInteractivePrompt) from it before doing that, because otherwise it would have blown. But then, what you say makes sense and is perfectly consistent with my so-called fix preventing the crash, but just incidentally...
I'll have to be more careful next time, sorry. ________________ Miguel de Benito. On Sat, Nov 6, 2010 at 23:35, Gubinelli Massimiliano <[email protected]>wrote: > Hi Miguel, > the fix is not quite correct. I've committed an alternative fix. The > reasong for the crash is the following (according to my understanding) > in QTMInteractivePrompt::exec() > 1. you create a temporary status bar > 2. you add the prompt to the status bar (so it become children of the > status bar, according to docs) > 3. you add the status bar to the window (so it become children of the > window, according to docs) > 4. after execution you remove the status bar from the window (but its > parent remains the window) > 5. when the status bar is released (somewhere, somehow) it tries to release > the interactive prompt which is allocated on the stack (and already freed) > so you get the crash. > > My solution is to reset the parent of the interactive prompt and to > explicitly delete the temporary status bar. Usually if you allocate an > object you have to be sure that it will be deallocated at appropriate time. > Maybe put comments to signal when you think it will be most probably > deallocated. > > > Best > max > > On 6 nov. 2010, at 19:20, Miguel de Benito Delgado wrote: > > It looks like I'm on a roll! ;) First the fix, in case you don't have time > to waste on my ramblings: > > File qt_dialogues.cpp, line 718 onward, change to: > > QTMInteractivePrompt* _prompt = new QTMInteractivePrompt(label, items, > to_qstring(it->type), tm_mainwindow()); > > > if (_prompt->exec() == QDialog::Accepted) { > QString text = _prompt->currentText(); > ((qt_input_text_widget_rep*) int_input.rep) -> text = scm_quote ( > from_qstring (text)); > ((qt_input_text_widget_rep*) int_input.rep) -> cmd (); > } else { > // ((qt_input_text_widget_rep*) int_input.rep) -> text="#f"; > } > delete _prompt; > } > > And here's the bug: > > 1. Take any document and manually create a fake autosave file (i.e. > with the trailing tilde) which is newer. > 2. Open the document in TeXmacs QT (svn), with the new interactive > prompt and the option to show interactive messages on the status bar. > 3. The shiny new interactive prompt kicks in, asks whether you want to > load the newer autosaved file. > 4. Say whatever you want, it crashes on you. > > Seems like qt_tm_widget_rep::write is doing tw->removeWidget(old_canvas); and > this kills because the QTMInteractivePrompt had been created on the stack > and someone is trying to delete it. Or that's my guess. > > Kind regards, > ________________ > Miguel de Benito. > _______________________________________________ > Texmacs-dev mailing list > [email protected] > http://lists.gnu.org/mailman/listinfo/texmacs-dev > > > > _______________________________________________ > Texmacs-dev mailing list > [email protected] > http://lists.gnu.org/mailman/listinfo/texmacs-dev > >
_______________________________________________ Texmacs-dev mailing list [email protected] http://lists.gnu.org/mailman/listinfo/texmacs-dev
