Skip to content

Commit 845542e

Browse files
committed
[[ Bug 15612 ]] Reinstate MCtodestroy stack list.
When reworking object deletion to be more prompty, the pending destroyed stack list was replaced by the same object deletion process. However, this was incorrect. MCtodestroy is a list of stacks which are pending deletion due to the 'destroyStack' requirement being satisfied. These are always deleted at the next main loop iteration, rather than immediately. (This ensures destroyStack works even if handlers in the stack are currently executing).
1 parent 072b772 commit 845542e

8 files changed

Lines changed: 28 additions & 2 deletions

File tree

engine/src/chunk.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2854,6 +2854,8 @@ Exec_stat MCChunk::del(MCExecPoint &ep)
28542854
MCeerror->add(EE_CHUNK_CANTDELETEOBJECT, line, pos);
28552855
return ES_ERROR;
28562856
}
2857+
if (objptr->gettype() == CT_STACK)
2858+
MCtodestroy->remove((MCStack *)objptr);
28572859
objptr->scheduledelete();
28582860
}
28592861
else

engine/src/cmdsc.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,11 @@ Exec_errors MCClipboardCmd::processtoclipboard(MCObjectRef *p_objects, uint4 p_o
592592
for(uint4 i = 0; i < p_object_count; ++i)
593593
{
594594
if (p_objects[i] . object -> del())
595+
{
596+
if (p_objects[i] . object -> gettype() == CT_STACK)
597+
MCtodestroy -> remove(static_cast<MCStack *>(p_objects[i] . object));
595598
p_objects[i] . object -> scheduledelete();
599+
}
596600
}
597601
}
598602
}

engine/src/dskmain.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ void X_main_loop_iteration()
336336
MCtracedobject->message(MCM_trace_done);
337337
MCtracedobject = NULL;
338338
}
339+
if (!MCtodestroy -> isempty())
340+
{
341+
MCtooltip -> settip(NULL);
342+
MCtodestroy -> destroy();
343+
}
339344
MCU_cleaninserted();
340345
MCscreen->siguser();
341346
MCdefaultstackptr = MCstaticdefaultstackptr;

engine/src/globals.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ uint2 MCdragdelta = 4;
247247
MCUndolist *MCundos;
248248
MCSellist *MCselected;
249249
MCStacklist *MCstacks;
250+
MCStacklist *MCtodestroy;
250251
MCCardlist *MCrecent;
251252
MCCardlist *MCcstack;
252253
MCDispatch *MCdispatcher;
@@ -632,6 +633,7 @@ void X_clear_globals(void)
632633
MCundos = nil;
633634
MCselected = nil;
634635
MCstacks = nil;
636+
MCtodestroy = nil;
635637
MCrecent = nil;
636638
MCcstack = nil;
637639
MCdispatcher = nil;
@@ -927,6 +929,7 @@ bool X_open(int argc, char *argv[], char *envp[])
927929
MCundos = new MCUndolist;
928930
MCselected = new MCSellist;
929931
MCstacks = new MCStacklist;
932+
MCtodestroy = new MCStacklist;
930933
MCrecent = new MCCardlist;
931934
MCcstack = new MCCardlist;
932935

@@ -1120,6 +1123,7 @@ int X_close(void)
11201123
delete MCtemplateimage;
11211124
delete MCtemplatefield;
11221125
delete MCselected;
1126+
delete MCtodestroy;
11231127
delete MCstacks;
11241128
delete MCcstack;
11251129
delete MCrecent;

engine/src/globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ extern Boolean MCownselection;
161161
extern MCUndolist *MCundos;
162162
extern MCSellist *MCselected;
163163
extern MCStacklist *MCstacks;
164+
extern MCStacklist *MCtodestroy;
164165
extern MCCardlist *MCrecent;
165166
extern MCCardlist *MCcstack;
166167
extern MCDispatch *MCdispatcher;

engine/src/mblmain.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ bool X_main_loop_iteration(void)
141141
// MW-2011-08-26: [[ Redraw ]] Make sure we flush any updates.
142142
MCRedrawUpdateScreen();
143143
MCabortscript = False;
144+
if (!MCtodestroy -> isempty())
145+
{
146+
MCtooltip -> settip(NULL);
147+
MCtodestroy -> destroy();
148+
}
144149
MCU_cleaninserted();
145150
MCscreen->siguser();
146151
MCdefaultstackptr = MCstaticdefaultstackptr;

engine/src/sellst.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,11 @@ bool MCSellist::clipboard(bool p_is_cut)
425425
if (tptr -> ref -> getstack() -> iskeyed())
426426
{
427427
if (tptr -> ref -> del())
428+
{
429+
if (tptr -> ref -> gettype() == CT_STACK)
430+
MCtodestroy -> remove(static_cast<MCStack *>(tptr -> ref));
428431
tptr -> ref -> scheduledelete();
432+
}
429433
}
430434

431435
delete tptr;

engine/src/stack2.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ void MCStack::checkdestroy()
112112
}
113113
while (sptr != substacks);
114114
}
115-
del();
116-
scheduledelete();
115+
MCtodestroy -> remove(this);
116+
MCtodestroy -> add(this);
117117
}
118118
}
119119
else if (!MCdispatcher -> is_transient_stack(this))
@@ -1690,6 +1690,7 @@ Exec_stat MCStack::openrect(const MCRectangle &rel, Window_mode wm, MCStack *par
16901690
if (state & (CS_IGNORE_CLOSE | CS_NO_FOCUS | CS_DELETE_STACK))
16911691
return ES_NORMAL;
16921692

1693+
MCtodestroy -> remove(this);
16931694
if (wm == WM_LAST)
16941695
if (opened)
16951696
wm = mode;

0 commit comments

Comments
 (0)