Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2804f5c

Browse files
committed
Add by-ref, and fix pinned CIL extraction
1 parent f99bf57 commit 2804f5c

8 files changed

Lines changed: 83 additions & 37 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
5+
namespace Semmle.Extraction.CIL.Entities
6+
{
7+
/// <summary>
8+
/// Types that are passed by reference are not written directly to trap files. Instead, the annotation is stored on
9+
/// the entity.
10+
/// </summary>
11+
internal sealed class ByRefType : Type
12+
{
13+
public ByRefType(Context cx, Type elementType) : base(cx)
14+
{
15+
ElementType = elementType;
16+
}
17+
18+
public override CilTypeKind Kind => throw new NotImplementedException();
19+
20+
public override Namespace? ContainingNamespace => throw new NotImplementedException();
21+
22+
public override Type? ContainingType => throw new NotImplementedException();
23+
24+
public override int ThisTypeParameterCount => throw new NotImplementedException();
25+
26+
public override IEnumerable<Type> TypeParameters => throw new NotImplementedException();
27+
28+
public override Type Construct(IEnumerable<Type> typeArguments) => throw new NotImplementedException();
29+
30+
public override string Name => $"{ElementType.Name}&";
31+
32+
public Type ElementType { get; }
33+
34+
public override void WriteAssemblyPrefix(TextWriter trapFile) => throw new NotImplementedException();
35+
36+
public override void WriteId(TextWriter trapFile, bool inContext)
37+
{
38+
ElementType.WriteId(trapFile, inContext);
39+
trapFile.Write('&');
40+
}
41+
}
42+
}

csharp/extractor/Semmle.Extraction.CIL/Entities/DefinitionMethod.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,12 @@ public override IEnumerable<IExtractionProduct> Contents
121121

122122
for (var l = 0; l < this.locals.Length; ++l)
123123
{
124-
this.locals[l] = Cx.Populate(new LocalVariable(Cx, Implementation, l, localVariableTypes[l]));
124+
var t = localVariableTypes[l];
125+
if (t is ByRefType brt)
126+
{
127+
t = brt.ElementType;
128+
}
129+
this.locals[l] = Cx.Populate(new LocalVariable(Cx, Implementation, l, t));
125130
yield return this.locals[l];
126131
}
127132
}

csharp/extractor/Semmle.Extraction.CIL/Entities/FunctionPointerType.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public override IEnumerable<IExtractionProduct> Contents
9595
retType = mt.Unmodified;
9696
yield return Tuples.cil_custom_modifiers(this, mt.Modifier, mt.IsRequired);
9797
}
98+
if (retType is ByRefType byRefType)
99+
{
100+
retType = byRefType.ElementType;
101+
}
98102
yield return Tuples.cil_function_pointer_return_type(this, retType);
99103

100104
yield return Tuples.cil_function_pointer_calling_conventions(this, signature.Header.CallingConvention);

csharp/extractor/Semmle.Extraction.CIL/Entities/Method.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ internal static IEnumerable<IExtractionProduct> GetParameterExtractionProducts(I
103103
t = mt.Unmodified;
104104
yield return Tuples.cil_custom_modifiers(receiver, mt.Modifier, mt.IsRequired);
105105
}
106+
if (t is ByRefType brt)
107+
{
108+
t = brt.ElementType;
109+
}
106110
yield return cx.Populate(new Parameter(cx, parameterizable, i++, t));
107111
}
108112
}
@@ -115,6 +119,10 @@ protected IEnumerable<IExtractionProduct> GetMethodExtractionProducts(string nam
115119
t = mt.Unmodified;
116120
yield return Tuples.cil_custom_modifiers(this, mt.Modifier, mt.IsRequired);
117121
}
122+
if (t is ByRefType brt)
123+
{
124+
t = brt.ElementType;
125+
}
118126
yield return Tuples.cil_method(this, name, declaringType, t);
119127
}
120128
}

csharp/extractor/Semmle.Extraction.CIL/Entities/Property.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public override IEnumerable<IExtractionProduct> Contents
6262
t = mt.Unmodified;
6363
yield return Tuples.cil_custom_modifiers(this, mt.Modifier, mt.IsRequired);
6464
}
65+
if (t is ByRefType brt)
66+
{
67+
t = brt.ElementType;
68+
}
6569
yield return Tuples.cil_property(this, type, name, t);
6670

6771
var accessors = pd.GetAccessors();

csharp/extractor/Semmle.Extraction.CIL/Entities/SignatureDecoder.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ public ByRef(ITypeSignature elementType)
4141

4242
public void WriteId(TextWriter trapFile, GenericContext gc)
4343
{
44-
trapFile.Write("ref ");
4544
elementType.WriteId(trapFile, gc);
45+
trapFile.Write('&');
4646
}
4747
}
4848

@@ -173,25 +173,9 @@ ITypeSignature ISignatureTypeProvider<ITypeSignature, object>.GetModifiedType(IT
173173
return new Modified(unmodifiedType, modifier, isRequired);
174174
}
175175

176-
private class Pinned : ITypeSignature
177-
{
178-
private readonly ITypeSignature elementType;
179-
180-
public Pinned(ITypeSignature elementType)
181-
{
182-
this.elementType = elementType;
183-
}
184-
185-
public void WriteId(TextWriter trapFile, GenericContext gc)
186-
{
187-
trapFile.Write("pinned ");
188-
elementType.WriteId(trapFile, gc);
189-
}
190-
}
191-
192176
ITypeSignature ISignatureTypeProvider<ITypeSignature, object>.GetPinnedType(ITypeSignature elementType)
193177
{
194-
return new Pinned(elementType);
178+
return elementType;
195179
}
196180

197181
private class PointerType : ITypeSignature

csharp/extractor/Semmle.Extraction.CIL/Entities/TypeSignatureDecoder.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Type IConstructedTypeProvider<Type>.GetArrayType(Type elementType, ArrayShape sh
2020
cx.Populate(new ArrayType(cx, elementType, shape.Rank));
2121

2222
Type IConstructedTypeProvider<Type>.GetByReferenceType(Type elementType) =>
23-
elementType; // ??
23+
new ByRefType(cx, elementType);
2424

2525
Type ISignatureTypeProvider<Type, GenericContext>.GetFunctionPointerType(MethodSignature<Type> signature) =>
2626
cx.Populate(new FunctionPointerType(cx, signature));
@@ -37,8 +37,7 @@ Type ISignatureTypeProvider<Type, GenericContext>.GetGenericTypeParameter(Generi
3737
Type ISignatureTypeProvider<Type, GenericContext>.GetModifiedType(Type modifier, Type unmodifiedType, bool isRequired) =>
3838
new ModifiedType(cx, unmodifiedType, modifier, isRequired);
3939

40-
Type ISignatureTypeProvider<Type, GenericContext>.GetPinnedType(Type elementType) =>
41-
cx.Populate(new PointerType(cx, elementType));
40+
Type ISignatureTypeProvider<Type, GenericContext>.GetPinnedType(Type elementType) => elementType;
4241

4342
Type IConstructedTypeProvider<Type>.GetPointerType(Type elementType) =>
4443
cx.Populate(new PointerType(cx, elementType));

csharp/ql/test/library-tests/cil/functionPointers/functionPointers.expected

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@ fnptr
22
| file://:0:0:0:0 | delegate* managed<!0,Int32> | 1 | file://:0:0:0:0 | Int32 | 0 |
33
| file://:0:0:0:0 | delegate* managed<A,B> | 1 | file://:0:0:0:0 | B | 0 |
44
| file://:0:0:0:0 | delegate* managed<B,A> | 1 | file://:0:0:0:0 | A | 0 |
5+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | 3 | file://:0:0:0:0 | Int32 | 0 |
6+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | 2 | file://:0:0:0:0 | Int32 | 0 |
57
| file://:0:0:0:0 | delegate* managed<Int32*,Void*> | 1 | file://:0:0:0:0 | Void* | 0 |
6-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | 3 | file://:0:0:0:0 | Int32 | 0 |
7-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32> | 2 | file://:0:0:0:0 | Int32 | 0 |
88
| file://:0:0:0:0 | delegate* managed<Int32> | 0 | file://:0:0:0:0 | Int32 | 0 |
99
| file://:0:0:0:0 | delegate* managed<Void*,Int32*> | 1 | file://:0:0:0:0 | Int32* | 0 |
10-
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | 3 | file://:0:0:0:0 | void | 2 |
10+
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | 3 | file://:0:0:0:0 | void | 2 |
1111
params
1212
| file://:0:0:0:0 | delegate* managed<!0,Int32> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<!0,Int32> | fnptr.dll:0:0:0:0 | !0 |
1313
| file://:0:0:0:0 | delegate* managed<A,B> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<A,B> | file://:0:0:0:0 | A |
1414
| file://:0:0:0:0 | delegate* managed<B,A> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<B,A> | file://:0:0:0:0 | B |
15+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | file://:0:0:0:0 | Int32 |
16+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | file://:0:0:0:0 | Object |
17+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | 2 | file://:0:0:0:0 | Parameter 2 of delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | file://:0:0:0:0 | Int32 |
18+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | file://:0:0:0:0 | Int32 |
19+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | file://:0:0:0:0 | Object |
1520
| file://:0:0:0:0 | delegate* managed<Int32*,Void*> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Int32*,Void*> | file://:0:0:0:0 | Int32* |
16-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | file://:0:0:0:0 | Int32 |
17-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | file://:0:0:0:0 | Object |
18-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | 2 | file://:0:0:0:0 | Parameter 2 of delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | file://:0:0:0:0 | Int32 |
19-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Int32,Object modreq(OutAttribute),Int32> | file://:0:0:0:0 | Int32 |
20-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* managed<Int32,Object modreq(OutAttribute),Int32> | file://:0:0:0:0 | Object |
2121
| file://:0:0:0:0 | delegate* managed<Void*,Int32*> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* managed<Void*,Int32*> | file://:0:0:0:0 | Void* |
22-
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | file://:0:0:0:0 | Int32 |
23-
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | file://:0:0:0:0 | Object |
24-
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | 2 | file://:0:0:0:0 | Parameter 2 of delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | fnptr.dll:0:0:0:0 | !0 |
22+
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | 0 | file://:0:0:0:0 | Parameter 0 of delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | file://:0:0:0:0 | Int32 |
23+
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | 1 | file://:0:0:0:0 | Parameter 1 of delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | file://:0:0:0:0 | Object |
24+
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | 2 | file://:0:0:0:0 | Parameter 2 of delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | fnptr.dll:0:0:0:0 | !0 |
2525
modifiers
26-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | System.Runtime.InteropServices.InAttribute | modreq |
27-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32 modreq(InAttribute),Int32> | System.Runtime.InteropServices.OutAttribute | modreq |
28-
| file://:0:0:0:0 | delegate* managed<Int32,Object modreq(OutAttribute),Int32> | System.Runtime.InteropServices.OutAttribute | modreq |
29-
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32,Object modreq(OutAttribute),!0,Void> | System.Runtime.InteropServices.OutAttribute | modreq |
26+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | System.Runtime.InteropServices.InAttribute | modreq |
27+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32& modreq(InAttribute),Int32&> | System.Runtime.InteropServices.OutAttribute | modreq |
28+
| file://:0:0:0:0 | delegate* managed<Int32&,Object& modreq(OutAttribute),Int32> | System.Runtime.InteropServices.OutAttribute | modreq |
29+
| file://:0:0:0:0 | delegate* unmanaged[StdCall]<Int32&,Object& modreq(OutAttribute),!0,Void> | System.Runtime.InteropServices.OutAttribute | modreq |

0 commit comments

Comments
 (0)