@@ -70,6 +70,10 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
7070
7171 private class ContentOption = ContentOption:: Option ;
7272
73+ private predicate isLocalSourceNode ( LocalSourceNode n ) {
74+ not nonStandardFlowsTo ( _, _) and exists ( n )
75+ }
76+
7377 cached
7478 private module Cached {
7579 cached
@@ -249,21 +253,9 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
249253 returnStep ( nodeFrom , nodeTo ) and summary = ReturnStep ( )
250254 }
251255
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-
259256 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 )
267259
268260 cached
269261 predicate stepNoCall ( LocalSourceNode nodeFrom , LocalSourceNode nodeTo , StepSummary summary ) {
@@ -276,6 +268,15 @@ module TypeTracking<LocationSig Location, TypeTrackingInput<Location> I> {
276268 }
277269 }
278270
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+
279280 import Cached
280281
281282 /**
0 commit comments