|
4 | 4 | "why": "One method per argument shape through which a disposable local can reach a callee, with the conversion edge on the way. Each is classified against the frozen taxonomy; `a2_1_observed` records what the corrected A2.1 extractor (A') emitted for it, measured, not assumed, so the A2.2 steps move a named row, never a number.", |
5 | 5 | "observed_at": "5a0de070af241a2612859153887ad6ae04afcce2", |
6 | 6 | "observed_at_note": "A' = corrected A2.1 treatment (PR #363), landed via main@23e3203; the extractor is byte-identical between A' and that merge. The superseded A (dce26ed) is not a measurement point.", |
| 7 | + "a2_2_1_note": "Measured with the A2.2-1 extractor (the IOperation value-flow walker) from the tree this file is committed in, before the commit: the SHA that carries this file is the SHA it was measured at. A2.2-1 promises exactly the transparent and may-value rows move to sidecar_call; every other row must read as it did at A'.", |
7 | 8 | "observed_vocabulary": { |
8 | 9 | "sidecar_call": "a function record with a guarded_facts call fact for the probe call", |
9 | 10 | "record_without_call_fact": "a function record exists but carries no call fact for the probe call", |
|
27 | 28 | "Plain": { |
28 | 29 | "class": "direct", |
29 | 30 | "conversion": "reference_upcast", |
30 | | - "a2_1_observed": "sidecar_call" |
| 31 | + "a2_1_observed": "sidecar_call", |
| 32 | + "a2_2_1_observed": "sidecar_call" |
31 | 33 | }, |
32 | 34 | "PlainSame": { |
33 | 35 | "class": "direct", |
34 | 36 | "conversion": "none", |
35 | 37 | "note": "identity binding to a NON-consuming callee: the legacy pass reads the pass as an escape, no tracked local remains, no record at all; the orphan carrier's case (\u00a710.6.6), and a direct flow", |
36 | | - "a2_1_observed": "no_record" |
| 38 | + "a2_1_observed": "no_record", |
| 39 | + "a2_2_1_observed": "no_record" |
37 | 40 | }, |
38 | 41 | "Parens": { |
39 | 42 | "class": "transparent", |
40 | 43 | "wrapper": "parenthesized", |
41 | 44 | "conversion": "reference_upcast", |
42 | | - "a2_1_observed": "sidecar_call" |
| 45 | + "a2_1_observed": "sidecar_call", |
| 46 | + "a2_2_1_observed": "sidecar_call" |
43 | 47 | }, |
44 | 48 | "IdentityCast": { |
45 | 49 | "class": "transparent", |
46 | 50 | "wrapper": "cast", |
47 | 51 | "conversion": "identity", |
48 | | - "a2_1_observed": "record_without_call_fact" |
| 52 | + "a2_1_observed": "record_without_call_fact", |
| 53 | + "a2_2_1_observed": "sidecar_call" |
49 | 54 | }, |
50 | 55 | "Cast": { |
51 | 56 | "class": "transparent", |
52 | 57 | "wrapper": "cast", |
53 | 58 | "conversion": "reference_upcast", |
54 | | - "a2_1_observed": "record_without_call_fact" |
| 59 | + "a2_1_observed": "record_without_call_fact", |
| 60 | + "a2_2_1_observed": "sidecar_call" |
55 | 61 | }, |
56 | 62 | "AsCast": { |
57 | 63 | "class": "transparent", |
58 | 64 | "wrapper": "as", |
59 | 65 | "conversion": "reference_upcast", |
60 | | - "a2_1_observed": "record_without_call_fact" |
| 66 | + "a2_1_observed": "record_without_call_fact", |
| 67 | + "a2_2_1_observed": "sidecar_call" |
61 | 68 | }, |
62 | 69 | "Bang": { |
63 | 70 | "class": "transparent", |
64 | 71 | "wrapper": "null_forgiving", |
65 | 72 | "conversion": "reference_upcast", |
66 | | - "a2_1_observed": "record_without_call_fact" |
| 73 | + "a2_1_observed": "record_without_call_fact", |
| 74 | + "a2_2_1_observed": "sidecar_call" |
67 | 75 | }, |
68 | 76 | "Ternary": { |
69 | 77 | "class": "may_value", |
70 | 78 | "form": "conditional", |
71 | 79 | "conversion": "reference_upcast", |
72 | | - "a2_1_observed": "record_without_call_fact" |
| 80 | + "a2_1_observed": "record_without_call_fact", |
| 81 | + "a2_2_1_observed": "sidecar_call" |
73 | 82 | }, |
74 | 83 | "Coalesce": { |
75 | 84 | "class": "may_value", |
76 | 85 | "form": "null_coalescing", |
77 | 86 | "conversion": "reference_upcast", |
78 | | - "a2_1_observed": "record_without_call_fact" |
| 87 | + "a2_1_observed": "record_without_call_fact", |
| 88 | + "a2_2_1_observed": "sidecar_call" |
79 | 89 | }, |
80 | 90 | "Switch": { |
81 | 91 | "class": "may_value", |
82 | 92 | "form": "switch_expression", |
83 | 93 | "conversion": "reference_upcast", |
84 | | - "a2_1_observed": "record_without_call_fact" |
| 94 | + "a2_1_observed": "record_without_call_fact", |
| 95 | + "a2_2_1_observed": "sidecar_call" |
85 | 96 | }, |
86 | 97 | "AsMayFail": { |
87 | 98 | "class": "may_value", |
88 | 99 | "form": "as_may_fail", |
89 | 100 | "conversion": "may_fail_null", |
90 | | - "a2_1_observed": "record_without_call_fact" |
| 101 | + "a2_1_observed": "record_without_call_fact", |
| 102 | + "a2_2_1_observed": "sidecar_call" |
91 | 103 | }, |
92 | 104 | "Ctor": { |
93 | 105 | "class": "call_like", |
94 | 106 | "form": "object_creation", |
95 | 107 | "conversion": "reference_upcast", |
96 | | - "a2_1_observed": "record_without_call_fact" |
| 108 | + "a2_1_observed": "record_without_call_fact", |
| 109 | + "a2_2_1_observed": "record_without_call_fact" |
97 | 110 | }, |
98 | 111 | "DelegateCall": { |
99 | 112 | "class": "call_like", |
100 | 113 | "form": "delegate_invocation", |
101 | 114 | "conversion": "reference_upcast", |
102 | | - "a2_1_observed": "no_record" |
| 115 | + "a2_1_observed": "no_record", |
| 116 | + "a2_2_1_observed": "no_record" |
103 | 117 | }, |
104 | 118 | "Nested": { |
105 | 119 | "class": "indirect", |
106 | 120 | "exclusion": "nested_call_result", |
107 | 121 | "conversion": "not_applicable", |
108 | 122 | "note": "Wrap(r) itself is direct and is owed its own call fact; Use receives call_result", |
109 | | - "a2_1_observed": "no_record" |
| 123 | + "a2_1_observed": "no_record", |
| 124 | + "a2_2_1_observed": "no_record" |
110 | 125 | }, |
111 | 126 | "ArrayInit": { |
112 | 127 | "class": "indirect", |
113 | 128 | "exclusion": "container_construction", |
114 | 129 | "conversion": "not_applicable", |
115 | | - "a2_1_observed": "record_without_call_fact" |
| 130 | + "a2_1_observed": "record_without_call_fact", |
| 131 | + "a2_2_1_observed": "record_without_call_fact" |
116 | 132 | }, |
117 | 133 | "CollectionInit": { |
118 | 134 | "class": "indirect", |
119 | 135 | "exclusion": "container_construction", |
120 | 136 | "conversion": "not_applicable", |
121 | | - "a2_1_observed": "record_without_call_fact" |
| 137 | + "a2_1_observed": "record_without_call_fact", |
| 138 | + "a2_2_1_observed": "record_without_call_fact" |
122 | 139 | }, |
123 | 140 | "Tuple": { |
124 | 141 | "class": "indirect", |
125 | 142 | "exclusion": "tuple_construction", |
126 | 143 | "conversion": "not_applicable", |
127 | | - "a2_1_observed": "no_record" |
| 144 | + "a2_1_observed": "no_record", |
| 145 | + "a2_2_1_observed": "no_record" |
128 | 146 | }, |
129 | 147 | "Closure": { |
130 | 148 | "class": "indirect", |
131 | 149 | "exclusion": "closure_capture", |
132 | 150 | "conversion": "not_applicable", |
133 | 151 | "note": "the inner Use(r) belongs to the lambda body, which has no record of its own (known gap)", |
134 | | - "a2_1_observed": "no_record" |
| 152 | + "a2_1_observed": "no_record", |
| 153 | + "a2_2_1_observed": "no_record" |
135 | 154 | }, |
136 | 155 | "MethodGroup": { |
137 | 156 | "class": "indirect", |
138 | 157 | "exclusion": "method_group_conversion", |
139 | 158 | "conversion": "not_applicable", |
140 | | - "a2_1_observed": "record_without_call_fact" |
| 159 | + "a2_1_observed": "record_without_call_fact", |
| 160 | + "a2_2_1_observed": "record_without_call_fact" |
141 | 161 | }, |
142 | 162 | "UserConversion": { |
143 | 163 | "class": "indirect", |
144 | 164 | "exclusion": "user_conversion", |
145 | 165 | "conversion": "user_defined_implicit", |
146 | 166 | "note": "syntactically a bare identifier; only the semantic model shows the hidden op_Implicit", |
147 | | - "a2_1_observed": "no_record" |
| 167 | + "a2_1_observed": "no_record", |
| 168 | + "a2_2_1_observed": "no_record" |
148 | 169 | }, |
149 | 170 | "ExplicitUserConversion": { |
150 | 171 | "class": "indirect", |
151 | 172 | "exclusion": "user_conversion", |
152 | 173 | "conversion": "user_defined_explicit", |
153 | 174 | "note": "syntactically a cast; the user-defined operator sits inside the cast expression, and (XBox)r already has type XBox at the call", |
154 | | - "a2_1_observed": "record_without_call_fact" |
| 175 | + "a2_1_observed": "record_without_call_fact", |
| 176 | + "a2_2_1_observed": "record_without_call_fact" |
155 | 177 | }, |
156 | 178 | "NameOf": { |
157 | 179 | "class": "indirect", |
158 | 180 | "exclusion": "nameof_operand", |
159 | 181 | "conversion": "not_applicable", |
160 | | - "a2_1_observed": "record_without_call_fact" |
| 182 | + "a2_1_observed": "record_without_call_fact", |
| 183 | + "a2_2_1_observed": "record_without_call_fact" |
161 | 184 | }, |
162 | 185 | "MemberAccess": { |
163 | 186 | "class": "indirect", |
164 | 187 | "exclusion": "member_access_on_handle", |
165 | 188 | "conversion": "not_applicable", |
166 | | - "a2_1_observed": "record_without_call_fact" |
| 189 | + "a2_1_observed": "record_without_call_fact", |
| 190 | + "a2_2_1_observed": "record_without_call_fact" |
167 | 191 | }, |
168 | 192 | "Receiver": { |
169 | 193 | "class": "indirect", |
170 | 194 | "exclusion": "receiver_not_summary_parameter", |
171 | 195 | "conversion": "not_applicable", |
172 | | - "a2_1_observed": "record_without_call_fact" |
| 196 | + "a2_1_observed": "record_without_call_fact", |
| 197 | + "a2_2_1_observed": "record_without_call_fact" |
173 | 198 | }, |
174 | 199 | "Indexer": { |
175 | 200 | "class": "indirect", |
176 | 201 | "exclusion": "storage_assignment", |
177 | 202 | "conversion": "not_applicable", |
178 | | - "a2_1_observed": "no_record" |
| 203 | + "a2_1_observed": "no_record", |
| 204 | + "a2_2_1_observed": "no_record" |
179 | 205 | } |
180 | 206 | } |
181 | 207 | } |
0 commit comments