@@ -1618,13 +1618,40 @@ module DataFlow {
1618
1618
succ = cls .getAReceiverNode ( ) .getAPropertyRead ( prop )
1619
1619
}
1620
1620
1621
+ // split into many smaller steps, because that helps performance A LOT!
1621
1622
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
+ )
1624
1642
}
1625
1643
1626
1644
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
+ )
1628
1655
}
1629
1656
}
1630
1657
0 commit comments