diff options
Diffstat (limited to 'libguile/struct.c')
-rw-r--r-- | libguile/struct.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/libguile/struct.c b/libguile/struct.c index de8667d45..69ec7e634 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -564,10 +564,15 @@ scm_i_struct_equalp (SCM s1, SCM s2) field1 = scm_struct_ref (s1, s_field_num); field2 = scm_struct_ref (s2, s_field_num); - if (scm_is_false (scm_equal_p (field1, field2))) - return SCM_BOOL_F; + /* Self-referencing fields (type `s') must be skipped to avoid infinite + recursion. */ + if (!(scm_is_eq (field1, s1) && (scm_is_eq (field2, s2)))) + if (scm_is_false (scm_equal_p (field1, field2))) + return SCM_BOOL_F; } + /* FIXME: Tail elements should be tested for equality. */ + return SCM_BOOL_T; } #undef FUNC_NAME |