aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fns.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/fns.c b/src/fns.c
index 2de04d06519..ef6922c137b 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2823,8 +2823,8 @@ static ptrdiff_t hash_lookup_with_hash (struct Lisp_Hash_Table *h,
2823 if EQUAL_KIND == EQUAL_NO_QUIT. */ 2823 if EQUAL_KIND == EQUAL_NO_QUIT. */
2824 2824
2825static bool 2825static bool
2826internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind, 2826internal_equal_1 (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2827 int depth, Lisp_Object ht) 2827 int depth, Lisp_Object *ht)
2828{ 2828{
2829 tail_recurse: 2829 tail_recurse:
2830 if (depth > 10) 2830 if (depth > 10)
@@ -2832,13 +2832,13 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2832 eassert (equal_kind != EQUAL_NO_QUIT); 2832 eassert (equal_kind != EQUAL_NO_QUIT);
2833 if (depth > 200) 2833 if (depth > 200)
2834 error ("Stack overflow in equal"); 2834 error ("Stack overflow in equal");
2835 if (NILP (ht)) 2835 if (NILP (*ht))
2836 ht = CALLN (Fmake_hash_table, QCtest, Qeq); 2836 *ht = CALLN (Fmake_hash_table, QCtest, Qeq);
2837 switch (XTYPE (o1)) 2837 switch (XTYPE (o1))
2838 { 2838 {
2839 case Lisp_Cons: case Lisp_Vectorlike: 2839 case Lisp_Cons: case Lisp_Vectorlike:
2840 { 2840 {
2841 struct Lisp_Hash_Table *h = XHASH_TABLE (ht); 2841 struct Lisp_Hash_Table *h = XHASH_TABLE (*ht);
2842 hash_hash_t hash = hash_from_key (h, o1); 2842 hash_hash_t hash = hash_from_key (h, o1);
2843 ptrdiff_t i = hash_lookup_with_hash (h, o1, hash); 2843 ptrdiff_t i = hash_lookup_with_hash (h, o1, hash);
2844 if (i >= 0) 2844 if (i >= 0)
@@ -2888,8 +2888,8 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2888 { 2888 {
2889 if (! CONSP (o2)) 2889 if (! CONSP (o2))
2890 return false; 2890 return false;
2891 if (! internal_equal (XCAR (o1), XCAR (o2), 2891 if (! internal_equal_1 (XCAR (o1), XCAR (o2),
2892 equal_kind, depth + 1, ht)) 2892 equal_kind, depth + 1, ht))
2893 return false; 2893 return false;
2894 o2 = XCDR (o2); 2894 o2 = XCDR (o2);
2895 if (EQ (XCDR (o1), o2)) 2895 if (EQ (XCDR (o1), o2))
@@ -2964,7 +2964,7 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2964 Lisp_Object v1, v2; 2964 Lisp_Object v1, v2;
2965 v1 = AREF (o1, i); 2965 v1 = AREF (o1, i);
2966 v2 = AREF (o2, i); 2966 v2 = AREF (o2, i);
2967 if (!internal_equal (v1, v2, equal_kind, depth + 1, ht)) 2967 if (!internal_equal_1 (v1, v2, equal_kind, depth + 1, ht))
2968 return false; 2968 return false;
2969 } 2969 }
2970 return true; 2970 return true;
@@ -2985,6 +2985,13 @@ internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2985 return false; 2985 return false;
2986} 2986}
2987 2987
2988static bool
2989internal_equal (Lisp_Object o1, Lisp_Object o2, enum equal_kind equal_kind,
2990 int depth, Lisp_Object ht)
2991{
2992 return internal_equal_1 (o1, o2, equal_kind, depth, &ht);
2993}
2994
2988/* Return -1/0/1 for the </=/> lexicographic relation between bool-vectors. */ 2995/* Return -1/0/1 for the </=/> lexicographic relation between bool-vectors. */
2989static int 2996static int
2990bool_vector_cmp (Lisp_Object a, Lisp_Object b) 2997bool_vector_cmp (Lisp_Object a, Lisp_Object b)