Skip to content

Commit d69be77

Browse files
committed
Rust: Avoid expensive regex calls
Before ``` Pipeline standard for TypeInference::AssocFunctionResolution::AssocFunctionCall.hasIncompatibleTarget/5#85c07422@d5eb7r0w was evaluated in 782 iterations totaling 13208ms (delta sizes total: 20187834). 1464 ~2% {7} r1 = JOIN `TypeInference::AssocFunctionResolution::SelfArgIsInstantiationOf::argIsInstantiationOf/6#aaa87ac9#prev_delta` WITH `TypeInference::AssocFunctionResolution::OverloadedCallArgsAreInstantiationsOf::argsAreNotInstantiationsOf/2#6a6070f7#prev` ON FIRST 2 OUTPUT Lhs.5, _, Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4 1464 ~0% {7} | REWRITE WITH Out.1 := "" 1464 ~0% {6} | JOIN WITH `FunctionType::AssocFunctionType.getTypeAt/1#dispred#d4d46f61` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Rhs.2 173691 ~1% {7} r2 = JOIN `TypeInference::AssocFunctionResolution::OverloadedCallArgsAreInstantiationsOf::argsAreNotInstantiationsOf/2#6a6070f7#prev_delta` WITH `TypeInference::AssocFunctionResolution::SelfArgIsInstantiationOf::argIsInstantiationOf/6#aaa87ac9#prev` ON FIRST 2 OUTPUT Rhs.5, _, Lhs.0, Lhs.1, Rhs.2, Rhs.3, Rhs.4 173691 ~1% {7} | REWRITE WITH Out.1 := "" 173691 ~1% {6} | JOIN WITH `FunctionType::AssocFunctionType.getTypeAt/1#dispred#d4d46f61` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Rhs.2 20022454 ~0% {7} r3 = SCAN `TypeInference::AssocFunctionResolution::SelfArgIsInstantiationOf::argIsNotInstantiationOf/6#1b8e512e#prev_delta` OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _ 20022454 ~0% {7} | REWRITE WITH Out.6 := "^([0-9]+)\\..*$" 20022175 ~2% {9} | JOIN WITH PRIMITIVE regexpCapture#bbff ON Lhs.5,Lhs.6 20022175 ~2% {10} | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, In.6, In.7, In.8, _ {9} | REWRITE WITH Tmp.9 := 1, TEST InOut.7 = Tmp.9 KEEPING 9 20022175 ~1% {7} | SCAN OUTPUT In.8, In.0, In.1, In.2, In.3, In.4, In.5 20022175 ~1% {8} | JOIN WITH `UnboundList::Make<Locations::Location,TypeInference::M1::UnboundListInput>::encode/1#47b2ec3f_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.0 20022175 ~0% {10} | JOIN WITH `Type::Type.getATypeParameter/0#dispred#ddf0e8ff_10#join_rhs` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.1, _, Lhs.6, Lhs.7, _ {7} | REWRITE WITH Tmp.6 := length(In.8), Tmp.9 := 1, Tmp.6 := (Tmp.6 + Tmp.9), Out.6 := suffix(In.7,Tmp.6) KEEPING 7 20022175 ~0% {6} | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5 20197330 ~0% {6} r4 = r1 UNION r2 UNION r3 20187834 ~0% {6} | AND NOT `TypeInference::AssocFunctionResolution::AssocFunctionCall.hasIncompatibleTarget/5#85c07422#prev`(FIRST 6) return r4 ``` After ``` Pipeline standard for TypeInference::AssocFunctionResolution::AssocFunctionCall.hasIncompatibleTarget/5#85c07422@a58ce91w was evaluated in 537 iterations totaling 382ms (delta sizes total: 20033950). 19862347 ~0% {7} r1 = SCAN `TypeInference::AssocFunctionResolution::SelfArgIsInstantiationOf::argIsNotInstantiationOf/6#1b8e512e#prev_delta` OUTPUT In.5, _, In.0, In.1, In.2, In.3, In.4 19862347 ~0% {7} | REWRITE WITH Out.1 := "" 174684 ~1% {7} r2 = SCAN `TypeInference::AssocFunctionResolution::AssocFunctionCall.hasIncompatibleArgsTarget/5#dispred#7d49b9f9#prev_delta` OUTPUT In.5, _, In.0, In.1, In.2, In.3, In.4 174684 ~1% {7} | REWRITE WITH Out.1 := "" 20037031 ~0% {7} r3 = r1 UNION r2 20037031 ~0% {6} | JOIN WITH `FunctionType::AssocFunctionType.getTypeAt/1#dispred#d4d46f61` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Rhs.2 20033950 ~0% {6} | AND NOT `TypeInference::AssocFunctionResolution::AssocFunctionCall.hasIncompatibleTarget/5#85c07422#prev`(FIRST 6) return r3 ```
1 parent 0db62b2 commit d69be77

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,15 @@ private module AssocFunctionResolution {
17081708

17091709
predicate hasReceiverAtPos(FunctionPosition pos) { this.hasReceiver() and pos.asPosition() = 0 }
17101710

1711+
pragma[nomagic]
1712+
private predicate hasIncompatibleArgsTarget(
1713+
ImplOrTraitItemNode i, FunctionPosition selfPos, DerefChain derefChain, BorrowKind borrow,
1714+
AssocFunctionType selfType
1715+
) {
1716+
SelfArgIsInstantiationOf::argIsInstantiationOf(this, i, selfPos, derefChain, borrow, selfType) and
1717+
OverloadedCallArgsAreInstantiationsOf::argsAreNotInstantiationsOf(this, i)
1718+
}
1719+
17111720
/**
17121721
* Holds if the function inside `i` with matching name and arity can be ruled
17131722
* out as a target of this call, because the candidate receiver type represented
@@ -1722,16 +1731,11 @@ private module AssocFunctionResolution {
17221731
ImplOrTraitItemNode i, FunctionPosition selfPos, DerefChain derefChain, BorrowKind borrow,
17231732
Type root
17241733
) {
1725-
exists(TypePath path |
1726-
SelfArgIsInstantiationOf::argIsNotInstantiationOf(this, i, selfPos, derefChain, borrow, path) and
1727-
path.isCons(root.getATypeParameter(), _)
1728-
)
1729-
or
1730-
exists(AssocFunctionType selfType |
1731-
SelfArgIsInstantiationOf::argIsInstantiationOf(this, i, selfPos, derefChain, borrow,
1732-
selfType) and
1733-
OverloadedCallArgsAreInstantiationsOf::argsAreNotInstantiationsOf(this, i) and
1734-
root = selfType.getTypeAt(TypePath::nil())
1734+
exists(AssocFunctionType selfType | root = selfType.getTypeAt(TypePath::nil()) |
1735+
this.hasIncompatibleArgsTarget(i, selfPos, derefChain, borrow, selfType)
1736+
or
1737+
SelfArgIsInstantiationOf::argIsNotInstantiationOf(this, i, selfPos, derefChain, borrow,
1738+
selfType)
17351739
)
17361740
}
17371741

@@ -2608,9 +2612,13 @@ private module AssocFunctionResolution {
26082612
pragma[nomagic]
26092613
predicate argIsNotInstantiationOf(
26102614
AssocFunctionCall afc, ImplOrTraitItemNode i, FunctionPosition selfPos, DerefChain derefChain,
2611-
BorrowKind borrow, TypePath path
2615+
BorrowKind borrow, AssocFunctionType selfType
26122616
) {
2613-
argIsNotInstantiationOf(MkAssocFunctionCallCand(afc, selfPos, derefChain, borrow), i, _, path)
2617+
exists(TypePath path |
2618+
argIsNotInstantiationOf(MkAssocFunctionCallCand(afc, selfPos, derefChain, borrow), i,
2619+
selfType, path) and
2620+
not path.isEmpty()
2621+
)
26142622
}
26152623

26162624
pragma[nomagic]

0 commit comments

Comments
 (0)