|  |  |  | Garbage Collection (cont.) | 
movethings( heapobject ** root )
{  
    if ( *root != NULL) {
        if (  !(*root)->alreadymoved ) {
                  move the record **root to new heap
                  (*root)->forwardingaddress = newposition
                  (*root)->alreadymoved = TRUE
                  for all ``child''ren of copied root do
                              movethings( & child )
         }
         *root = pointer to new copy of record
      }
}
We can easily tell if the "tagged" values are pointers (or not). The return information may look like pointers (i.e. may be odd), but they won't point to the heap, so a simple test against the heap boundaries will detect them.
|  |  |  | Garbage Collection (cont.) |