Skip to content

Commit 026bcc7

Browse files
hvitvedtamasvajk
authored andcommitted
C#: Improve performance of stubbing library
1 parent 405c008 commit 026bcc7

File tree

1 file changed

+132
-76
lines changed

1 file changed

+132
-76
lines changed

csharp/ql/src/Stubs/Stubs.qll

Lines changed: 132 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ abstract private class GeneratedType extends Type, GeneratedElement {
126126
}
127127

128128
/** Gets the entire C# stub code for this type. */
129+
pragma[nomagic]
129130
final string getStub(Assembly assembly) {
130131
if this.isDuplicate(assembly)
131132
then
@@ -176,8 +177,8 @@ abstract private class GeneratedType extends Type, GeneratedElement {
176177
language[monotonicAggregates]
177178
private string stubMembers(Assembly assembly) {
178179
result =
179-
concat(Member m |
180-
m = this.getAGeneratedMember() and m.getALocation() = assembly
180+
concat(GeneratedMember m |
181+
m = this.getAGeneratedMember(assembly)
181182
|
182183
stubMember(m, assembly) order by m.getName()
183184
)
@@ -201,6 +202,11 @@ abstract private class GeneratedType extends Type, GeneratedElement {
201202

202203
private GeneratedMember getAGeneratedMember() { result.getDeclaringType() = this }
203204

205+
pragma[noinline]
206+
private GeneratedMember getAGeneratedMember(Assembly assembly) {
207+
result = this.getAGeneratedMember() and assembly = result.getALocation()
208+
}
209+
204210
final Type getAGeneratedType() {
205211
result = getAnInterestingBaseType()
206212
or
@@ -733,85 +739,135 @@ private string stubExplicitImplementation(Member c) {
733739
else result = ""
734740
}
735741

736-
private string stubMember(Member m, Assembly assembly) {
737-
if m instanceof Method
742+
pragma[noinline]
743+
private string stubMethod(Method m, Assembly assembly) {
744+
m instanceof GeneratedMember and
745+
m.getALocation() = assembly and
746+
if not m.getDeclaringType() instanceof Enum
747+
then
748+
result =
749+
" " + stubModifiers(m) + stubClassName(m.(Method).getReturnType()) + " " +
750+
stubExplicitImplementation(m) + m.getName() + stubGenericMethodParams(m) + "(" +
751+
stubParameters(m) + ")" + stubTypeParametersConstraints(m) + stubImplementation(m) + ";\n"
752+
else result = " // Stub generator skipped method: " + m.getName() + "\n"
753+
}
754+
755+
pragma[noinline]
756+
private string stubOperator(Operator o, Assembly assembly) {
757+
o instanceof GeneratedMember and
758+
o.getALocation() = assembly and
759+
if o instanceof ConversionOperator
738760
then
739-
if not m.getDeclaringType() instanceof Enum
761+
result =
762+
" " + stubModifiers(o) + stubExplicit(o) + "operator " + stubClassName(o.getReturnType()) +
763+
"(" + stubParameters(o) + ") => throw null;\n"
764+
else
765+
if not o.getDeclaringType() instanceof Enum
740766
then
741767
result =
742-
" " + stubModifiers(m) + stubClassName(m.(Method).getReturnType()) + " " +
743-
stubExplicitImplementation(m) + m.getName() + stubGenericMethodParams(m) + "(" +
744-
stubParameters(m) + ")" + stubTypeParametersConstraints(m) + stubImplementation(m) + ";\n"
745-
else result = " // Stub generator skipped method: " + m.getName() + "\n"
768+
" " + stubModifiers(o) + stubClassName(o.getReturnType()) + " operator " + o.getName() +
769+
"(" + stubParameters(o) + ") => throw null;\n"
770+
else result = " // Stub generator skipped operator: " + o.getName() + "\n"
771+
}
772+
773+
pragma[noinline]
774+
private string stubEnumConstant(EnumConstant ec, Assembly assembly) {
775+
ec instanceof GeneratedMember and
776+
ec.getALocation() = assembly and
777+
result = " " + ec.getName() + ",\n"
778+
}
779+
780+
pragma[noinline]
781+
private string stubProperty(Property p, Assembly assembly) {
782+
p instanceof GeneratedMember and
783+
p.getALocation() = assembly and
784+
result =
785+
" " + stubModifiers(p) + stubClassName(p.getType()) + " " + stubExplicitImplementation(p) +
786+
p.getName() + " { " + stubGetter(p) + stubSetter(p) + "}\n"
787+
}
788+
789+
pragma[noinline]
790+
private string stubConstructor(Constructor c, Assembly assembly) {
791+
c instanceof GeneratedMember and
792+
c.getALocation() = assembly and
793+
if c.getDeclaringType() instanceof Enum
794+
then result = ""
746795
else
747-
if m instanceof Operator and not m instanceof ConversionOperator
796+
if
797+
not c.getDeclaringType() instanceof StructEx or
798+
c.getNumberOfParameters() > 0
748799
then
749-
if not m.getDeclaringType() instanceof Enum
750-
then
751-
result =
752-
" " + stubModifiers(m) + stubClassName(m.(Operator).getReturnType()) + " operator " +
753-
m.getName() + "(" + stubParameters(m) + ") => throw null;\n"
754-
else result = " // Stub generator skipped operator: " + m.getName() + "\n"
755-
else
756-
if m instanceof ConversionOperator
757-
then
758-
result =
759-
" " + stubModifiers(m) + stubExplicit(m) + "operator " +
760-
stubClassName(m.(ConversionOperator).getReturnType()) + "(" + stubParameters(m) +
761-
") => throw null;\n"
762-
else
763-
if m instanceof EnumConstant
764-
then result = " " + m.(EnumConstant).getName() + ",\n"
765-
else
766-
if m instanceof Property
767-
then
768-
result =
769-
" " + stubModifiers(m) + stubClassName(m.(Property).getType()) + " " +
770-
stubExplicitImplementation(m) + m.getName() + " { " + stubGetter(m) + stubSetter(m) +
771-
"}\n"
772-
else
773-
if m instanceof Constructor
774-
then
775-
if m.getDeclaringType() instanceof Enum
776-
then result = ""
777-
else
778-
if
779-
not m.getDeclaringType() instanceof StructEx or
780-
m.(Constructor).getNumberOfParameters() > 0
781-
then
782-
result =
783-
" " + stubModifiers(m) + m.getName() + "(" + stubParameters(m) + ")" +
784-
stubConstructorInitializer(m) + " => throw null;\n"
785-
else result = " // Stub generator skipped constructor \n"
786-
else
787-
if m instanceof Indexer
788-
then
789-
result =
790-
" " + stubIndexerNameAttribute(m) + stubModifiers(m) +
791-
stubClassName(m.(Indexer).getType()) + " " + stubExplicitImplementation(m) +
792-
"this[" + stubParameters(m) + "] { " + stubGetter(m) + stubSetter(m) + "}\n"
793-
else
794-
if m instanceof Field // EnumConstants are already stubbed
795-
then
796-
exists(string impl |
797-
(if m.(Field).isConst() then impl = " = default" else impl = "") and
798-
result =
799-
" " + stubModifiers(m) + stubClassName(m.(Field).getType()) + " " +
800-
escapeIfKeyword(m.(Field).getName()) + impl + ";\n"
801-
)
802-
else
803-
if m instanceof Event
804-
then
805-
result =
806-
" " + stubModifiers(m) + "event " + stubClassName(m.(Event).getType()) +
807-
" " + stubExplicitImplementation(m) + m.getName() + stubEventAccessors(m) +
808-
"\n"
809-
else
810-
if m instanceof GeneratedType
811-
then result = m.(GeneratedType).getStub(assembly) + "\n"
812-
else
813-
result =
814-
" // ERR: Stub generator didn't handle member: " + m.getName() + "\n"
800+
result =
801+
" " + stubModifiers(c) + c.getName() + "(" + stubParameters(c) + ")" +
802+
stubConstructorInitializer(c) + " => throw null;\n"
803+
else result = " // Stub generator skipped constructor \n"
804+
}
805+
806+
pragma[noinline]
807+
private string stubIndexer(Indexer i, Assembly assembly) {
808+
i instanceof GeneratedMember and
809+
i.getALocation() = assembly and
810+
result =
811+
" " + stubIndexerNameAttribute(i) + stubModifiers(i) + stubClassName(i.getType()) + " " +
812+
stubExplicitImplementation(i) + "this[" + stubParameters(i) + "] { " + stubGetter(i) +
813+
stubSetter(i) + "}\n"
814+
}
815+
816+
pragma[noinline]
817+
private string stubField(Field f, Assembly assembly) {
818+
f instanceof GeneratedMember and
819+
f.getALocation() = assembly and
820+
not f instanceof EnumConstant and // EnumConstants are already stubbed
821+
exists(string impl |
822+
(if f.isConst() then impl = " = default" else impl = "") and
823+
result =
824+
" " + stubModifiers(f) + stubClassName(f.getType()) + " " + escapeIfKeyword(f.getName()) +
825+
impl + ";\n"
826+
)
827+
}
828+
829+
pragma[noinline]
830+
private string stubEvent(Event e, Assembly assembly) {
831+
e instanceof GeneratedMember and
832+
e.getALocation() = assembly and
833+
result =
834+
" " + stubModifiers(e) + "event " + stubClassName(e.getType()) + " " +
835+
stubExplicitImplementation(e) + e.getName() + stubEventAccessors(e) + "\n"
836+
}
837+
838+
pragma[nomagic]
839+
private string stubMember(GeneratedMember m, Assembly assembly) {
840+
result = stubMethod(m, assembly)
841+
or
842+
result = stubOperator(m, assembly)
843+
or
844+
result = stubEnumConstant(m, assembly)
845+
or
846+
result = stubProperty(m, assembly)
847+
or
848+
result = stubConstructor(m, assembly)
849+
or
850+
result = stubIndexer(m, assembly)
851+
or
852+
result = stubField(m, assembly)
853+
or
854+
result = stubEvent(m, assembly)
855+
or
856+
not m instanceof Method and
857+
not m instanceof Operator and
858+
not m instanceof EnumConstant and
859+
not m instanceof Property and
860+
not m instanceof Constructor and
861+
not m instanceof Indexer and
862+
not m instanceof Field and
863+
not m instanceof Event and
864+
m.getALocation() = assembly and
865+
(
866+
result = m.(GeneratedType).getStub(assembly) + "\n"
867+
or
868+
not m instanceof GeneratedType and
869+
result = " // ERR: Stub generator didn't handle member: " + m.getName() + "\n"
870+
)
815871
}
816872

817873
private string stubIndexerNameAttribute(Indexer i) {

0 commit comments

Comments
 (0)