@@ -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