summaryrefslogtreecommitdiff
path: root/rts/include/rts/StablePtr.h
diff options
context:
space:
mode:
Diffstat (limited to 'rts/include/rts/StablePtr.h')
-rw-r--r--rts/include/rts/StablePtr.h7
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);
}