@@ -1613,13 +1613,40 @@ module DataFlow {
1613
1613
succ = cls .getAReceiverNode ( ) .getAPropertyRead ( prop )
1614
1614
}
1615
1615
1616
+ // split into many smaller steps, because that helps performance A LOT!
1616
1617
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
+ )
1619
1637
}
1620
1638
1621
1639
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
+ )
1623
1650
}
1624
1651
}
1625
1652
0 commit comments