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);
/* 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);
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);