diff --git a/.gitattributes b/.gitattributes index c370c64da3..fbde46ca38 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16498,6 +16498,7 @@ tests/webtbs/tw3492.pp svneol=native#text/plain tests/webtbs/tw3494.pp svneol=native#text/plain tests/webtbs/tw34971.pp svneol=native#text/plain tests/webtbs/tw3499.pp svneol=native#text/plain +tests/webtbs/tw35028.pp svneol=native#text/pascal tests/webtbs/tw3504.pp svneol=native#text/plain tests/webtbs/tw3506.pp svneol=native#text/plain tests/webtbs/tw3523.pp svneol=native#text/plain diff --git a/rtl/objpas/classes/classes.inc b/rtl/objpas/classes/classes.inc index a5011a4728..7021c27a37 100644 --- a/rtl/objpas/classes/classes.inc +++ b/rtl/objpas/classes/classes.inc @@ -308,9 +308,12 @@ begin if (GetCurrentThreadID = MainThreadID) and (not aQueueIfMain or not IsMultiThread) then {$endif} begin - ExecuteThreadQueueEntry(aEntry); - if not Assigned(aEntry^.SyncEvent) then - Dispose(aEntry); + try + ExecuteThreadQueueEntry(aEntry); + finally + if not Assigned(aEntry^.SyncEvent) then + Dispose(aEntry); + end; {$ifdef FPC_HAS_FEATURE_THREADING} end else begin { store thread and whether we're dealing with a synchronized event; the diff --git a/tests/webtbs/tw35028.pp b/tests/webtbs/tw35028.pp new file mode 100644 index 0000000000..b6e1b99368 --- /dev/null +++ b/tests/webtbs/tw35028.pp @@ -0,0 +1,31 @@ +{ %OPT=-gh } + +program tw35028; + +{$mode objfpc} + +uses +{$ifdef unix} + cthreads, +{$endif} + Classes; + +type + TTest = class + procedure Test; + end; + +procedure TTest.Test; +begin + raise TObject.Create; +end; + +var + t: TTest; +begin + HaltOnNotReleased := True; + try + TThread.Queue(Nil, @t.Test); + except + end; +end.