Skip to content

Commit 2434240

Browse files
committed
Add pragma inline to getMember/Method/Callable
1 parent 51661bf commit 2434240

File tree

1 file changed

+12
-16
lines changed
  • csharp/ql/src/semmle/code/csharp

1 file changed

+12
-16
lines changed

csharp/ql/src/semmle/code/csharp/Type.qll

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
170170
* }
171171
* ```
172172
*/
173+
pragma[inline]
173174
predicate hasMethod(Method m) { this.hasMember(m) }
174175

175176
/**
@@ -196,6 +197,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
196197
* }
197198
* ```
198199
*/
200+
pragma[inline]
199201
predicate hasCallable(Callable c) {
200202
hasMethod(c)
201203
or
@@ -225,25 +227,15 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
225227
* }
226228
* ```
227229
*/
230+
pragma[inline]
228231
predicate hasMember(Member m) {
229-
// For performance reasons, split up into "cheap" computation
230-
// (non-overridden members) and "expensive" computation
231-
// (overridden members). The latter is cached, and generally
232-
// much smaller than the full relation.
233-
hasNonOverriddenMember(m)
232+
m = this.getAMember()
233+
or
234+
hasNonOverriddenMember(this.getBaseClass+(), m)
234235
or
235236
hasOverriddenMember(m)
236237
}
237238

238-
private predicate hasNonOverriddenMember(Member m) {
239-
isNonOverridden(m) and
240-
(
241-
m = getAMember()
242-
or
243-
getBaseClass+().getAMember() = m and not m.isPrivate()
244-
)
245-
}
246-
247239
cached
248240
private predicate hasOverriddenMember(Virtualizable v) {
249241
v.isOverridden() and
@@ -722,8 +714,12 @@ class RefType extends ValueOrRefType, @ref_type {
722714
override predicate isRefType() { any() }
723715
}
724716

725-
// Helper predicate to avoid slow "negation_body"
726-
private predicate isNonOverridden(Member m) { not m.(Virtualizable).isOverridden() }
717+
pragma[noinline]
718+
private predicate hasNonOverriddenMember(Class c, Member m) {
719+
m = c.getAMember() and
720+
not m.(Virtualizable).isOverridden() and
721+
not m.isPrivate()
722+
}
727723

728724
/**
729725
* A `class`, for example

0 commit comments

Comments
 (0)