Skip to content

Commit 793815c

Browse files
committed
Merge branch 'development'
2 parents 23b8143 + b2361e0 commit 793815c

File tree

13 files changed

+60
-23
lines changed

13 files changed

+60
-23
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<RepositoryUrl>https://github.com/Washi1337/AsmResolver</RepositoryUrl>
88
<RepositoryType>git</RepositoryType>
99
<LangVersion>9</LangVersion>
10-
<Version>4.7.0</Version>
10+
<Version>4.7.1</Version>
1111
</PropertyGroup>
1212

1313
</Project>

appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
- master
55

66
image: Visual Studio 2019
7-
version: 4.7.0-master-build.{build}
7+
version: 4.7.1-master-build.{build}
88
configuration: Release
99

1010
skip_commits:
@@ -33,7 +33,7 @@
3333
- development
3434

3535
image: Visual Studio 2019
36-
version: 4.7.0-dev-build.{build}
36+
version: 4.7.1-dev-build.{build}
3737
configuration: Release
3838

3939
skip_commits:

src/AsmResolver.DotNet/Builder/Metadata/Strings/StringsStreamBlob.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public StringsStreamBlobFlags Flags
3333
public bool IsFixed => (Flags & StringsStreamBlobFlags.Fixed) != 0;
3434

3535
/// <inheritdoc />
36-
public uint GetPhysicalSize() => (uint) (Blob.Length + (IsZeroTerminated ? 1 : 0));
36+
public uint GetPhysicalSize() => (uint) (Blob.ByteCount + (IsZeroTerminated ? 1 : 0));
3737

3838
/// <inheritdoc />
3939
public void Write(IBinaryStreamWriter writer)

src/AsmResolver.DotNet/Code/Cil/CilLabelVerifier.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private bool IsPresentInBody(CilInstruction instruction) =>
124124

125125
[MethodImpl(MethodImplOptions.AggressiveInlining)]
126126
private bool IsPresentInBody(int offset) =>
127-
_body.Instructions.GetIndexByOffset(offset) >= 0;
127+
_body.Instructions.GetIndexByOffset(offset) >= 0 || _body.Instructions.EndLabel.Offset == offset;
128128

129129
private void AddDiagnostic(string message)
130130
{

src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private void WriteNullElement(TypeSignature argumentType)
6060

6161
case ElementType.Object:
6262
// Most efficient way to store "null" is writing null as a string (two bytes).
63-
TypeSignature.WriteFieldOrPropType(writer, argumentType.Module!.CorLibTypeFactory.String);
63+
TypeSignature.WriteFieldOrPropType(_context, argumentType.Module!.CorLibTypeFactory.String);
6464
break;
6565

6666
case ElementType.SzArray:
@@ -166,7 +166,7 @@ private void WriteNonNullElement(TypeSignature argumentType, object element)
166166
value = null;
167167
}
168168

169-
TypeSignature.WriteFieldOrPropType(writer, innerTypeSig);
169+
TypeSignature.WriteFieldOrPropType(_context, innerTypeSig);
170170
WriteElement(innerTypeSig, value);
171171
break;
172172

src/AsmResolver.DotNet/Signatures/CustomAttributeNamedArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void Write(BlobSerializationContext context)
9090
var writer = context.Writer;
9191

9292
writer.WriteByte((byte) MemberType);
93-
TypeSignature.WriteFieldOrPropType(writer, ArgumentType);
93+
TypeSignature.WriteFieldOrPropType(context, ArgumentType);
9494
writer.WriteSerString(MemberName);
9595
Argument.Write(context);
9696
}

src/AsmResolver.DotNet/Signatures/GenericContext.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public readonly struct GenericContext
1313
/// </summary>
1414
/// <param name="type">The type providing type arguments.</param>
1515
/// <param name="method">The method providing type arguments.</param>
16-
public GenericContext(IGenericArgumentsProvider type, IGenericArgumentsProvider method)
16+
public GenericContext(IGenericArgumentsProvider? type, IGenericArgumentsProvider? method)
1717
{
1818
Type = type;
1919
Method = method;
@@ -22,15 +22,15 @@ public GenericContext(IGenericArgumentsProvider type, IGenericArgumentsProvider
2222
/// <summary>
2323
/// Gets the object responsible for providing type arguments defined by the current generic type instantiation.
2424
/// </summary>
25-
public IGenericArgumentsProvider Type
25+
public IGenericArgumentsProvider? Type
2626
{
2727
get;
2828
}
2929

3030
/// <summary>
3131
/// Gets the object responsible for providing type arguments defined by the current generic method instantiation.
3232
/// </summary>
33-
public IGenericArgumentsProvider Method
33+
public IGenericArgumentsProvider? Method
3434
{
3535
get;
3636
}
@@ -72,4 +72,4 @@ public TypeSignature GetTypeArgument(GenericParameterSignature parameter)
7272
throw new ArgumentOutOfRangeException();
7373
}
7474
}
75-
}
75+
}

src/AsmResolver.DotNet/Signatures/Types/TypeSignature.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,10 @@ internal static TypeSignature ReadFieldOrPropType(in BlobReadContext context, re
283283
}
284284
}
285285

286-
internal static void WriteFieldOrPropType(IBinaryStreamWriter writer, TypeSignature type)
286+
internal static void WriteFieldOrPropType(BlobSerializationContext context, TypeSignature type)
287287
{
288+
var writer = context.Writer;
289+
288290
switch (type.ElementType)
289291
{
290292
case ElementType.Boolean:
@@ -314,7 +316,7 @@ internal static void WriteFieldOrPropType(IBinaryStreamWriter writer, TypeSignat
314316
writer.WriteByte((byte) ElementType.SzArray);
315317

316318
var arrayType = (SzArrayTypeSignature) type;
317-
WriteFieldOrPropType(writer, arrayType.BaseType);
319+
WriteFieldOrPropType(context, arrayType.BaseType);
318320
break;
319321

320322
default:
@@ -325,14 +327,20 @@ internal static void WriteFieldOrPropType(IBinaryStreamWriter writer, TypeSignat
325327
}
326328

327329
var typeDef = type.Resolve();
328-
if (typeDef is not null && typeDef.IsEnum)
330+
if (typeDef is null)
329331
{
330-
writer.WriteByte((byte) ElementType.Enum);
331-
writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName(type));
332-
return;
332+
context.ErrorListener.MetadataBuilder(
333+
$"Custom attribute argument type {type.SafeToString()} could not be resolved.");
334+
}
335+
else if (!typeDef.IsEnum)
336+
{
337+
context.ErrorListener.MetadataBuilder(
338+
$"Custom attribute argument type {type.SafeToString()}is not an enum type.");
333339
}
334340

335-
throw new ArgumentOutOfRangeException();
341+
writer.WriteByte((byte) ElementType.Enum);
342+
writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName(type));
343+
return;
336344
}
337345
}
338346

src/AsmResolver.PE/DotNet/Builder/ManagedPEFileBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ protected virtual PESection CreateTextSection(IPEImage image, ManagedPEBuilderCo
233233

234234
private static void CreateImportDirectory(IPEImage image, ManagedPEBuilderContext context)
235235
{
236-
bool importEntrypointRequired = image.PEKind == OptionalHeaderMagic.Pe32;
236+
bool importEntrypointRequired = image.MachineType == MachineType.I386;
237237
string entrypointName = (image.Characteristics & Characteristics.Dll) != 0
238238
? "_CorDllMain"
239239
: "_CorExeMain";

test/AsmResolver.DotNet.Tests/Builder/StringsStreamBufferTest.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Text;
45
using AsmResolver.DotNet.Builder.Metadata.Strings;
6+
using AsmResolver.IO;
57
using AsmResolver.PE.DotNet.Metadata.Strings;
68
using Xunit;
79

@@ -132,6 +134,9 @@ private static void OptimizeAndVerifyIndices(StringsStreamBuffer buffer, params
132134
var translationTable = buffer.Optimize();
133135
for (int i = 0; i < values.Length; i++)
134136
Assert.Equal(translationTable[indices[i]], buffer.GetStringIndex(values[i]));
137+
var stream = buffer.CreateStream();
138+
for (int i = 0; i < values.Length; i++)
139+
Assert.Equal(values[i], stream.GetStringByIndex(translationTable[indices[i]]));
135140
}
136141

137142
[Fact]
@@ -267,5 +272,28 @@ public void OptimizeWithInvalidUtf8Characters()
267272
uint index = buffer.GetStringIndex(string1);
268273
Assert.Equal(index + 1, buffer.GetStringIndex(string2));
269274
}
275+
276+
[Fact]
277+
public void OptimizeWithCyrillicCharacters()
278+
{
279+
var originalStream = new SerializedStringsStream("#Strings", new byte[]
280+
{
281+
0x00,
282+
0x67, 0x65, 0x74, 0x5F, 0xD0, 0xA1, 0x00,
283+
0x41, 0x42, 0x43, 0x44, 0x00,
284+
0x00, 0x00, 0x00
285+
});
286+
var string1 = new Utf8String(new byte[] { 0x67, 0x65, 0x74, 0x5F, 0xD0, 0xA1 });
287+
var string2 = new Utf8String(new byte[] { 0xD0, 0xA1 });
288+
var string3 = new Utf8String("ABCD");
289+
290+
var buffer = new StringsStreamBuffer();
291+
buffer.ImportStream(originalStream);
292+
OptimizeAndVerifyIndices(buffer, string1, string2, string3);
293+
294+
// Assert.Equal(1u, buffer.GetStringIndex(string1));
295+
// Assert.Equal(5u, buffer.GetStringIndex(string2));
296+
// Assert.Equal(8u, buffer.GetStringIndex(string3));
297+
}
270298
}
271299
}

0 commit comments

Comments
 (0)