diff options
author | Andy Wingo <wingo@pobox.com> | 2009-03-28 22:21:00 -0700 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-03-28 22:21:00 -0700 |
commit | 6ecae97fb8dca2e5e26af44a649a706431c65756 (patch) | |
tree | 69f900ad62d35a6a7897c5a480c616e34071ae3f /module/system/xref.scm | |
parent | 154a6116699b5be1bc7b4968e497c8542fca7076 (diff) | |
download | guile-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.
Diffstat (limited to 'module/system/xref.scm')
-rw-r--r-- | module/system/xref.scm | 11 |
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))))) |