diff options
Diffstat (limited to 'rts/include/rts/StablePtr.h')
-rw-r--r-- | rts/include/rts/StablePtr.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/rts/include/rts/StablePtr.h b/rts/include/rts/StablePtr.h index 73cd5bed4d..2af8c152a3 100644 --- a/rts/include/rts/StablePtr.h +++ b/rts/include/rts/StablePtr.h @@ -31,9 +31,14 @@ extern DLL_IMPORT_RTS spEntry *stable_ptr_table; ATTR_ALWAYS_INLINE EXTERN_INLINE StgPtr deRefStablePtr(StgStablePtr sp) { + // see Note [NULL StgStablePtr] + if (sp == 0) { + return NULL; + } + StgWord spw = (StgWord)sp - 1; // acquire load to ensure that we see the new SPT if it has been recently // enlarged. const spEntry *spt = ACQUIRE_LOAD(&stable_ptr_table); // acquire load to ensure that the referenced object is visible. - return ACQUIRE_LOAD(&spt[(StgWord)sp].addr); + return ACQUIRE_LOAD(&spt[spw].addr); } |