]> git.eshelyaron.com Git - emacs.git/commitdiff
(mark_char_table): New function.
authorKenichi Handa <handa@m17n.org>
Tue, 25 Aug 2009 06:03:09 +0000 (06:03 +0000)
committerKenichi Handa <handa@m17n.org>
Tue, 25 Aug 2009 06:03:09 +0000 (06:03 +0000)
(mark_object): Use mark_char_table for a char-table.

src/alloc.c

index 157d768d69d62108c2130baa1763639ab5fa69a0..d11eff3d387704e6b29796a930be378273df0cf1 100644 (file)
@@ -5371,6 +5371,34 @@ mark_vectorlike (ptr)
   return 1;
 }
 
+/* Like mark_vectorlike but optimized for char-tables (and
+   sub-char-tables) assuming that the contents are mostly integers or
+   symbols.  */
+
+static void
+mark_char_table (ptr)
+     struct Lisp_Vector *ptr;
+{
+  register EMACS_INT size = ptr->size & PSEUDOVECTOR_SIZE_MASK;
+  register int i;
+
+  VECTOR_MARK (ptr);
+  for (i = 0; i < size; i++)
+    {
+      Lisp_Object val = ptr->contents[i];
+
+      if (INTEGERP (val) || SYMBOLP (val) && XSYMBOL (val)->gcmarkbit)
+       continue;
+      if (SUB_CHAR_TABLE_P (val))
+       {
+         if (! VECTOR_MARKED_P (XVECTOR (val)))
+           mark_char_table (XVECTOR (val));
+       }
+      else
+       mark_object (val);
+    }
+}
+
 void
 mark_object (arg)
      Lisp_Object arg;
@@ -5533,6 +5561,11 @@ mark_object (arg)
                VECTOR_MARK (XVECTOR (h->key_and_value));
            }
        }
+      else if (CHAR_TABLE_P (obj))
+       {
+         if (! VECTOR_MARKED_P (XVECTOR (obj)))
+           mark_char_table (XVECTOR (obj));
+       }
       else
        mark_vectorlike (XVECTOR (obj));
       break;