Skip to content

Commit 378c482

Browse files
committed
next performance attempt
1 parent 1b0129d commit 378c482

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
@@ -1618,13 +1618,40 @@ module DataFlow {
16181618
succ = cls.getAReceiverNode().getAPropertyRead(prop)
16191619
}
16201620

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

16261644
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
1627-
localFieldStoreStep(_, pred, succ, prop)
1645+
exists(ClassNode cls |
1646+
(
1647+
pred = cls.getAReceiverNode().getAPropertyWrite(prop).getRhs()
1648+
or
1649+
// add support for writes on nested properties
1650+
pred = cls.getAReceiverNode().getAPropertyRead(prop) and
1651+
pred = any(DataFlow::PropRef ref).getBase()
1652+
) and
1653+
succ = cls.getConstructor().getReceiver()
1654+
)
16281655
}
16291656
}
16301657

0 commit comments

Comments
 (0)