summaryrefslogtreecommitdiff
path: root/module/system/foreign.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2011-04-11 23:30:52 +0200
committerAndy Wingo <wingo@pobox.com>2011-04-11 23:30:52 +0200
commit21c05db45b69f8a62b84c36abc86cb935fa967d7 (patch)
tree743df01da540e7fd628f54894e7d5fbe94b03996 /module/system/foreign.scm
parent4db853d747ac115f799c93e2de93f5159ad84109 (diff)
parentc89b45299329d034875429804f18768c1ea96713 (diff)
downloadguile-21c05db45b69f8a62b84c36abc86cb935fa967d7.tar.gz
Merge remote branch 'origin/stable-2.0'
Conflicts: GUILE-VERSION test-suite/tests/srfi-4.test
Diffstat (limited to 'module/system/foreign.scm')
-rw-r--r--module/system/foreign.scm15
1 files changed, 10 insertions, 5 deletions
diff --git a/module/system/foreign.scm b/module/system/foreign.scm
index 781e79369..37f9b41ac 100644
--- a/module/system/foreign.scm
+++ b/module/system/foreign.scm
@@ -37,6 +37,8 @@
null-pointer?
pointer?
make-pointer
+ pointer->scm
+ scm->pointer
pointer-address
pointer->bytevector
@@ -190,9 +192,12 @@ which does the reverse. PRINT must name a user-defined object printer."
;; PTR1 == PTR2 <-> (eq? (wrap PTR1) (wrap PTR2)).
(let ((ptr->obj (make-weak-value-hash-table 3000)))
(lambda (ptr)
- (let ((key+value (hash-create-handle! ptr->obj ptr #f)))
- (or (cdr key+value)
- (let ((o (%wrap ptr)))
- (set-cdr! key+value o)
- o))))))
+ ;; XXX: We can't use `hash-create-handle!' +
+ ;; `set-cdr!' here because the former would create a
+ ;; weak-cdr pair but the latter wouldn't register a
+ ;; disappearing link (see `scm_hash_fn_set_x'.)
+ (or (hash-ref ptr->obj ptr)
+ (let ((o (%wrap ptr)))
+ (hash-set! ptr->obj ptr o)
+ o)))))
(set-record-type-printer! type-name print)))))))