+ else if (GC_WINDOWP (obj))
+ {
+ register struct Lisp_Vector *ptr = XVECTOR (obj);
+ struct window *w = XWINDOW (obj);
+ register EMACS_INT size = ptr->size;
+ /* The reason we use ptr1 is to avoid an apparent hardware bug
+ that happens occasionally on the FSF's HP 300s.
+ The bug is that a2 gets clobbered by recursive calls to mark_object.
+ The clobberage seems to happen during function entry,
+ perhaps in the moveml instruction.
+ Yes, this is a crock, but we have to do it. */
+ struct Lisp_Vector *volatile ptr1 = ptr;
+ register int i;
+
+ /* Stop if already marked. */
+ if (size & ARRAY_MARK_FLAG)
+ break;
+
+ /* Mark it. */
+ ptr->size |= ARRAY_MARK_FLAG;
+
+ /* There is no Lisp data above The member CURRENT_MATRIX in
+ struct WINDOW. Stop marking when that slot is reached. */
+ for (i = 0;
+ (char *) &ptr1->contents[i] < (char *) &w->current_matrix;
+ i++)
+ mark_object (&ptr1->contents[i]);
+
+ /* Mark glyphs for leaf windows. Marking window matrices is
+ sufficient because frame matrices use the same glyph
+ memory. */
+ if (NILP (w->hchild)
+ && NILP (w->vchild)
+ && w->current_matrix)
+ {
+ mark_glyph_matrix (w->current_matrix);
+ mark_glyph_matrix (w->desired_matrix);
+ }
+ }
+ else if (GC_HASH_TABLE_P (obj))
+ {
+ struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
+ EMACS_INT size = h->size;
+
+ /* Stop if already marked. */
+ if (size & ARRAY_MARK_FLAG)
+ break;
+
+ /* Mark it. */
+ h->size |= ARRAY_MARK_FLAG;
+
+ /* Mark contents. */
+ mark_object (&h->test);
+ mark_object (&h->weak);
+ mark_object (&h->rehash_size);
+ mark_object (&h->rehash_threshold);
+ mark_object (&h->hash);
+ mark_object (&h->next);
+ mark_object (&h->index);
+ mark_object (&h->user_hash_function);
+ mark_object (&h->user_cmp_function);
+
+ /* If hash table is not weak, mark all keys and values.
+ For weak tables, mark only the vector. */
+ if (GC_NILP (h->weak))
+ mark_object (&h->key_and_value);
+ else
+ XVECTOR (h->key_and_value)->size |= ARRAY_MARK_FLAG;
+
+ }