emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/src alloc.c


From: Kenichi Handa
Subject: [Emacs-diffs] emacs/src alloc.c
Date: Tue, 25 Aug 2009 06:03:09 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Kenichi Handa <handa>   09/08/25 06:03:09

Modified files:
        src            : alloc.c 

Log message:
        (mark_char_table): New function.
        (mark_object): Use mark_char_table for a char-table.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/alloc.c?cvsroot=emacs&r1=1.448&r2=1.449

Patches:
Index: alloc.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/alloc.c,v
retrieving revision 1.448
retrieving revision 1.449
diff -u -b -r1.448 -r1.449
--- alloc.c     17 Aug 2009 01:25:58 -0000      1.448
+++ alloc.c     25 Aug 2009 06:03:09 -0000      1.449
@@ -5371,6 +5371,34 @@
   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 @@
                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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]