Skip to content

Commit 044c920

Browse files
committed
Data flow: Cache enclosing callable predicates
1 parent 3737764 commit 044c920

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,14 @@ private DataFlowCallable viableCallableExt(DataFlowCall call) {
242242

243243
cached
244244
private module Cached {
245+
cached
246+
predicate nodeEnclosingCallable(Node n, DataFlowCallable c) { c = n.getEnclosingCallable() }
247+
248+
cached
249+
predicate callEnclosingCallable(DataFlowCall call, DataFlowCallable c) {
250+
c = call.getEnclosingCallable()
251+
}
252+
245253
/**
246254
* Gets a viable target for the lambda call `call`.
247255
*
@@ -553,7 +561,7 @@ private module Cached {
553561
private predicate mayBenefitFromCallContextExt(DataFlowCall call, DataFlowCallable callable) {
554562
mayBenefitFromCallContext(call, callable)
555563
or
556-
callable = call.getEnclosingCallable() and
564+
callEnclosingCallable(call, callable) and
557565
exists(viableCallableLambda(call, TDataFlowCallSome(_)))
558566
}
559567

@@ -611,7 +619,7 @@ private module Cached {
611619
mayBenefitFromCallContextExt(call, _) and
612620
c = viableCallableExt(call) and
613621
ctxtgts = count(DataFlowCall ctx | c = viableImplInCallContextExt(call, ctx)) and
614-
tgts = strictcount(DataFlowCall ctx | viableCallableExt(ctx) = call.getEnclosingCallable()) and
622+
tgts = strictcount(DataFlowCall ctx | callEnclosingCallable(call, viableCallableExt(ctx))) and
615623
ctxtgts < tgts
616624
)
617625
}
@@ -866,7 +874,7 @@ class CallContextReturn extends CallContextNoCall, TReturn {
866874
}
867875

868876
override predicate relevantFor(DataFlowCallable callable) {
869-
exists(DataFlowCall call | this = TReturn(_, call) and call.getEnclosingCallable() = callable)
877+
exists(DataFlowCall call | this = TReturn(_, call) and callEnclosingCallable(call, callable))
870878
}
871879
}
872880

@@ -1017,7 +1025,7 @@ pragma[inline]
10171025
DataFlowCallable getNodeEnclosingCallable(Node n) {
10181026
exists(Node n0 |
10191027
pragma[only_bind_into](n0) = n and
1020-
pragma[only_bind_into](result) = n0.getEnclosingCallable()
1028+
nodeEnclosingCallable(n0, pragma[only_bind_into](result))
10211029
)
10221030
}
10231031

@@ -1042,7 +1050,7 @@ predicate resolveReturn(CallContext cc, DataFlowCallable callable, DataFlowCall
10421050
cc instanceof CallContextAny and callable = viableCallableExt(call)
10431051
or
10441052
exists(DataFlowCallable c0, DataFlowCall call0 |
1045-
call0.getEnclosingCallable() = callable and
1053+
callEnclosingCallable(call0, callable) and
10461054
cc = TReturn(c0, call0) and
10471055
c0 = prunedViableImplInCallContextReverse(call0, call)
10481056
)

0 commit comments

Comments
 (0)