aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c105
1 files changed, 69 insertions, 36 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 2def77bf0bf..a92ef25d2be 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -733,22 +733,22 @@ Its value and function definition are void, and its property list is nil.")
733 return val; 733 return val;
734} 734}
735 735
736/* Allocation of markers. 736/* Allocation of markers and other objects that share that structure.
737 Works like allocation of conses. */ 737 Works like allocation of conses. */
738 738
739#define MARKER_BLOCK_SIZE \ 739#define MARKER_BLOCK_SIZE \
740 ((1020 - sizeof (struct marker_block *)) / sizeof (struct Lisp_Marker)) 740 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
741 741
742struct marker_block 742struct marker_block
743 { 743 {
744 struct marker_block *next; 744 struct marker_block *next;
745 struct Lisp_Marker markers[MARKER_BLOCK_SIZE]; 745 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
746 }; 746 };
747 747
748struct marker_block *marker_block; 748struct marker_block *marker_block;
749int marker_block_index; 749int marker_block_index;
750 750
751struct Lisp_Marker *marker_free_list; 751union Lisp_Misc *marker_free_list;
752 752
753void 753void
754init_marker () 754init_marker ()
@@ -760,36 +760,47 @@ init_marker ()
760 marker_free_list = 0; 760 marker_free_list = 0;
761} 761}
762 762
763DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, 763/* Return a newly allocated Lisp_Misc object, with no substructure. */
764 "Return a newly allocated marker which does not point at any place.") 764Lisp_Object
765 () 765allocate_misc ()
766{ 766{
767 register Lisp_Object val; 767 Lisp_Object val;
768 register struct Lisp_Marker *p;
769 768
770 if (marker_free_list) 769 if (marker_free_list)
771 { 770 {
772 XSETMARKER (val, marker_free_list); 771 XSETMISC (val, marker_free_list);
773 marker_free_list 772 marker_free_list = marker_free_list->u_free.chain;
774 = (struct Lisp_Marker *) XFASTINT (marker_free_list->chain);
775 } 773 }
776 else 774 else
777 { 775 {
778 if (marker_block_index == MARKER_BLOCK_SIZE) 776 if (marker_block_index == MARKER_BLOCK_SIZE)
779 { 777 {
780 struct marker_block *new = (struct marker_block *) xmalloc (sizeof (struct marker_block)); 778 struct marker_block *new
779 = (struct marker_block *) xmalloc (sizeof (struct marker_block));
781 VALIDATE_LISP_STORAGE (new, sizeof *new); 780 VALIDATE_LISP_STORAGE (new, sizeof *new);
782 new->next = marker_block; 781 new->next = marker_block;
783 marker_block = new; 782 marker_block = new;
784 marker_block_index = 0; 783 marker_block_index = 0;
785 } 784 }
786 XSETMARKER (val, &marker_block->markers[marker_block_index++]); 785 XSETMISC (val, &marker_block->markers[marker_block_index++]);
787 } 786 }
787 consing_since_gc += sizeof (union Lisp_Misc);
788 return val;
789}
790
791DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
792 "Return a newly allocated marker which does not point at any place.")
793 ()
794{
795 register Lisp_Object val;
796 register struct Lisp_Marker *p;
797
798 val = allocate_misc ();
799 XMISC (val)->type = Lisp_Misc_Marker;
788 p = XMARKER (val); 800 p = XMARKER (val);
789 p->buffer = 0; 801 p->buffer = 0;
790 p->bufpos = 0; 802 p->bufpos = 0;
791 p->chain = Qnil; 803 p->chain = Qnil;
792 consing_since_gc += sizeof (struct Lisp_Marker);
793 return val; 804 return val;
794} 805}
795 806
@@ -1125,8 +1136,15 @@ Does not copy symbols.")
1125 switch (XTYPE (obj)) 1136 switch (XTYPE (obj))
1126#endif 1137#endif
1127 { 1138 {
1128 case Lisp_Marker: 1139 case Lisp_Misc:
1129 error ("Attempt to copy a marker to pure storage"); 1140 switch (XMISC (obj)->type)
1141 {
1142 case Lisp_Misc_Marker:
1143 error ("Attempt to copy a marker to pure storage");
1144
1145 default:
1146 abort ();
1147 }
1130 1148
1131 case Lisp_Cons: 1149 case Lisp_Cons:
1132 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr); 1150 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr);
@@ -1426,7 +1444,8 @@ clear_marks ()
1426 { 1444 {
1427 register int i; 1445 register int i;
1428 for (i = 0; i < lim; i++) 1446 for (i = 0; i < lim; i++)
1429 XUNMARK (sblk->markers[i].chain); 1447 if (sblk->markers[i].type == Lisp_Misc_Marker)
1448 XUNMARK (sblk->markers[i].u_marker.chain);
1430 lim = MARKER_BLOCK_SIZE; 1449 lim = MARKER_BLOCK_SIZE;
1431 } 1450 }
1432 } 1451 }
@@ -1613,11 +1632,19 @@ mark_object (objptr)
1613 } 1632 }
1614 break; 1633 break;
1615 1634
1616 case Lisp_Marker: 1635 case Lisp_Misc:
1617 XMARK (XMARKER (obj)->chain); 1636 switch (XMISC (obj)->type)
1618 /* DO NOT mark thru the marker's chain. 1637 {
1619 The buffer's markers chain does not preserve markers from gc; 1638 case Lisp_Misc_Marker:
1620 instead, markers are removed from the chain when freed by gc. */ 1639 XMARK (XMARKER (obj)->chain);
1640 /* DO NOT mark thru the marker's chain.
1641 The buffer's markers chain does not preserve markers from gc;
1642 instead, markers are removed from the chain when freed by gc. */
1643 break;
1644
1645 default:
1646 abort ();
1647 }
1621 break; 1648 break;
1622 1649
1623 case Lisp_Cons: 1650 case Lisp_Cons:
@@ -1855,20 +1882,26 @@ gc_sweep ()
1855 { 1882 {
1856 register int i; 1883 register int i;
1857 for (i = 0; i < lim; i++) 1884 for (i = 0; i < lim; i++)
1858 if (!XMARKBIT (mblk->markers[i].chain)) 1885 if (mblk->markers[i].type == Lisp_Misc_Marker)
1859 { 1886 {
1860 Lisp_Object tem; 1887 if (!XMARKBIT (mblk->markers[i].u_marker.chain))
1861 tem1 = &mblk->markers[i]; /* tem1 avoids Sun compiler bug */ 1888 {
1862 XSETMARKER (tem, tem1); 1889 Lisp_Object tem;
1863 unchain_marker (tem); 1890 tem1 = &mblk->markers[i].u_marker; /* tem1 avoids Sun compiler bug */
1864 XSETFASTINT (mblk->markers[i].chain, (EMACS_INT) marker_free_list); 1891 XSETMARKER (tem, tem1);
1865 marker_free_list = &mblk->markers[i]; 1892 unchain_marker (tem);
1866 num_free++; 1893 /* We could leave the type alone, since nobody checks it,
1867 } 1894 but this might catch bugs faster. */
1868 else 1895 mblk->markers[i].type = Lisp_Misc_Free;
1869 { 1896 mblk->markers[i].u_free.chain = marker_free_list;
1870 num_used++; 1897 marker_free_list = &mblk->markers[i];
1871 XUNMARK (mblk->markers[i].chain); 1898 num_free++;
1899 }
1900 else
1901 {
1902 num_used++;
1903 XUNMARK (mblk->markers[i].u_marker.chain);
1904 }
1872 } 1905 }
1873 lim = MARKER_BLOCK_SIZE; 1906 lim = MARKER_BLOCK_SIZE;
1874 } 1907 }