Handle IND_STATIC in isRetainer
[ghc-hetmet.git] / rts / RetainerProfile.c
index b5db15a..07a3db4 100644 (file)
@@ -466,8 +466,6 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child )
        *first_child = ((StgSelector *)c)->selectee;
        return;
     case IND_PERM:
-    case IND_OLDGEN_PERM:
-    case IND_OLDGEN:
     case BLACKHOLE:
        *first_child = ((StgInd *)c)->indirectee;
        return;
@@ -921,8 +919,6 @@ pop( StgClosure **c, StgClosure **cp, retainer *r )
        case MUT_VAR_DIRTY:
        case THUNK_SELECTOR:
        case IND_PERM:
-       case IND_OLDGEN_PERM:
-       case IND_OLDGEN:
        case CONSTR_1_1:
            // cannot appear
        case PAP:
@@ -1058,8 +1054,10 @@ isRetainer( StgClosure *c )
     case PAP:
        // indirection
     case IND_PERM:
-    case IND_OLDGEN_PERM:
-    case IND_OLDGEN:
+    // IND_STATIC used to be an error, but at the moment it can happen
+    // as isAlive doesn't look through IND_STATIC as it ignores static
+    // closures. See trac #3956 for a program that hit this error.
+    case IND_STATIC:
     case BLACKHOLE:
        // static objects
     case CONSTR_STATIC:
@@ -1075,8 +1073,6 @@ isRetainer( StgClosure *c )
        //
        // Error case
        //
-       // IND_STATIC cannot be *c, *cp, *r in the retainer profiling loop.
-    case IND_STATIC:
        // CONSTR_NOCAF_STATIC
        // cannot be *c, *cp, *r in the retainer profiling loop.
     case CONSTR_NOCAF_STATIC: