@@ -70,6 +70,10 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
70
70
71
71
private class ContentOption = ContentOption:: Option ;
72
72
73
+ private predicate isLocalSourceNode ( LocalSourceNode n ) {
74
+ not nonStandardFlowsTo ( _, _) and exists ( n )
75
+ }
76
+
73
77
cached
74
78
private module Cached {
75
79
cached
@@ -249,21 +253,9 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
249
253
returnStep ( nodeFrom , nodeTo ) and summary = ReturnStep ( )
250
254
}
251
255
252
- pragma [ inline]
253
- private predicate isLocalSourceNode ( LocalSourceNode n ) { any ( ) }
254
-
255
256
cached
256
- predicate standardFlowsTo ( Node localSource , Node dst ) {
257
- not nonStandardFlowsTo ( _, _) and
258
- // explicit type check in base case to avoid repeated type tests in recursive case
259
- isLocalSourceNode ( localSource ) and
260
- dst = localSource
261
- or
262
- exists ( Node mid |
263
- standardFlowsTo ( localSource , mid ) and
264
- simpleLocalSmallStep ( mid , dst )
265
- )
266
- }
257
+ predicate simpleLocalSmallStepPlus ( Node localSource , Node dst ) =
258
+ sourceBoundedFastTC( simpleLocalSmallStep / 2 , isLocalSourceNode / 1 ) ( localSource , dst )
267
259
268
260
cached
269
261
predicate stepNoCall ( LocalSourceNode nodeFrom , LocalSourceNode nodeTo , StepSummary summary ) {
@@ -276,6 +268,14 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
276
268
}
277
269
}
278
270
271
+ pragma [ inline]
272
+ private predicate standardFlowsTo ( Node localSource , Node dst ) {
273
+ isLocalSourceNode ( localSource ) and
274
+ dst = localSource
275
+ or
276
+ simpleLocalSmallStepPlus ( localSource , dst )
277
+ }
278
+
279
279
import Cached
280
280
281
281
/**
0 commit comments