From 99653bab910f8d0a397ded3aafd0667507eb1c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Sat, 26 Nov 2016 12:58:09 +0100 Subject: [PATCH] compiler.crossref: better code for getting dependencies-of + tests --- basis/compiler/crossref/crossref-docs.factor | 3 ++ basis/compiler/crossref/crossref-tests.factor | 46 ++++++++++++++++++- basis/compiler/crossref/crossref.factor | 15 +++--- core/generic/standard/standard-tests.factor | 2 +- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/basis/compiler/crossref/crossref-docs.factor b/basis/compiler/crossref/crossref-docs.factor index 337c3734b2..3eb9bcb965 100644 --- a/basis/compiler/crossref/crossref-docs.factor +++ b/basis/compiler/crossref/crossref-docs.factor @@ -1,6 +1,9 @@ USING: assocs help.markup help.syntax words ; IN: compiler.crossref +HELP: compiled-crossref +{ $var-description "A hashtable that maps words to other words that depend on them. It also stores the types of the dependencies." } ; + HELP: load-dependencies { $values { "word" word } { "assoc" assoc } } { $description "Creates an assoc where keys are the words the word depends on and values are the dependency type." } ; diff --git a/basis/compiler/crossref/crossref-tests.factor b/basis/compiler/crossref/crossref-tests.factor index 18965d1bd7..b3a3babce7 100644 --- a/basis/compiler/crossref/crossref-tests.factor +++ b/basis/compiler/crossref/crossref-tests.factor @@ -1,4 +1,5 @@ -USING: compiler.crossref fry kernel sequences tools.test vocabs words ; +USING: compiler.crossref fry kernel namespaces sequences +stack-checker.dependencies tools.test vocabs words ; IN: compiler.crossref.tests ! Dependencies of all words should always be satisfied unless we're @@ -7,3 +8,46 @@ IN: compiler.crossref.tests all-words dup [ subwords ] map concat append H{ } clone '[ _ dependencies-satisfied? ] reject ] unit-test + +: setup-crossref ( -- assoc ) + H{ + { + 10 + H{ + { 20 definition-dependency } + { 30 conditional-dependency } + { 40 effect-dependency } + } + } + } clone ; + +! dependencies-of +{ + H{ { 20 definition-dependency } } +} [ + setup-crossref compiled-crossref [ + 10 definition-dependency dependencies-of + ] with-variable +] unit-test + +{ + H{ { 20 definition-dependency } { 30 conditional-dependency } } +} [ + setup-crossref compiled-crossref [ + 10 conditional-dependency dependencies-of + ] with-variable +] unit-test + +! join-dependencies +{ + H{ + { 1 effect-dependency } + { 2 effect-dependency } + { 3 conditional-dependency } + { 4 conditional-dependency } + { 5 definition-dependency } + { 6 definition-dependency } + } +} [ + { 1 2 } { 3 4 } { 5 6 } join-dependencies +] unit-test diff --git a/basis/compiler/crossref/crossref.factor b/basis/compiler/crossref/crossref.factor index 09f092dbcd..92a0d669be 100644 --- a/basis/compiler/crossref/crossref.factor +++ b/basis/compiler/crossref/crossref.factor @@ -12,20 +12,17 @@ SYMBOL: generic-call-site-crossref generic-call-site-crossref [ H{ } clone ] initialize -: effect-dependencies-of ( word -- assoc ) +: all-dependencies-of ( word -- assoc ) compiled-crossref get at ; -: definition-dependencies-of ( word -- assoc ) - effect-dependencies-of [ nip definition-dependency dependency>= ] assoc-filter ; - -: conditional-dependencies-of ( word -- assoc ) - effect-dependencies-of [ nip conditional-dependency dependency>= ] assoc-filter ; +: dependencies-of ( word dep-type -- assoc ) + [ all-dependencies-of ] dip '[ nip _ dependency>= ] assoc-filter ; : outdated-definition-usages ( set -- assocs ) - members [ word? ] filter [ definition-dependencies-of ] map ; + members [ word? ] filter [ definition-dependency dependencies-of ] map ; : outdated-effect-usages ( set -- assocs ) - members [ word? ] filter [ effect-dependencies-of ] map ; + members [ word? ] filter [ all-dependencies-of ] map ; : dependencies-satisfied? ( word cache -- ? ) [ "dependency-checks" word-prop ] dip @@ -33,7 +30,7 @@ generic-call-site-crossref [ H{ } clone ] initialize : outdated-conditional-usages ( set -- assocs ) members H{ } clone '[ - conditional-dependencies-of + conditional-dependency dependencies-of [ drop _ dependencies-satisfied? ] assoc-reject ] map ; diff --git a/core/generic/standard/standard-tests.factor b/core/generic/standard/standard-tests.factor index f194ac1959..ac9f0efe09 100644 --- a/core/generic/standard/standard-tests.factor +++ b/core/generic/standard/standard-tests.factor @@ -401,7 +401,7 @@ M: integer forget-test 3 + ; { } [ "IN: generic.standard.tests USE: math FORGET: M\\ integer forget-test" eval( -- ) ] unit-test { { } } [ - \ + effect-dependencies-of keys [ method? ] filter + \ + all-dependencies-of keys [ method? ] filter [ "method-generic" word-prop \ forget-test eq? ] filter ] unit-test