summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-03-28 22:21:00 -0700
committerAndy Wingo <wingo@pobox.com>2009-03-28 22:21:00 -0700
commit6ecae97fb8dca2e5e26af44a649a706431c65756 (patch)
tree69f900ad62d35a6a7897c5a480c616e34071ae3f
parent154a6116699b5be1bc7b4968e497c8542fca7076 (diff)
downloadguile-6ecae97fb8dca2e5e26af44a649a706431c65756.tar.gz
fix duplicates in procedure-callers
* module/system/xref.scm (ensure-callers-db): OK! Since we can see the same variable twice, e.g. in different modules, keep a unified hash of seen vars and modules. Prevents duplicates in procedure-callers.
-rw-r--r--module/system/xref.scm11
1 files changed, 7 insertions, 4 deletions
diff --git a/module/system/xref.scm b/module/system/xref.scm
index db6823844..be44225f3 100644
--- a/module/system/xref.scm
+++ b/module/system/xref.scm
@@ -95,24 +95,26 @@
(set! *callers-db* #f)))
(define (ensure-callers-db)
- (let ((visited '())
+ (let ((visited #f)
(db #f))
(define (visit-variable var)
(if (variable-bound? var)
(let ((x (variable-ref var)))
(cond
+ ((hashq-ref visited x))
((procedure? x)
+ (hashq-set! visited x #t)
(for-each
(lambda (callee)
(if (variable-bound? callee)
(hashq-set! db callee
(cons x (hashq-ref db callee '())))))
(procedure-callee-rev-vars x)))
- ((and (module? x) (not (memq x visited)))
+ ((module? x)
(visit-module x))))))
(define (visit-module mod)
- (set! visited (cons mod visited))
+ (hashq-set! visited mod #t)
(if (not (memq on-module-modified (module-observers mod)))
(module-observe mod on-module-modified))
(module-for-each (lambda (sym var)
@@ -121,7 +123,8 @@
(if (not *callers-db*)
(begin
- (set! db (make-hash-table))
+ (set! db (make-hash-table 1000))
+ (set! visited (make-hash-table 1000))
(visit-module the-root-module)
(set! *callers-db* db)))))