emacs-diffs
[Top][All Lists]
Advanced

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

scratch/igc 25536c74e29 2/2: Safer use of ppstack


From: Gerd Moellmann
Subject: scratch/igc 25536c74e29 2/2: Safer use of ppstack
Date: Fri, 24 May 2024 10:26:29 -0400 (EDT)

branch: scratch/igc
commit 25536c74e29061473c9d119f39e1eb3eaa54554c
Author: Helmut Eller <eller.helmut@gmail.com>
Commit: Gerd Möllmann <gerd@gnu.org>

    Safer use of ppstack
    
    In print_pp_entry, the u.values fields holds a pointer into the interior
    of a vectorlike object.  This doesn't work for a moving GC.  It's safer
    to keep the original object and access it with AREF.
    
    * print.c (print_pp_entry): Add a vectorlike variant to the union.
    (scan_ppstack, pp_stack_push_values, print_preprocess): Update accordingly.
---
 src/print.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/src/print.c b/src/print.c
index 5aec73c15e3..cc86e1e9710 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1314,7 +1314,11 @@ struct print_pp_entry {
   ptrdiff_t n;                 /* number of values, or 0 if a single value */
   union {
     Lisp_Object value;         /* when n = 0 */
+#ifdef HAVE_MPS
+    Lisp_Object vectorlike;    /* when n > 0 */
+#else
     Lisp_Object *values;       /* when n > 0 */
+#endif
   } u;
 };
 
@@ -1345,9 +1349,8 @@ scan_ppstack (struct igc_opaque *op, void *start, void 
*end,
       else
        {
          eassert (p->n > 0);
-         for (size_t i = 0; i < p->n; i++)
-           if (err = scan1 (op, &p->u.values[i]), err != 0)
-             return err;
+         if (err = scan1 (op, &p->u.vectorlike), err != 0)
+           return err;
        }
     }
   return 0;
@@ -1376,6 +1379,20 @@ pp_stack_push_value (Lisp_Object value)
                                                        .u.value = value};
 }
 
+#ifdef HAVE_MPS
+static inline void
+pp_stack_push_values (Lisp_Object vectorlike, ptrdiff_t n)
+{
+  eassert (VECTORLIKEP (vectorlike));
+  eassume (n >= 0);
+  if (n == 0)
+    return;
+  if (ppstack.sp >= ppstack.size)
+    grow_pp_stack ();
+  ppstack.stack[ppstack.sp++]
+      = (struct print_pp_entry){ .n = n, .u.vectorlike = vectorlike };
+}
+#else
 static inline void
 pp_stack_push_values (Lisp_Object *values, ptrdiff_t n)
 {
@@ -1387,6 +1404,7 @@ pp_stack_push_values (Lisp_Object *values, ptrdiff_t n)
   ppstack.stack[ppstack.sp++] = (struct print_pp_entry){.n = n,
                                                        .u.values = values};
 }
+#endif
 
 static inline bool
 pp_stack_empty_p (void)
@@ -1409,7 +1427,11 @@ pp_stack_pop (void)
   e->n--;
   if (e->n == 0)
     --ppstack.sp;              /* last value consumed */
+#ifdef HAVE_MPS
+  return AREF (e->u.vectorlike, e->n);
+#else
   return (++e->u.values)[-1];
+#endif
 }
 
 /* Construct Vprint_number_table for the print-circle feature
@@ -1475,13 +1497,17 @@ print_preprocess (Lisp_Object obj)
 
                case Lisp_Vectorlike:
                  {
-                   struct Lisp_Vector *vec = XVECTOR (obj);
                    ptrdiff_t size = ASIZE (obj);
                    if (size & PSEUDOVECTOR_FLAG)
                      size &= PSEUDOVECTOR_SIZE_MASK;
                    ptrdiff_t start = (SUB_CHAR_TABLE_P (obj)
                                       ? SUB_CHAR_TABLE_OFFSET : 0);
+#ifdef HAVE_MPS
+                   pp_stack_push_values (obj, size - start);
+#else
+                   struct Lisp_Vector *vec = XVECTOR (obj);
                    pp_stack_push_values (vec->contents + start, size - start);
+#endif
                    if (HASH_TABLE_P (obj))
                      {
                        struct Lisp_Hash_Table *h = XHASH_TABLE (obj);



reply via email to

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