@@ -51,8 +51,8 @@ module StepSummary {
5151 * heap and/or inter-procedural step from `nodeFrom` to `nodeTo`.
5252 */
5353 cached
54- predicate step ( LocalSourceNode nodeFrom , Node nodeTo , StepSummary summary ) {
55- exists ( Node mid | typePreservingStep * ( nodeFrom , mid ) and smallstep ( mid , nodeTo , summary ) )
54+ predicate step ( LocalSourceNode nodeFrom , LocalSourceNode nodeTo , StepSummary summary ) {
55+ exists ( Node mid | nodeFrom . flowsTo ( mid ) and smallstep ( mid , nodeTo , summary ) )
5656 }
5757
5858 /**
@@ -63,7 +63,7 @@ module StepSummary {
6363 * type-preserving steps.
6464 */
6565 predicate smallstep ( Node nodeFrom , Node nodeTo , StepSummary summary ) {
66- typePreservingStep ( nodeFrom , nodeTo ) and
66+ jumpStep ( nodeFrom , nodeTo ) and
6767 summary = LevelStep ( )
6868 or
6969 callStep ( nodeFrom , nodeTo ) and summary = CallStep ( )
@@ -80,12 +80,6 @@ module StepSummary {
8080 }
8181}
8282
83- /** Holds if it's reasonable to expect the data flow step from `nodeFrom` to `nodeTo` to preserve types. */
84- private predicate typePreservingStep ( Node nodeFrom , Node nodeTo ) {
85- simpleLocalFlowStep ( nodeFrom , nodeTo ) or
86- jumpStep ( nodeFrom , nodeTo )
87- }
88-
8983/**
9084 * Gets a callable for the call where `nodeFrom` is used as the `i`'th argument.
9185 *
@@ -274,10 +268,10 @@ class TypeTracker extends TTypeTracker {
274268 * heap and/or inter-procedural step from `nodeFrom` to `nodeTo`.
275269 */
276270 pragma [ inline]
277- TypeTracker step ( LocalSourceNode nodeFrom , Node nodeTo ) {
271+ TypeTracker step ( LocalSourceNode nodeFrom , LocalSourceNode nodeTo ) {
278272 exists ( StepSummary summary |
279- StepSummary:: step ( nodeFrom , nodeTo , summary ) and
280- result = this .append ( summary )
273+ StepSummary:: step ( nodeFrom , pragma [ only_bind_out ] ( nodeTo ) , pragma [ only_bind_into ] ( summary ) ) and
274+ result = this .append ( pragma [ only_bind_into ] ( summary ) )
281275 )
282276 }
283277
@@ -312,7 +306,7 @@ class TypeTracker extends TTypeTracker {
312306 result = this .append ( summary )
313307 )
314308 or
315- typePreservingStep ( nodeFrom , nodeTo ) and
309+ simpleLocalFlowStep ( nodeFrom , nodeTo ) and
316310 result = this
317311 }
318312}
@@ -417,8 +411,8 @@ class TypeBackTracker extends TTypeBackTracker {
417411 pragma [ inline]
418412 TypeBackTracker step ( LocalSourceNode nodeFrom , LocalSourceNode nodeTo ) {
419413 exists ( StepSummary summary |
420- StepSummary:: step ( nodeFrom , nodeTo , summary ) and
421- this = result .prepend ( summary )
414+ StepSummary:: step ( pragma [ only_bind_out ] ( nodeFrom ) , nodeTo , pragma [ only_bind_into ] ( summary ) ) and
415+ this = result .prepend ( pragma [ only_bind_into ] ( summary ) )
422416 )
423417 }
424418
@@ -453,7 +447,7 @@ class TypeBackTracker extends TTypeBackTracker {
453447 this = result .prepend ( summary )
454448 )
455449 or
456- typePreservingStep ( nodeFrom , nodeTo ) and
450+ simpleLocalFlowStep ( nodeFrom , nodeTo ) and
457451 this = result
458452 }
459453}
0 commit comments