@@ -17,6 +17,56 @@ import (
1717 "golang.org/x/tools/go/analysis"
1818)
1919
20+ // NOTE(ldez) altered: logger; serialize.
21+ // inheritFacts populates act.facts with
22+ // those it obtains from its dependency, dep.
23+ func inheritFacts (act , dep * action ) {
24+ const serialize = false
25+
26+ for key , fact := range dep .objectFacts {
27+ // Filter out facts related to objects
28+ // that are irrelevant downstream
29+ // (equivalently: not in the compiler export data).
30+ if ! exportedFrom (key .obj , dep .pkg .Types ) {
31+ factsInheritDebugf ("%v: discarding %T fact from %s for %s: %s" , act , fact , dep , key .obj , fact )
32+ continue
33+ }
34+
35+ // Optionally serialize/deserialize fact
36+ // to verify that it works across address spaces.
37+ if serialize {
38+ var err error
39+ fact , err = codeFact (fact )
40+ if err != nil {
41+ act .r .log .Panicf ("internal error: encoding of %T fact failed in %v" , fact , act )
42+ }
43+ }
44+
45+ factsInheritDebugf ("%v: inherited %T fact for %s: %s" , act , fact , key .obj , fact )
46+ act .objectFacts [key ] = fact
47+ }
48+
49+ for key , fact := range dep .packageFacts {
50+ // TODO: filter out facts that belong to
51+ // packages not mentioned in the export data
52+ // to prevent side channels.
53+
54+ // Optionally serialize/deserialize fact
55+ // to verify that it works across address spaces
56+ // and is deterministic.
57+ if serialize {
58+ var err error
59+ fact , err = codeFact (fact )
60+ if err != nil {
61+ act .r .log .Panicf ("internal error: encoding of %T fact failed in %v" , fact , act )
62+ }
63+ }
64+
65+ factsInheritDebugf ("%v: inherited %T fact for %s: %s" , act , fact , key .pkg .Path (), fact )
66+ act .packageFacts [key ] = fact
67+ }
68+ }
69+
2070// NOTE(ldez) no alteration.
2171// codeFact encodes then decodes a fact,
2272// just to exercise that logic.
0 commit comments