emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] Changes to emacs/src/alloc.c


From: Stefan Monnier
Subject: [Emacs-diffs] Changes to emacs/src/alloc.c
Date: Wed, 25 Jun 2003 19:27:32 -0400

Index: emacs/src/alloc.c
diff -c emacs/src/alloc.c:1.303 emacs/src/alloc.c:1.304
*** emacs/src/alloc.c:1.303     Sun Jun 15 17:48:14 2003
--- emacs/src/alloc.c   Wed Jun 25 19:27:32 2003
***************
*** 947,952 ****
--- 947,953 ----
    consing_since_gc += sizeof (struct interval);
    intervals_consed++;
    RESET_INTERVAL (val);
+   val->gcmarkbit = 0;
    return val;
  }
  
***************
*** 958,967 ****
       register INTERVAL i;
       Lisp_Object dummy;
  {
!   if (XMARKBIT (i->plist))
!     abort ();
    mark_object (&i->plist);
-   XMARK (i->plist);
  }
  
  
--- 959,967 ----
       register INTERVAL i;
       Lisp_Object dummy;
  {
!   eassert (!i->gcmarkbit);            /* Intervals are never shared.  */
!   i->gcmarkbit = 1;
    mark_object (&i->plist);
  }
  
  
***************
*** 976,985 ****
       function is always called through the MARK_INTERVAL_TREE macro,
       which takes care of that.  */
  
-   /* XMARK expands to an assignment; the LHS of an assignment can't be
-      a cast.  */
-   XMARK (tree->up.obj);
- 
    traverse_intervals_noorder (tree, mark_interval, Qnil);
  }
  
--- 976,981 ----
***************
*** 988,1010 ****
  
  #define MARK_INTERVAL_TREE(i)                         \
    do {                                                        \
!     if (!NULL_INTERVAL_P (i)                          \
!       && ! XMARKBIT (i->up.obj))                      \
        mark_interval_tree (i);                         \
    } while (0)
  
  
- /* The oddity in the call to XUNMARK is necessary because XUNMARK
-    expands to an assignment to its argument, and most C compilers
-    don't support casts on the left operand of `='.  */
- 
  #define UNMARK_BALANCE_INTERVALS(i)                   \
    do {                                                        \
     if (! NULL_INTERVAL_P (i))                         \
!      {                                                        \
!        XUNMARK ((i)->up.obj);                         \
!        (i) = balance_intervals (i);                   \
!      }                                                        \
    } while (0)
  
  
--- 984,998 ----
  
  #define MARK_INTERVAL_TREE(i)                         \
    do {                                                        \
!     if (!NULL_INTERVAL_P (i) && !i->gcmarkbit)                \
        mark_interval_tree (i);                         \
    } while (0)
  
  
  #define UNMARK_BALANCE_INTERVALS(i)                   \
    do {                                                        \
     if (! NULL_INTERVAL_P (i))                         \
!      (i) = balance_intervals (i);                     \
    } while (0)
  
  
***************
*** 2568,2573 ****
--- 2556,2562 ----
    p->value = Qunbound;
    p->function = Qunbound;
    p->next = NULL;
+   p->gcmarkbit = 0;
    p->interned = SYMBOL_UNINTERNED;
    p->constant = 0;
    p->indirect_variable = 0;
***************
*** 2644,2649 ****
--- 2633,2639 ----
  
    consing_since_gc += sizeof (union Lisp_Misc);
    misc_objects_consed++;
+   XMARKER (val)->gcmarkbit = 0;
    return val;
  }
  
***************
*** 3302,3308 ****
  }
  
  
! /* Value is non-zero of P is a pointer to a live buffer.  M is a
     pointer to the mem_block for P.  */
  
  static INLINE int
--- 3292,3298 ----
  }
  
  
! /* Value is non-zero if P is a pointer to a live buffer.  M is a
     pointer to the mem_block for P.  */
  
  static INLINE int
***************
*** 3397,3404 ****
          break;
  
        case Lisp_Symbol:
!         mark_p = (live_symbol_p (m, po)
!                   && !XMARKBIT (XSYMBOL (obj)->plist));
          break;
  
        case Lisp_Float:
--- 3387,3393 ----
          break;
  
        case Lisp_Symbol:
!         mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
          break;
  
        case Lisp_Float:
***************
*** 3418,3441 ****
          break;
  
        case Lisp_Misc:
!         if (live_misc_p (m, po))
!           {
!             switch (XMISCTYPE (obj))
!               {
!               case Lisp_Misc_Marker:
!                 mark_p = !XMARKBIT (XMARKER (obj)->chain);
!                 break;
! 
!               case Lisp_Misc_Buffer_Local_Value:
!               case Lisp_Misc_Some_Buffer_Local_Value:
!                 mark_p = !XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
!                 break;
! 
!               case Lisp_Misc_Overlay:
!                 mark_p = !XMARKBIT (XOVERLAY (obj)->plist);
!                 break;
!               }
!           }
          break;
  
        case Lisp_Int:
--- 3407,3413 ----
          break;
  
        case Lisp_Misc:
!         mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit);
          break;
  
        case Lisp_Int:
***************
*** 3500,3534 ****
          break;
  
        case MEM_TYPE_MISC:
!         if (live_misc_p (m, p))
!           {
!             Lisp_Object tem;
!             XSETMISC (tem, p);
! 
!             switch (XMISCTYPE (tem))
!               {
!               case Lisp_Misc_Marker:
!                 if (!XMARKBIT (XMARKER (tem)->chain))
!                   obj = tem;
!                 break;
! 
!               case Lisp_Misc_Buffer_Local_Value:
!               case Lisp_Misc_Some_Buffer_Local_Value:
!                 if (!XMARKBIT (XBUFFER_LOCAL_VALUE (tem)->realvalue))
!                   obj = tem;
!                 break;
! 
!               case Lisp_Misc_Overlay:
!                 if (!XMARKBIT (XOVERLAY (tem)->plist))
!                   obj = tem;
!                 break;
!               }
!           }
          break;
  
        case MEM_TYPE_SYMBOL:
!         if (live_symbol_p (m, p)
!             && !XMARKBIT (((struct Lisp_Symbol *) p)->plist))
            XSETSYMBOL (obj, p);
          break;
  
--- 3472,3483 ----
          break;
  
        case MEM_TYPE_MISC:
!         if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
!           XSETMISC (obj, p);
          break;
  
        case MEM_TYPE_SYMBOL:
!         if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
            XSETSYMBOL (obj, p);
          break;
  
***************
*** 4278,4284 ****
              {
                if (GC_CONSP (XCAR (tail))
                    && GC_MARKERP (XCAR (XCAR (tail)))
!                   && ! XMARKBIT (XMARKER (XCAR (XCAR (tail)))->chain))
                  {
                    if (NILP (prev))
                      nextb->undo_list = tail = XCDR (tail);
--- 4227,4233 ----
              {
                if (GC_CONSP (XCAR (tail))
                    && GC_MARKERP (XCAR (XCAR (tail)))
!                   && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
                  {
                    if (NILP (prev))
                      nextb->undo_list = tail = XCDR (tail);
***************
*** 4774,4782 ****
        register struct Lisp_Symbol *ptr = XSYMBOL (obj);
        struct Lisp_Symbol *ptrx;
  
!       if (XMARKBIT (ptr->plist)) break;
        CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
!       XMARK (ptr->plist);
        mark_object ((Lisp_Object *) &ptr->value);
        mark_object (&ptr->function);
        mark_object (&ptr->plist);
--- 4723,4731 ----
        register struct Lisp_Symbol *ptr = XSYMBOL (obj);
        struct Lisp_Symbol *ptrx;
  
!       if (ptr->gcmarkbit) break;
        CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
!       ptr->gcmarkbit = 1;
        mark_object ((Lisp_Object *) &ptr->value);
        mark_object (&ptr->function);
        mark_object (&ptr->plist);
***************
*** 4804,4825 ****
  
      case Lisp_Misc:
        CHECK_ALLOCATED_AND_LIVE (live_misc_p);
        switch (XMISCTYPE (obj))
        {
-       case Lisp_Misc_Marker:
-         XMARK (XMARKER (obj)->chain);
-         /* DO NOT mark thru the marker's chain.
-            The buffer's markers chain does not preserve markers from gc;
-            instead, markers are removed from the chain when freed by gc.  */
-         break;
- 
        case Lisp_Misc_Buffer_Local_Value:
        case Lisp_Misc_Some_Buffer_Local_Value:
          {
            register struct Lisp_Buffer_Local_Value *ptr
              = XBUFFER_LOCAL_VALUE (obj);
-           if (XMARKBIT (ptr->realvalue)) break;
-           XMARK (ptr->realvalue);
            /* If the cdr is nil, avoid recursion for the car.  */
            if (EQ (ptr->cdr, Qnil))
              {
--- 4753,4768 ----
  
      case Lisp_Misc:
        CHECK_ALLOCATED_AND_LIVE (live_misc_p);
+       if (XMARKER (obj)->gcmarkbit)
+       break;
+       XMARKER (obj)->gcmarkbit = 1;
        switch (XMISCTYPE (obj))
        {
        case Lisp_Misc_Buffer_Local_Value:
        case Lisp_Misc_Some_Buffer_Local_Value:
          {
            register struct Lisp_Buffer_Local_Value *ptr
              = XBUFFER_LOCAL_VALUE (obj);
            /* If the cdr is nil, avoid recursion for the car.  */
            if (EQ (ptr->cdr, Qnil))
              {
***************
*** 4833,4838 ****
--- 4776,4785 ----
            goto loop;
          }
  
+       case Lisp_Misc_Marker:
+         /* DO NOT mark thru the marker's chain.
+            The buffer's markers chain does not preserve markers from gc;
+            instead, markers are removed from the chain when freed by gc.  */
        case Lisp_Misc_Intfwd:
        case Lisp_Misc_Boolfwd:
        case Lisp_Misc_Objfwd:
***************
*** 4847,4860 ****
        case Lisp_Misc_Overlay:
          {
            struct Lisp_Overlay *ptr = XOVERLAY (obj);
!           if (!XMARKBIT (ptr->plist))
!             {
!               XMARK (ptr->plist);
!               mark_object (&ptr->start);
!               mark_object (&ptr->end);
!               objptr = &ptr->plist;
!               goto loop;
!             }
          }
          break;
  
--- 4794,4803 ----
        case Lisp_Misc_Overlay:
          {
            struct Lisp_Overlay *ptr = XOVERLAY (obj);
!           mark_object (&ptr->start);
!           mark_object (&ptr->end);
!           objptr = &ptr->plist;
!           goto loop;
          }
          break;
  
***************
*** 4922,4927 ****
--- 4865,4873 ----
        Lisp_Object tail;
        tail = buffer->undo_list;
  
+       /* We mark the undo list specially because
+        its pointers to markers should be weak.  */
+ 
        while (CONSP (tail))
        {
          register struct Lisp_Cons *ptr = XCONS (tail);
***************
*** 4980,4998 ****
        break;
  
      case Lisp_Symbol:
!       survives_p = XMARKBIT (XSYMBOL (obj)->plist);
        break;
  
      case Lisp_Misc:
        switch (XMISCTYPE (obj))
        {
        case Lisp_Misc_Marker:
!         survives_p = XMARKBIT (obj);
          break;
  
        case Lisp_Misc_Buffer_Local_Value:
        case Lisp_Misc_Some_Buffer_Local_Value:
!         survives_p = XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
          break;
  
        case Lisp_Misc_Intfwd:
--- 4926,4945 ----
        break;
  
      case Lisp_Symbol:
!       survives_p = XSYMBOL (obj)->gcmarkbit;
        break;
  
      case Lisp_Misc:
+       /* FIXME: Maybe we should just use obj->mark for all?  */
        switch (XMISCTYPE (obj))
        {
        case Lisp_Misc_Marker:
!         survives_p = XMARKER (obj)->gcmarkbit;
          break;
  
        case Lisp_Misc_Buffer_Local_Value:
        case Lisp_Misc_Some_Buffer_Local_Value:
!         survives_p = XBUFFER_LOCAL_VALUE (obj)->gcmarkbit;
          break;
  
        case Lisp_Misc_Intfwd:
***************
*** 5004,5010 ****
          break;
  
        case Lisp_Misc_Overlay:
!         survives_p = XMARKBIT (XOVERLAY (obj)->plist);
          break;
  
        default:
--- 4951,4957 ----
          break;
  
        case Lisp_Misc_Overlay:
!         survives_p = XOVERLAY (obj)->gcmarkbit;
          break;
  
        default:
***************
*** 5176,5182 ****
  
        for (i = 0; i < lim; i++)
          {
!           if (! XMARKBIT (iblk->intervals[i].plist))
              {
                SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
                interval_free_list = &iblk->intervals[i];
--- 5123,5129 ----
  
        for (i = 0; i < lim; i++)
          {
!           if (!iblk->intervals[i].gcmarkbit)
              {
                SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
                interval_free_list = &iblk->intervals[i];
***************
*** 5185,5191 ****
            else
              {
                num_used++;
!               XUNMARK (iblk->intervals[i].plist);
              }
          }
        lim = INTERVAL_BLOCK_SIZE;
--- 5132,5138 ----
            else
              {
                num_used++;
!               iblk->intervals[i].gcmarkbit = 0;
              }
          }
        lim = INTERVAL_BLOCK_SIZE;
***************
*** 5232,5238 ****
               so we conservatively assume that it is live.  */
            int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
  
!           if (!XMARKBIT (sym->plist) && !pure_p)
              {
                *(struct Lisp_Symbol **) &sym->value = symbol_free_list;
                symbol_free_list = sym;
--- 5179,5185 ----
               so we conservatively assume that it is live.  */
            int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
  
!           if (!sym->gcmarkbit && !pure_p)
              {
                *(struct Lisp_Symbol **) &sym->value = symbol_free_list;
                symbol_free_list = sym;
***************
*** 5246,5252 ****
                ++num_used;
                if (!pure_p)
                  UNMARK_STRING (XSTRING (sym->xname));
!               XUNMARK (sym->plist);
              }
          }
  
--- 5193,5199 ----
                ++num_used;
                if (!pure_p)
                  UNMARK_STRING (XSTRING (sym->xname));
!               sym->gcmarkbit = 0;
              }
          }
  
***************
*** 5286,5318 ****
        {
        register int i;
        int this_free = 0;
-       EMACS_INT already_free = -1;
  
        for (i = 0; i < lim; i++)
          {
!           Lisp_Object *markword;
!           switch (mblk->markers[i].u_marker.type)
!             {
!             case Lisp_Misc_Marker:
!               markword = &mblk->markers[i].u_marker.chain;
!               break;
!             case Lisp_Misc_Buffer_Local_Value:
!             case Lisp_Misc_Some_Buffer_Local_Value:
!               markword = &mblk->markers[i].u_buffer_local_value.realvalue;
!               break;
!             case Lisp_Misc_Overlay:
!               markword = &mblk->markers[i].u_overlay.plist;
!               break;
!             case Lisp_Misc_Free:
!               /* If the object was already free, keep it
!                  on the free list.  */
!               markword = (Lisp_Object *) &already_free;
!               break;
!             default:
!               markword = 0;
!               break;
!             }
!           if (markword && !XMARKBIT (*markword))
              {
                Lisp_Object tem;
                if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
--- 5233,5242 ----
        {
        register int i;
        int this_free = 0;
  
        for (i = 0; i < lim; i++)
          {
!           if (!mblk->markers[i].u_marker.gcmarkbit)
              {
                Lisp_Object tem;
                if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
***************
*** 5333,5340 ****
            else
              {
                num_used++;
!               if (markword)
!                 XUNMARK (*markword);
              }
          }
        lim = MARKER_BLOCK_SIZE;
--- 5257,5263 ----
            else
              {
                num_used++;
!               mblk->markers[i].u_marker.gcmarkbit = 0;
              }
          }
        lim = MARKER_BLOCK_SIZE;




reply via email to

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