Mercurial > hg > xemacs-beta
comparison src/data.c @ 424:11054d720c21 r21-2-20
Import from CVS: tag r21-2-20
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:26:11 +0200 |
parents | 41dbb7a9d5f2 |
children |
comparison
equal
deleted
inserted
replaced
423:28d9c139be4c | 424:11054d720c21 |
---|---|
48 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; | 48 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; |
49 Lisp_Object Qio_error, Qend_of_file; | 49 Lisp_Object Qio_error, Qend_of_file; |
50 Lisp_Object Qarith_error, Qrange_error, Qdomain_error; | 50 Lisp_Object Qarith_error, Qrange_error, Qdomain_error; |
51 Lisp_Object Qsingularity_error, Qoverflow_error, Qunderflow_error; | 51 Lisp_Object Qsingularity_error, Qoverflow_error, Qunderflow_error; |
52 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; | 52 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; |
53 Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qkeywordp; | 53 Lisp_Object Qintegerp, Qnatnump, Qsymbolp; |
54 Lisp_Object Qlistp, Qtrue_list_p, Qweak_listp; | 54 Lisp_Object Qlistp, Qtrue_list_p, Qweak_listp; |
55 Lisp_Object Qconsp, Qsubrp; | 55 Lisp_Object Qconsp, Qsubrp; |
56 Lisp_Object Qcharacterp, Qstringp, Qarrayp, Qsequencep, Qvectorp; | 56 Lisp_Object Qcharacterp, Qstringp, Qarrayp, Qsequencep, Qvectorp; |
57 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qbufferp; | 57 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qbufferp; |
58 Lisp_Object Qinteger_or_char_p, Qinteger_char_or_marker_p; | 58 Lisp_Object Qinteger_or_char_p, Qinteger_char_or_marker_p; |
59 Lisp_Object Qnumberp, Qnumber_or_marker_p, Qnumber_char_or_marker_p; | 59 Lisp_Object Qnumberp, Qnumber_char_or_marker_p; |
60 Lisp_Object Qbit_vectorp, Qbitp, Qcons, Qkeyword, Qcdr, Qignore; | 60 Lisp_Object Qbit_vectorp, Qbitp, Qcdr; |
61 | 61 |
62 Lisp_Object Qfloatp; | 62 Lisp_Object Qfloatp; |
63 | 63 |
64 #ifdef DEBUG_XEMACS | 64 #ifdef DEBUG_XEMACS |
65 | 65 |
145 { | 145 { |
146 signal_error (Qargs_out_of_range, list3 (a1, a2, a3)); | 146 signal_error (Qargs_out_of_range, list3 (a1, a2, a3)); |
147 } | 147 } |
148 | 148 |
149 void | 149 void |
150 check_int_range (int val, int min, int max) | 150 check_int_range (EMACS_INT val, EMACS_INT min, EMACS_INT max) |
151 { | 151 { |
152 if (val < min || val > max) | 152 if (val < min || val > max) |
153 args_out_of_range_3 (make_int (val), make_int (min), make_int (max)); | 153 args_out_of_range_3 (make_int (val), make_int (min), make_int (max)); |
154 } | 154 } |
155 | 155 |
158 | 158 |
159 EMACS_INT sign_extend_temp; | 159 EMACS_INT sign_extend_temp; |
160 | 160 |
161 /* On a few machines, XINT can only be done by calling this. */ | 161 /* On a few machines, XINT can only be done by calling this. */ |
162 /* XEmacs: only used by m/convex.h */ | 162 /* XEmacs: only used by m/convex.h */ |
163 int sign_extend_lisp_int (EMACS_INT num); | 163 EMACS_INT sign_extend_lisp_int (EMACS_INT num); |
164 int | 164 EMACS_INT |
165 sign_extend_lisp_int (EMACS_INT num) | 165 sign_extend_lisp_int (EMACS_INT num) |
166 { | 166 { |
167 if (num & (1L << (VALBITS - 1))) | 167 if (num & (1L << (VALBITS - 1))) |
168 return num | ((-1L) << VALBITS); | 168 return num | ((-1L) << VALBITS); |
169 else | 169 else |
613 (conscell, newcar)) | 613 (conscell, newcar)) |
614 { | 614 { |
615 if (!CONSP (conscell)) | 615 if (!CONSP (conscell)) |
616 conscell = wrong_type_argument (Qconsp, conscell); | 616 conscell = wrong_type_argument (Qconsp, conscell); |
617 | 617 |
618 CHECK_LISP_WRITEABLE (conscell); | |
619 XCAR (conscell) = newcar; | 618 XCAR (conscell) = newcar; |
620 return newcar; | 619 return newcar; |
621 } | 620 } |
622 | 621 |
623 DEFUN ("setcdr", Fsetcdr, 2, 2, 0, /* | 622 DEFUN ("setcdr", Fsetcdr, 2, 2, 0, /* |
626 (conscell, newcdr)) | 625 (conscell, newcdr)) |
627 { | 626 { |
628 if (!CONSP (conscell)) | 627 if (!CONSP (conscell)) |
629 conscell = wrong_type_argument (Qconsp, conscell); | 628 conscell = wrong_type_argument (Qconsp, conscell); |
630 | 629 |
631 CHECK_LISP_WRITEABLE (conscell); | |
632 XCDR (conscell) = newcdr; | 630 XCDR (conscell) = newcdr; |
633 return newcdr; | 631 return newcdr; |
634 } | 632 } |
635 | 633 |
636 /* Find the function at the end of a chain of symbol function indirections. | 634 /* Find the function at the end of a chain of symbol function indirections. |
687 Return the element of ARRAY at index INDEX. | 685 Return the element of ARRAY at index INDEX. |
688 ARRAY may be a vector, bit vector, or string. INDEX starts at 0. | 686 ARRAY may be a vector, bit vector, or string. INDEX starts at 0. |
689 */ | 687 */ |
690 (array, index_)) | 688 (array, index_)) |
691 { | 689 { |
692 int idx; | 690 EMACS_INT idx; |
693 | 691 |
694 retry: | 692 retry: |
695 | 693 |
696 if (INTP (index_)) idx = XINT (index_); | 694 if (INTP (index_)) idx = XINT (index_); |
697 else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */ | 695 else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */ |
741 Store into the element of ARRAY at index INDEX the value NEWVAL. | 739 Store into the element of ARRAY at index INDEX the value NEWVAL. |
742 ARRAY may be a vector, bit vector, or string. INDEX starts at 0. | 740 ARRAY may be a vector, bit vector, or string. INDEX starts at 0. |
743 */ | 741 */ |
744 (array, index_, newval)) | 742 (array, index_, newval)) |
745 { | 743 { |
746 int idx; | 744 EMACS_INT idx; |
747 | 745 |
748 retry: | 746 retry: |
749 | 747 |
750 if (INTP (index_)) idx = XINT (index_); | 748 if (INTP (index_)) idx = XINT (index_); |
751 else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */ | 749 else if (CHARP (index_)) idx = XCHAR (index_); /* yuck! */ |
754 index_ = wrong_type_argument (Qinteger_or_char_p, index_); | 752 index_ = wrong_type_argument (Qinteger_or_char_p, index_); |
755 goto retry; | 753 goto retry; |
756 } | 754 } |
757 | 755 |
758 if (idx < 0) goto range_error; | 756 if (idx < 0) goto range_error; |
759 | |
760 CHECK_LISP_WRITEABLE (array); | |
761 | 757 |
762 if (VECTORP (array)) | 758 if (VECTORP (array)) |
763 { | 759 { |
764 if (idx >= XVECTOR_LENGTH (array)) goto range_error; | 760 if (idx >= XVECTOR_LENGTH (array)) goto range_error; |
765 XVECTOR_DATA (array)[idx] = newval; | 761 XVECTOR_DATA (array)[idx] = newval; |
837 obj = wrong_type_argument (Qnumber_char_or_marker_p, obj); | 833 obj = wrong_type_argument (Qnumber_char_or_marker_p, obj); |
838 goto retry; | 834 goto retry; |
839 } | 835 } |
840 } | 836 } |
841 | 837 |
842 static int | 838 static EMACS_INT |
843 integer_char_or_marker_to_int (Lisp_Object obj) | 839 integer_char_or_marker_to_int (Lisp_Object obj) |
844 { | 840 { |
845 retry: | 841 retry: |
846 if (INTP (obj)) return XINT (obj); | 842 if (INTP (obj)) return XINT (obj); |
847 else if (CHARP (obj)) return XCHAR (obj); | 843 else if (CHARP (obj)) return XCHAR (obj); |
1414 Return remainder of first arg divided by second. | 1410 Return remainder of first arg divided by second. |
1415 Both must be integers, characters or markers. | 1411 Both must be integers, characters or markers. |
1416 */ | 1412 */ |
1417 (num1, num2)) | 1413 (num1, num2)) |
1418 { | 1414 { |
1419 int ival1 = integer_char_or_marker_to_int (num1); | 1415 EMACS_INT ival1 = integer_char_or_marker_to_int (num1); |
1420 int ival2 = integer_char_or_marker_to_int (num2); | 1416 EMACS_INT ival2 = integer_char_or_marker_to_int (num2); |
1421 | 1417 |
1422 if (ival2 == 0) | 1418 if (ival2 == 0) |
1423 Fsignal (Qarith_error, Qnil); | 1419 Fsignal (Qarith_error, Qnil); |
1424 | 1420 |
1425 return make_int (ival1 % ival2); | 1421 return make_int (ival1 % ival2); |
1466 | 1462 |
1467 return make_float (dval1); | 1463 return make_float (dval1); |
1468 } | 1464 } |
1469 #endif /* LISP_FLOAT_TYPE */ | 1465 #endif /* LISP_FLOAT_TYPE */ |
1470 { | 1466 { |
1471 int ival; | 1467 EMACS_INT ival; |
1472 if (iod2.c.ival == 0) goto divide_by_zero; | 1468 if (iod2.c.ival == 0) goto divide_by_zero; |
1473 | 1469 |
1474 ival = iod1.c.ival % iod2.c.ival; | 1470 ival = iod1.c.ival % iod2.c.ival; |
1475 | 1471 |
1476 /* If the "remainder" comes out with the wrong sign, fix it. */ | 1472 /* If the "remainder" comes out with the wrong sign, fix it. */ |
1568 static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */ | 1564 static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */ |
1569 | 1565 |
1570 static Lisp_Object encode_weak_list_type (enum weak_list_type type); | 1566 static Lisp_Object encode_weak_list_type (enum weak_list_type type); |
1571 | 1567 |
1572 static Lisp_Object | 1568 static Lisp_Object |
1573 mark_weak_list (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 1569 mark_weak_list (Lisp_Object obj) |
1574 { | 1570 { |
1575 return Qnil; /* nichts ist gemarkt */ | 1571 return Qnil; /* nichts ist gemarkt */ |
1576 } | 1572 } |
1577 | 1573 |
1578 static void | 1574 static void |
1623 return result; | 1619 return result; |
1624 } | 1620 } |
1625 | 1621 |
1626 static const struct lrecord_description weak_list_description[] = { | 1622 static const struct lrecord_description weak_list_description[] = { |
1627 { XD_LISP_OBJECT, offsetof(struct weak_list, list), 1 }, | 1623 { XD_LISP_OBJECT, offsetof(struct weak_list, list), 1 }, |
1628 { XD_LISP_OBJECT, offsetof(struct weak_list, next_weak), 1 }, | 1624 { XD_LO_LINK, offsetof(struct weak_list, next_weak) }, |
1629 { XD_END } | 1625 { XD_END } |
1630 }; | 1626 }; |
1631 | 1627 |
1632 DEFINE_LRECORD_IMPLEMENTATION ("weak-list", weak_list, | 1628 DEFINE_LRECORD_IMPLEMENTATION ("weak-list", weak_list, |
1633 mark_weak_list, print_weak_list, | 1629 mark_weak_list, print_weak_list, |
1650 | 1646 |
1651 Linked lists just majorly suck, d'ya know? | 1647 Linked lists just majorly suck, d'ya know? |
1652 */ | 1648 */ |
1653 | 1649 |
1654 int | 1650 int |
1655 finish_marking_weak_lists (int (*obj_marked_p) (Lisp_Object), | 1651 finish_marking_weak_lists (void) |
1656 void (*markobj) (Lisp_Object)) | |
1657 { | 1652 { |
1658 Lisp_Object rest; | 1653 Lisp_Object rest; |
1659 int did_mark = 0; | 1654 int did_mark = 0; |
1660 | 1655 |
1661 for (rest = Vall_weak_lists; | 1656 for (rest = Vall_weak_lists; |
1662 !GC_NILP (rest); | 1657 !NILP (rest); |
1663 rest = XWEAK_LIST (rest)->next_weak) | 1658 rest = XWEAK_LIST (rest)->next_weak) |
1664 { | 1659 { |
1665 Lisp_Object rest2; | 1660 Lisp_Object rest2; |
1666 enum weak_list_type type = XWEAK_LIST (rest)->type; | 1661 enum weak_list_type type = XWEAK_LIST (rest)->type; |
1667 | 1662 |
1668 if (! obj_marked_p (rest)) | 1663 if (! marked_p (rest)) |
1669 /* The weak list is probably garbage. Ignore it. */ | 1664 /* The weak list is probably garbage. Ignore it. */ |
1670 continue; | 1665 continue; |
1671 | 1666 |
1672 for (rest2 = XWEAK_LIST (rest)->list; | 1667 for (rest2 = XWEAK_LIST (rest)->list; |
1673 /* We need to be trickier since we're inside of GC; | 1668 /* We need to be trickier since we're inside of GC; |
1674 use CONSP instead of !NILP in case of user-visible | 1669 use CONSP instead of !NILP in case of user-visible |
1675 imperfect lists */ | 1670 imperfect lists */ |
1676 GC_CONSP (rest2); | 1671 CONSP (rest2); |
1677 rest2 = XCDR (rest2)) | 1672 rest2 = XCDR (rest2)) |
1678 { | 1673 { |
1679 Lisp_Object elem; | 1674 Lisp_Object elem; |
1680 /* If the element is "marked" (meaning depends on the type | 1675 /* If the element is "marked" (meaning depends on the type |
1681 of weak list), we need to mark the cons containing the | 1676 of weak list), we need to mark the cons containing the |
1686 | 1681 |
1687 /* If a cons is already marked, then its car is already marked | 1682 /* If a cons is already marked, then its car is already marked |
1688 (either because of an external pointer or because of | 1683 (either because of an external pointer or because of |
1689 a previous call to this function), and likewise for all | 1684 a previous call to this function), and likewise for all |
1690 the rest of the elements in the list, so we can stop now. */ | 1685 the rest of the elements in the list, so we can stop now. */ |
1691 if (obj_marked_p (rest2)) | 1686 if (marked_p (rest2)) |
1692 break; | 1687 break; |
1693 | 1688 |
1694 elem = XCAR (rest2); | 1689 elem = XCAR (rest2); |
1695 | 1690 |
1696 switch (type) | 1691 switch (type) |
1697 { | 1692 { |
1698 case WEAK_LIST_SIMPLE: | 1693 case WEAK_LIST_SIMPLE: |
1699 if (obj_marked_p (elem)) | 1694 if (marked_p (elem)) |
1700 need_to_mark_cons = 1; | 1695 need_to_mark_cons = 1; |
1701 break; | 1696 break; |
1702 | 1697 |
1703 case WEAK_LIST_ASSOC: | 1698 case WEAK_LIST_ASSOC: |
1704 if (!GC_CONSP (elem)) | 1699 if (!CONSP (elem)) |
1705 { | 1700 { |
1706 /* just leave bogus elements there */ | 1701 /* just leave bogus elements there */ |
1707 need_to_mark_cons = 1; | 1702 need_to_mark_cons = 1; |
1708 need_to_mark_elem = 1; | 1703 need_to_mark_elem = 1; |
1709 } | 1704 } |
1710 else if (obj_marked_p (XCAR (elem)) && | 1705 else if (marked_p (XCAR (elem)) && |
1711 obj_marked_p (XCDR (elem))) | 1706 marked_p (XCDR (elem))) |
1712 { | 1707 { |
1713 need_to_mark_cons = 1; | 1708 need_to_mark_cons = 1; |
1714 /* We still need to mark elem, because it's | 1709 /* We still need to mark elem, because it's |
1715 probably not marked. */ | 1710 probably not marked. */ |
1716 need_to_mark_elem = 1; | 1711 need_to_mark_elem = 1; |
1717 } | 1712 } |
1718 break; | 1713 break; |
1719 | 1714 |
1720 case WEAK_LIST_KEY_ASSOC: | 1715 case WEAK_LIST_KEY_ASSOC: |
1721 if (!GC_CONSP (elem)) | 1716 if (!CONSP (elem)) |
1722 { | 1717 { |
1723 /* just leave bogus elements there */ | 1718 /* just leave bogus elements there */ |
1724 need_to_mark_cons = 1; | 1719 need_to_mark_cons = 1; |
1725 need_to_mark_elem = 1; | 1720 need_to_mark_elem = 1; |
1726 } | 1721 } |
1727 else if (obj_marked_p (XCAR (elem))) | 1722 else if (marked_p (XCAR (elem))) |
1728 { | 1723 { |
1729 need_to_mark_cons = 1; | 1724 need_to_mark_cons = 1; |
1730 /* We still need to mark elem and XCDR (elem); | 1725 /* We still need to mark elem and XCDR (elem); |
1731 marking elem does both */ | 1726 marking elem does both */ |
1732 need_to_mark_elem = 1; | 1727 need_to_mark_elem = 1; |
1733 } | 1728 } |
1734 break; | 1729 break; |
1735 | 1730 |
1736 case WEAK_LIST_VALUE_ASSOC: | 1731 case WEAK_LIST_VALUE_ASSOC: |
1737 if (!GC_CONSP (elem)) | 1732 if (!CONSP (elem)) |
1738 { | 1733 { |
1739 /* just leave bogus elements there */ | 1734 /* just leave bogus elements there */ |
1740 need_to_mark_cons = 1; | 1735 need_to_mark_cons = 1; |
1741 need_to_mark_elem = 1; | 1736 need_to_mark_elem = 1; |
1742 } | 1737 } |
1743 else if (obj_marked_p (XCDR (elem))) | 1738 else if (marked_p (XCDR (elem))) |
1744 { | 1739 { |
1745 need_to_mark_cons = 1; | 1740 need_to_mark_cons = 1; |
1746 /* We still need to mark elem and XCAR (elem); | 1741 /* We still need to mark elem and XCAR (elem); |
1747 marking elem does both */ | 1742 marking elem does both */ |
1748 need_to_mark_elem = 1; | 1743 need_to_mark_elem = 1; |
1751 | 1746 |
1752 default: | 1747 default: |
1753 abort (); | 1748 abort (); |
1754 } | 1749 } |
1755 | 1750 |
1756 if (need_to_mark_elem && ! obj_marked_p (elem)) | 1751 if (need_to_mark_elem && ! marked_p (elem)) |
1757 { | 1752 { |
1758 markobj (elem); | 1753 mark_object (elem); |
1759 did_mark = 1; | 1754 did_mark = 1; |
1760 } | 1755 } |
1761 | 1756 |
1762 /* We also need to mark the cons that holds the elem or | 1757 /* We also need to mark the cons that holds the elem or |
1763 assoc-pair. We do *not* want to call (markobj) here | 1758 assoc-pair. We do *not* want to call (mark_object) here |
1764 because that will mark the entire list; we just want to | 1759 because that will mark the entire list; we just want to |
1765 mark the cons itself. | 1760 mark the cons itself. |
1766 */ | 1761 */ |
1767 if (need_to_mark_cons) | 1762 if (need_to_mark_cons) |
1768 { | 1763 { |
1769 struct Lisp_Cons *ptr = XCONS (rest2); | 1764 Lisp_Cons *c = XCONS (rest2); |
1770 if (!CONS_MARKED_P (ptr)) | 1765 if (!CONS_MARKED_P (c)) |
1771 { | 1766 { |
1772 MARK_CONS (ptr); | 1767 MARK_CONS (c); |
1773 did_mark = 1; | 1768 did_mark = 1; |
1774 } | 1769 } |
1775 } | 1770 } |
1776 } | 1771 } |
1777 | 1772 |
1778 /* In case of imperfect list, need to mark the final cons | 1773 /* In case of imperfect list, need to mark the final cons |
1779 because we're not removing it */ | 1774 because we're not removing it */ |
1780 if (!GC_NILP (rest2) && ! obj_marked_p (rest2)) | 1775 if (!NILP (rest2) && ! marked_p (rest2)) |
1781 { | 1776 { |
1782 markobj (rest2); | 1777 mark_object (rest2); |
1783 did_mark = 1; | 1778 did_mark = 1; |
1784 } | 1779 } |
1785 } | 1780 } |
1786 | 1781 |
1787 return did_mark; | 1782 return did_mark; |
1788 } | 1783 } |
1789 | 1784 |
1790 void | 1785 void |
1791 prune_weak_lists (int (*obj_marked_p) (Lisp_Object)) | 1786 prune_weak_lists (void) |
1792 { | 1787 { |
1793 Lisp_Object rest, prev = Qnil; | 1788 Lisp_Object rest, prev = Qnil; |
1794 | 1789 |
1795 for (rest = Vall_weak_lists; | 1790 for (rest = Vall_weak_lists; |
1796 !GC_NILP (rest); | 1791 !NILP (rest); |
1797 rest = XWEAK_LIST (rest)->next_weak) | 1792 rest = XWEAK_LIST (rest)->next_weak) |
1798 { | 1793 { |
1799 if (! (obj_marked_p (rest))) | 1794 if (! (marked_p (rest))) |
1800 { | 1795 { |
1801 /* This weak list itself is garbage. Remove it from the list. */ | 1796 /* This weak list itself is garbage. Remove it from the list. */ |
1802 if (GC_NILP (prev)) | 1797 if (NILP (prev)) |
1803 Vall_weak_lists = XWEAK_LIST (rest)->next_weak; | 1798 Vall_weak_lists = XWEAK_LIST (rest)->next_weak; |
1804 else | 1799 else |
1805 XWEAK_LIST (prev)->next_weak = | 1800 XWEAK_LIST (prev)->next_weak = |
1806 XWEAK_LIST (rest)->next_weak; | 1801 XWEAK_LIST (rest)->next_weak; |
1807 } | 1802 } |
1813 | 1808 |
1814 for (rest2 = XWEAK_LIST (rest)->list, tortoise = rest2; | 1809 for (rest2 = XWEAK_LIST (rest)->list, tortoise = rest2; |
1815 /* We need to be trickier since we're inside of GC; | 1810 /* We need to be trickier since we're inside of GC; |
1816 use CONSP instead of !NILP in case of user-visible | 1811 use CONSP instead of !NILP in case of user-visible |
1817 imperfect lists */ | 1812 imperfect lists */ |
1818 GC_CONSP (rest2);) | 1813 CONSP (rest2);) |
1819 { | 1814 { |
1820 /* It suffices to check the cons for marking, | 1815 /* It suffices to check the cons for marking, |
1821 regardless of the type of weak list: | 1816 regardless of the type of weak list: |
1822 | 1817 |
1823 -- if the cons is pointed to somewhere else, | 1818 -- if the cons is pointed to somewhere else, |
1824 then it should stay around and will be marked. | 1819 then it should stay around and will be marked. |
1825 -- otherwise, if it should stay around, it will | 1820 -- otherwise, if it should stay around, it will |
1826 have been marked in finish_marking_weak_lists(). | 1821 have been marked in finish_marking_weak_lists(). |
1827 -- otherwise, it's not marked and should disappear. | 1822 -- otherwise, it's not marked and should disappear. |
1828 */ | 1823 */ |
1829 if (! obj_marked_p (rest2)) | 1824 if (! marked_p (rest2)) |
1830 { | 1825 { |
1831 /* bye bye :-( */ | 1826 /* bye bye :-( */ |
1832 if (GC_NILP (prev2)) | 1827 if (NILP (prev2)) |
1833 XWEAK_LIST (rest)->list = XCDR (rest2); | 1828 XWEAK_LIST (rest)->list = XCDR (rest2); |
1834 else | 1829 else |
1835 XCDR (prev2) = XCDR (rest2); | 1830 XCDR (prev2) = XCDR (rest2); |
1836 rest2 = XCDR (rest2); | 1831 rest2 = XCDR (rest2); |
1837 /* Ouch. Circularity checking is even trickier | 1832 /* Ouch. Circularity checking is even trickier |
1868 | 1863 |
1869 rest2 = XCDR (rest2); | 1864 rest2 = XCDR (rest2); |
1870 if (go_tortoise) | 1865 if (go_tortoise) |
1871 tortoise = XCDR (tortoise); | 1866 tortoise = XCDR (tortoise); |
1872 go_tortoise = !go_tortoise; | 1867 go_tortoise = !go_tortoise; |
1873 if (GC_EQ (rest2, tortoise)) | 1868 if (EQ (rest2, tortoise)) |
1874 break; | 1869 break; |
1875 } | 1870 } |
1876 } | 1871 } |
1877 | 1872 |
1878 prev = rest; | 1873 prev = rest; |
2079 } | 2074 } |
2080 | 2075 |
2081 void | 2076 void |
2082 syms_of_data (void) | 2077 syms_of_data (void) |
2083 { | 2078 { |
2084 defsymbol (&Qcons, "cons"); | |
2085 defsymbol (&Qkeyword, "keyword"); | |
2086 defsymbol (&Qquote, "quote"); | 2079 defsymbol (&Qquote, "quote"); |
2087 defsymbol (&Qlambda, "lambda"); | 2080 defsymbol (&Qlambda, "lambda"); |
2088 defsymbol (&Qignore, "ignore"); | |
2089 defsymbol (&Qlistp, "listp"); | 2081 defsymbol (&Qlistp, "listp"); |
2090 defsymbol (&Qtrue_list_p, "true-list-p"); | 2082 defsymbol (&Qtrue_list_p, "true-list-p"); |
2091 defsymbol (&Qconsp, "consp"); | 2083 defsymbol (&Qconsp, "consp"); |
2092 defsymbol (&Qsubrp, "subrp"); | 2084 defsymbol (&Qsubrp, "subrp"); |
2093 defsymbol (&Qsymbolp, "symbolp"); | 2085 defsymbol (&Qsymbolp, "symbolp"); |
2094 defsymbol (&Qkeywordp, "keywordp"); | |
2095 defsymbol (&Qintegerp, "integerp"); | 2086 defsymbol (&Qintegerp, "integerp"); |
2096 defsymbol (&Qcharacterp, "characterp"); | 2087 defsymbol (&Qcharacterp, "characterp"); |
2097 defsymbol (&Qnatnump, "natnump"); | 2088 defsymbol (&Qnatnump, "natnump"); |
2098 defsymbol (&Qstringp, "stringp"); | 2089 defsymbol (&Qstringp, "stringp"); |
2099 defsymbol (&Qarrayp, "arrayp"); | 2090 defsymbol (&Qarrayp, "arrayp"); |
2106 defsymbol (&Qmarkerp, "markerp"); | 2097 defsymbol (&Qmarkerp, "markerp"); |
2107 defsymbol (&Qinteger_or_marker_p, "integer-or-marker-p"); | 2098 defsymbol (&Qinteger_or_marker_p, "integer-or-marker-p"); |
2108 defsymbol (&Qinteger_or_char_p, "integer-or-char-p"); | 2099 defsymbol (&Qinteger_or_char_p, "integer-or-char-p"); |
2109 defsymbol (&Qinteger_char_or_marker_p, "integer-char-or-marker-p"); | 2100 defsymbol (&Qinteger_char_or_marker_p, "integer-char-or-marker-p"); |
2110 defsymbol (&Qnumberp, "numberp"); | 2101 defsymbol (&Qnumberp, "numberp"); |
2111 defsymbol (&Qnumber_or_marker_p, "number-or-marker-p"); | |
2112 defsymbol (&Qnumber_char_or_marker_p, "number-char-or-marker-p"); | 2102 defsymbol (&Qnumber_char_or_marker_p, "number-char-or-marker-p"); |
2113 defsymbol (&Qcdr, "cdr"); | 2103 defsymbol (&Qcdr, "cdr"); |
2114 defsymbol (&Qweak_listp, "weak-list-p"); | 2104 defsymbol (&Qweak_listp, "weak-list-p"); |
2115 | 2105 |
2116 #ifdef LISP_FLOAT_TYPE | 2106 #ifdef LISP_FLOAT_TYPE |
2205 void | 2195 void |
2206 vars_of_data (void) | 2196 vars_of_data (void) |
2207 { | 2197 { |
2208 /* This must not be staticpro'd */ | 2198 /* This must not be staticpro'd */ |
2209 Vall_weak_lists = Qnil; | 2199 Vall_weak_lists = Qnil; |
2200 pdump_wire_list (&Vall_weak_lists); | |
2210 | 2201 |
2211 #ifdef DEBUG_XEMACS | 2202 #ifdef DEBUG_XEMACS |
2212 DEFVAR_BOOL ("debug-issue-ebola-notices", &debug_issue_ebola_notices /* | 2203 DEFVAR_BOOL ("debug-issue-ebola-notices", &debug_issue_ebola_notices /* |
2213 If non-zero, note when your code may be suffering from char-int confoundance. | 2204 If non-zero, note when your code may be suffering from char-int confoundance. |
2214 That is to say, if XEmacs encounters a usage of `eq', `memq', `equal', | 2205 That is to say, if XEmacs encounters a usage of `eq', `memq', `equal', |