diff --git a/src/mapping.c b/src/mapping.c index 170446cf599b0596c529a2c5052b37a2b8a77db5..42601813ca8abe70c30c89d3378bafa7ab3f2124 100644 --- a/src/mapping.c +++ b/src/mapping.c @@ -121,6 +121,10 @@ static INLINE int check_type_contains(TYPE_FIELD types, const struct svalue * s) return (TYPEOF(*s) == PIKE_T_OBJECT || types & (BIT_OBJECT|(1 << TYPEOF(*s)))); } +static INLINE int check_type_overlaps(TYPE_FIELD t1, TYPE_FIELD t2) { + return t1 & t2 || (t1|t2) & BIT_OBJECT; +} + #ifdef PIKE_DEBUG /** This function checks that the type field isn't lacking any bits. @@ -1880,6 +1884,9 @@ PMOD_EXPORT int mapping_equal_p(struct mapping *a, struct mapping *b, struct pro if(m_sizeof(a) != m_sizeof(b)) return 0; + if (!check_type_overlaps(a->data->ind_types, b->data->ind_types) || + !check_type_overlaps(a->data->val_types, b->data->val_types)) return 0; + curr.pointer_a = a; curr.pointer_b = b; curr.next = p;