From a33e8a9275aed326b0c8b00dfb43c954dfbe3d22 Mon Sep 17 00:00:00 2001 From: sof Date: Tue, 11 Aug 1998 16:03:38 +0000 Subject: [PATCH] [project @ 1998-08-11 16:03:38 by sof] Ignore NULL finalisers --- ghc/runtime/storage/SMextn.lc | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/ghc/runtime/storage/SMextn.lc b/ghc/runtime/storage/SMextn.lc index 8c97177..40c0bf8 100644 --- a/ghc/runtime/storage/SMextn.lc +++ b/ghc/runtime/storage/SMextn.lc @@ -244,8 +244,10 @@ sweepUpDeadForeignObjs( ForeignObjList, base, bits ) if ( !( bits[bit_index] & bit ) ) { /* dead */ TRACE_FOdies( FOptr ); - (*(void (*)(StgAddr))((StgAddr)ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); - ForeignObj_deaths++; + if (ForeignObj_CLOSURE_FINALISER(FOptr) != NULL) { + (*(void (*)(StgAddr))(ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); + ForeignObj_deaths++; + } temp = FOptr; FOptr = ForeignObj_CLOSURE_LINK(FOptr); @@ -328,8 +330,10 @@ reportDeadForeignObjs(oldFOList, new, newFOList) /* can't have been forwarded - must be dead */ TRACE_FOdies(FOptr); - (*(void (*)(StgAddr))(ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); - FO_deaths++; + if (ForeignObj_CLOSURE_FINALISER(FOptr) != NULL) { + (*(void (*)(StgAddr))(ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); + FO_deaths++; + } temp = FOptr; FOptr = ForeignObj_CLOSURE_LINK(FOptr); @@ -411,8 +415,13 @@ freeForeigns(foList) if ((P_) INFO_PTR(FOptr) == ForeignObj_info ) { TRACE_ForeignObj(FOptr); TRACE_FOdies(FOptr); - (*(void (*)(StgAddr))(ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); - FO_deaths++; + /* ForeignObjs can have a zapped-out finaliser field, in which + case we'll just drop the object silently. + */ + if (ForeignObj_CLOSURE_FINALISER(FOptr) != NULL) { + (*(void (*)(StgAddr))(ForeignObj_CLOSURE_FINALISER(FOptr)))((StgAddr)ForeignObj_CLOSURE_DATA(FOptr)); + FO_deaths++; + } temp = FOptr; FOptr = ForeignObj_CLOSURE_LINK(FOptr); -- 1.7.10.4