Skip to content

Commit 553fe02

Browse files
committed
next performance attempt
1 parent 111f770 commit 553fe02

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,13 +1613,40 @@ module DataFlow {
16131613
succ = cls.getAReceiverNode().getAPropertyRead(prop)
16141614
}
16151615

1616+
// split into many smaller steps, because that helps performance A LOT!
16161617
private class LocalFieldStep extends DataFlow::SharedFlowStep {
1617-
override predicate loadStep(DataFlow::Node pred, DataFlow::Node succ, string prop) {
1618-
localFieldLoadStep(_, pred, succ, prop)
1618+
/*
1619+
* override predicate loadStep(DataFlow::Node pred, DataFlow::Node succ, string prop) {
1620+
* exists(ClassNode cls |
1621+
* pred = cls.getConstructor().getReceiver() and
1622+
* succ = cls.getAReceiverNode().getAPropertyRead(prop)
1623+
* )
1624+
* }
1625+
*/
1626+
1627+
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
1628+
exists(ClassNode cls |
1629+
pred = cls.getConstructor().getReceiver() and
1630+
succ = cls.getAReceiverNode()
1631+
)
1632+
or
1633+
exists(ClassNode cls |
1634+
pred = cls.getADirectSuperClass().getConstructor().getReceiver() and
1635+
succ = cls.getConstructor().getReceiver()
1636+
)
16191637
}
16201638

16211639
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
1622-
localFieldStoreStep(_, pred, succ, prop)
1640+
exists(ClassNode cls |
1641+
(
1642+
pred = cls.getAReceiverNode().getAPropertyWrite(prop).getRhs()
1643+
or
1644+
// add support for writes on nested properties
1645+
pred = cls.getAReceiverNode().getAPropertyRead(prop) and
1646+
pred = any(DataFlow::PropRef ref).getBase()
1647+
) and
1648+
succ = cls.getConstructor().getReceiver()
1649+
)
16231650
}
16241651
}
16251652

0 commit comments

Comments
 (0)