@@ -17,6 +17,56 @@ import (
17
17
"golang.org/x/tools/go/analysis"
18
18
)
19
19
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
+
20
70
// NOTE(ldez) no alteration.
21
71
// codeFact encodes then decodes a fact,
22
72
// just to exercise that logic.
0 commit comments