@@ -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
- private predicate isLocalSourceNode ( LocalSourceNode n ) {
253
- not nonStandardFlowsTo ( _, _) and exists ( n )
254
- }
255
-
256
- private predicate simpleLocalSmallStepPlus ( Node localSource , Node dst ) =
257
- sourceBoundedFastTC( simpleLocalSmallStep / 2 , isLocalSourceNode / 1 ) ( localSource , dst )
258
-
259
256
cached
260
- predicate standardFlowsTo ( Node localSource , Node dst ) {
261
- // explicit type check in base case to avoid repeated type tests in recursive case
262
- isLocalSourceNode ( localSource ) and
263
- dst = localSource
264
- or
265
- simpleLocalSmallStepPlus ( localSource , dst )
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,15 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
276
268
}
277
269
}
278
270
271
+ pragma [ inline]
272
+ predicate standardFlowsTo ( Node localSource , Node dst ) {
273
+ // explicit type check in base case to avoid repeated type tests in recursive case
274
+ isLocalSourceNode ( localSource ) and
275
+ dst = localSource
276
+ or
277
+ simpleLocalSmallStepPlus ( localSource , dst )
278
+ }
279
+
279
280
import Cached
280
281
281
282
/**
0 commit comments