diff --git a/libguile/eq.c b/libguile/eq.c index 923fa77a1..75025598c 100644 --- a/libguile/eq.c +++ b/libguile/eq.c @@ -303,6 +303,9 @@ scm_equal_p (SCM x, SCM y) else goto generic_equal; } + if (SCM_POINTER_P (x) && SCM_POINTER_P (y)) + return scm_from_bool (SCM_POINTER_VALUE (x) == SCM_POINTER_VALUE (y)); + /* This ensures that types and scm_length are the same. */ if (SCM_CELL_TYPE (x) != SCM_CELL_TYPE (y)) { diff --git a/test-suite/tests/foreign.test b/test-suite/tests/foreign.test index 274a06d8c..db92eca4d 100644 --- a/test-suite/tests/foreign.test +++ b/test-suite/tests/foreign.test @@ -47,7 +47,18 @@ (with-test-prefix "make-pointer" (pass-if "address preserved" - (= 123 (pointer-address (make-pointer 123))))) + (= 123 (pointer-address (make-pointer 123)))) + + (pass-if "equal?" + (equal? (make-pointer 123) (make-pointer 123))) + + (pass-if "equal? modulo finalizer" + (let ((finalizer (dynamic-func "scm_is_pair" (dynamic-link)))) + (equal? (make-pointer 123) + (make-pointer 123 finalizer)))) + + (pass-if "not equal?" + (not (equal? (make-pointer 123) (make-pointer 456))))) (with-test-prefix "pointer<->bytevector"