aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c59
1 files changed, 35 insertions, 24 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 5fc40d13b8d..f08a35074c7 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -179,11 +179,6 @@ static ptrdiff_t pure_size;
179 179
180static ptrdiff_t pure_bytes_used_before_overflow; 180static ptrdiff_t pure_bytes_used_before_overflow;
181 181
182/* True if P points into pure space. */
183
184#define PURE_POINTER_P(P) \
185 ((uintptr_t) (P) - (uintptr_t) purebeg <= pure_size)
186
187/* Index in pure at which next pure Lisp object will be allocated.. */ 182/* Index in pure at which next pure Lisp object will be allocated.. */
188 183
189static ptrdiff_t pure_bytes_used_lisp; 184static ptrdiff_t pure_bytes_used_lisp;
@@ -406,6 +401,28 @@ ALIGN (void *ptr, int alignment)
406 return (void *) ROUNDUP ((uintptr_t) ptr, alignment); 401 return (void *) ROUNDUP ((uintptr_t) ptr, alignment);
407} 402}
408 403
404/* Extract the pointer hidden within A, if A is not a symbol.
405 If A is a symbol, extract the hidden pointer's offset from lispsym,
406 converted to void *. */
407
408static void *
409XPNTR_OR_SYMBOL_OFFSET (Lisp_Object a)
410{
411 intptr_t i = USE_LSB_TAG ? XLI (a) - XTYPE (a) : XLI (a) & VALMASK;
412 return (void *) i;
413}
414
415/* Extract the pointer hidden within A. */
416
417static void *
418XPNTR (Lisp_Object a)
419{
420 void *p = XPNTR_OR_SYMBOL_OFFSET (a);
421 if (SYMBOLP (a))
422 p = (intptr_t) p + (char *) lispsym;
423 return p;
424}
425
409static void 426static void
410XFLOAT_INIT (Lisp_Object f, double n) 427XFLOAT_INIT (Lisp_Object f, double n)
411{ 428{
@@ -1587,9 +1604,7 @@ string_bytes (struct Lisp_String *s)
1587 ptrdiff_t nbytes = 1604 ptrdiff_t nbytes =
1588 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte); 1605 (s->size_byte < 0 ? s->size & ~ARRAY_MARK_FLAG : s->size_byte);
1589 1606
1590 if (!PURE_POINTER_P (s) 1607 if (!PURE_P (s) && s->data && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1591 && s->data
1592 && nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
1593 emacs_abort (); 1608 emacs_abort ();
1594 return nbytes; 1609 return nbytes;
1595} 1610}
@@ -4463,9 +4478,6 @@ live_buffer_p (struct mem_node *m, void *p)
4463static void 4478static void
4464mark_maybe_object (Lisp_Object obj) 4479mark_maybe_object (Lisp_Object obj)
4465{ 4480{
4466 void *po;
4467 struct mem_node *m;
4468
4469#if USE_VALGRIND 4481#if USE_VALGRIND
4470 if (valgrind_p) 4482 if (valgrind_p)
4471 VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj)); 4483 VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj));
@@ -4474,12 +4486,12 @@ mark_maybe_object (Lisp_Object obj)
4474 if (INTEGERP (obj)) 4486 if (INTEGERP (obj))
4475 return; 4487 return;
4476 4488
4477 po = (void *) XPNTR (obj); 4489 void *po = XPNTR (obj);
4478 m = mem_find (po); 4490 struct mem_node *m = mem_find (po);
4479 4491
4480 if (m != MEM_NIL) 4492 if (m != MEM_NIL)
4481 { 4493 {
4482 bool mark_p = 0; 4494 bool mark_p = false;
4483 4495
4484 switch (XTYPE (obj)) 4496 switch (XTYPE (obj))
4485 { 4497 {
@@ -4860,14 +4872,11 @@ valid_pointer_p (void *p)
4860int 4872int
4861valid_lisp_object_p (Lisp_Object obj) 4873valid_lisp_object_p (Lisp_Object obj)
4862{ 4874{
4863 void *p;
4864 struct mem_node *m;
4865
4866 if (INTEGERP (obj)) 4875 if (INTEGERP (obj))
4867 return 1; 4876 return 1;
4868 4877
4869 p = (void *) XPNTR (obj); 4878 void *p = XPNTR (obj);
4870 if (PURE_POINTER_P (p)) 4879 if (PURE_P (p))
4871 return 1; 4880 return 1;
4872 4881
4873 if (SYMBOLP (obj) && c_symbol_p (p)) 4882 if (SYMBOLP (obj) && c_symbol_p (p))
@@ -4876,7 +4885,7 @@ valid_lisp_object_p (Lisp_Object obj)
4876 if (p == &buffer_defaults || p == &buffer_local_symbols) 4885 if (p == &buffer_defaults || p == &buffer_local_symbols)
4877 return 2; 4886 return 2;
4878 4887
4879 m = mem_find (p); 4888 struct mem_node *m = mem_find (p);
4880 4889
4881 if (m == MEM_NIL) 4890 if (m == MEM_NIL)
4882 { 4891 {
@@ -5155,7 +5164,9 @@ Does not copy symbols. Copies strings without text properties. */)
5155static Lisp_Object 5164static Lisp_Object
5156purecopy (Lisp_Object obj) 5165purecopy (Lisp_Object obj)
5157{ 5166{
5158 if (PURE_POINTER_P (XPNTR (obj)) || INTEGERP (obj) || SUBRP (obj)) 5167 if (INTEGERP (obj)
5168 || (! SYMBOLP (obj) && PURE_P (XPNTR_OR_SYMBOL_OFFSET (obj)))
5169 || SUBRP (obj))
5159 return obj; /* Already pure. */ 5170 return obj; /* Already pure. */
5160 5171
5161 if (STRINGP (obj) && XSTRING (obj)->intervals) 5172 if (STRINGP (obj) && XSTRING (obj)->intervals)
@@ -5976,7 +5987,7 @@ mark_object (Lisp_Object arg)
5976 loop: 5987 loop:
5977 5988
5978 po = XPNTR (obj); 5989 po = XPNTR (obj);
5979 if (PURE_POINTER_P (po)) 5990 if (PURE_P (po))
5980 return; 5991 return;
5981 5992
5982 last_marked[last_marked_index++] = obj; 5993 last_marked[last_marked_index++] = obj;
@@ -6213,7 +6224,7 @@ mark_object (Lisp_Object arg)
6213 break; 6224 break;
6214 default: emacs_abort (); 6225 default: emacs_abort ();
6215 } 6226 }
6216 if (!PURE_POINTER_P (XSTRING (ptr->name))) 6227 if (!PURE_P (XSTRING (ptr->name)))
6217 MARK_STRING (XSTRING (ptr->name)); 6228 MARK_STRING (XSTRING (ptr->name));
6218 MARK_INTERVAL_TREE (string_intervals (ptr->name)); 6229 MARK_INTERVAL_TREE (string_intervals (ptr->name));
6219 /* Inner loop to mark next symbol in this bucket, if any. */ 6230 /* Inner loop to mark next symbol in this bucket, if any. */
@@ -6360,7 +6371,7 @@ survives_gc_p (Lisp_Object obj)
6360 emacs_abort (); 6371 emacs_abort ();
6361 } 6372 }
6362 6373
6363 return survives_p || PURE_POINTER_P ((void *) XPNTR (obj)); 6374 return survives_p || PURE_P (XPNTR (obj));
6364} 6375}
6365 6376
6366 6377