diff --git a/docs/notes/bugfix-22130.md b/docs/notes/bugfix-22130.md new file mode 100644 index 00000000000..4f8c4596a74 --- /dev/null +++ b/docs/notes/bugfix-22130.md @@ -0,0 +1 @@ +# Improve stability of breakpoint manipulation in the S/E whilst debugging diff --git a/engine/src/debug.cpp b/engine/src/debug.cpp index 3631bee9cc7..a5fcf6451ec 100644 --- a/engine/src/debug.cpp +++ b/engine/src/debug.cpp @@ -284,7 +284,9 @@ void MCB_prepmessage(MCExecContext &ctxt, MCNameRef mess, uint2 line, uint2 pos, p3.setnext(&p4); p4.setvalueref_argument(p_info); } - MCB_message(ctxt, mess, &p1); + MCDeletedObjectsFreezePool(); + MCB_message(ctxt, mess, &p1); + MCDeletedObjectsThawPool(); if (id != 0) MCeerror->clear(); if (added) diff --git a/engine/src/object.cpp b/engine/src/object.cpp index ba06d055ad4..7e0d927c8a7 100644 --- a/engine/src/object.cpp +++ b/engine/src/object.cpp @@ -5519,6 +5519,7 @@ struct MCDeletedObjectPool static MCDeletedObjectPool *MCsparedeletedobjectpool = nil; static MCDeletedObjectPool *MCdeletedobjectpool = nil; static MCDeletedObjectPool *MCrootdeletedobjectpool = nil; +static uint32_t MCdeletedobjectpoolfreezedepth = 0; static bool MCDeletedObjectPoolCreate(MCDeletedObjectPool*& r_pool) { @@ -5604,8 +5605,22 @@ void MCDeletedObjectsTeardown(void) } } +void MCDeletedObjectsFreezePool(void) +{ + MCdeletedobjectpoolfreezedepth += 1; +} + +void MCDeletedObjectsThawPool(void) +{ + MCdeletedobjectpoolfreezedepth -= 1; +} + void MCDeletedObjectsEnterWait(bool p_dispatching) { + // If the current pool is frozen, do nothing + if (MCdeletedobjectpoolfreezedepth > 0) + return; + // If this isn't a dispatching wait, then no objects can be created. if (!p_dispatching) return; @@ -5632,6 +5647,10 @@ void MCDeletedObjectsEnterWait(bool p_dispatching) void MCDeletedObjectsLeaveWait(bool p_dispatching) { + // If the current pool is frozen, do nothing + if (MCdeletedobjectpoolfreezedepth > 0) + return; + // If this isn't a dispatching wait, then no objects can be created. if (!p_dispatching) return; diff --git a/engine/src/object.h b/engine/src/object.h index 49521f35c22..77c667f8768 100644 --- a/engine/src/object.h +++ b/engine/src/object.h @@ -506,6 +506,8 @@ struct MCExecValue; struct MCDeletedObjectPool; void MCDeletedObjectsSetup(void); void MCDeletedObjectsTeardown(void); +void MCDeletedObjectsFreezePool(void); +void MCDeletedObjectsThawPool(void); void MCDeletedObjectsEnterWait(bool p_dispatching); void MCDeletedObjectsLeaveWait(bool p_dispatching); void MCDeletedObjectsOnObjectCreated(MCObject *object);