From: sof Date: Tue, 11 Aug 1998 16:03:38 +0000 (+0000) Subject: [project @ 1998-08-11 16:03:38 by sof] X-Git-Tag: Approx_2487_patches~458 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=a33e8a9275aed326b0c8b00dfb43c954dfbe3d22;p=ghc-hetmet.git [project @ 1998-08-11 16:03:38 by sof] Ignore NULL finalisers --- 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);