Skip to content

Commit 99d48c2

Browse files
authored
[mono] ILStrip write directly to the output filestream (#112142)
* make sure the memorystream is disposed * more cleanup * Just write to the filestream directly * Remove explicit flushes * just write bytes
1 parent 9ff850e commit 99d48c2

File tree

1 file changed

+30
-39
lines changed

1 file changed

+30
-39
lines changed

src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs

+30-39
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using System.Reflection.Metadata;
1616
using System.Reflection.Metadata.Ecma335;
1717
using System.Reflection.PortableExecutable;
18-
using System.Buffers;
1918
using System.Collections.Concurrent;
2019

2120
public class ILStrip : Microsoft.Build.Utilities.Task
@@ -305,32 +304,27 @@ private Dictionary<int, int> ComputeMethodBodyUsage(MetadataReader mr, StreamRea
305304
private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFilePath, FileStream fs, Dictionary<int, int> methodBodyUses)
306305
{
307306
using FileStream os = File.Open(trimmedAssemblyFilePath, FileMode.Create);
308-
{
309-
fs.Position = 0;
310-
MemoryStream memStream = new MemoryStream((int)fs.Length);
311-
fs.CopyTo(memStream);
312307

313-
foreach (var kvp in methodBodyUses)
308+
fs.Position = 0;
309+
fs.CopyTo(os);
310+
311+
foreach (var kvp in methodBodyUses)
312+
{
313+
int rva = kvp.Key;
314+
int count = kvp.Value;
315+
if (count == 0)
314316
{
315-
int rva = kvp.Key;
316-
int count = kvp.Value;
317-
if (count == 0)
318-
{
319-
int methodSize = ComputeMethodSize(peReader, rva);
320-
int actualLoc = ComputeMethodHash(peReader, rva);
321-
int headerSize = ComputeMethodHeaderSize(memStream, actualLoc);
322-
if (headerSize == 1) //Set code size to zero for TinyFormat
323-
SetCodeSizeToZeroForTiny(ref memStream, actualLoc);
324-
ZeroOutMethodBody(ref memStream, methodSize, actualLoc, headerSize);
325-
}
326-
else if (count < 0)
327-
{
328-
Log.LogError($"Method usage count is less than zero for rva: {rva}.");
329-
}
317+
int methodSize = ComputeMethodSize(peReader, rva);
318+
int actualLoc = ComputeMethodHash(peReader, rva);
319+
int headerSize = ComputeMethodHeaderSize(fs, actualLoc);
320+
if (headerSize == 1) //Set code size to zero for TinyFormat
321+
SetCodeSizeToZeroForTiny(os, actualLoc);
322+
ZeroOutMethodBody(os, methodSize, actualLoc, headerSize);
323+
}
324+
else if (count < 0)
325+
{
326+
Log.LogError($"Method usage count is less than zero for rva: {rva}.");
330327
}
331-
332-
memStream.Position = 0;
333-
memStream.CopyTo(os);
334328
}
335329
}
336330

@@ -343,30 +337,27 @@ private static int ComputeMethodHash(PEReader peReader, int rva)
343337
return (peReader.PEHeaders.SectionHeaders[sectionIndex].PointerToRawData + relativeOffset);
344338
}
345339

346-
private static int ComputeMethodHeaderSize(MemoryStream memStream, int actualLoc)
340+
private static int ComputeMethodHeaderSize(Stream stream, int actualLoc)
347341
{
348-
memStream.Position = actualLoc;
349-
int firstbyte = memStream.ReadByte();
342+
stream.Position = actualLoc;
343+
int firstbyte = stream.ReadByte();
350344
int headerFlag = firstbyte & 0b11;
351345
return (headerFlag == 2 ? 1 : 4);
352346
}
353347

354-
private static void SetCodeSizeToZeroForTiny(ref MemoryStream memStream, int actualLoc)
348+
private static void SetCodeSizeToZeroForTiny(Stream stream, int actualLoc)
355349
{
356-
memStream.Position = actualLoc;
357-
byte[] header = {0b10};
358-
memStream.Write(header, 0, 1);
350+
stream.Position = actualLoc;
351+
stream.WriteByte(0b10);
359352
}
360353

361-
private static void ZeroOutMethodBody(ref MemoryStream memStream, int methodSize, int actualLoc, int headerSize)
354+
private static void ZeroOutMethodBody(Stream stream, int methodSize, int actualLoc, int headerSize)
362355
{
363-
memStream.Position = actualLoc + headerSize;
364-
365-
byte[] zeroBuffer;
366-
zeroBuffer = ArrayPool<byte>.Shared.Rent(methodSize);
367-
Array.Clear(zeroBuffer, 0, zeroBuffer.Length);
368-
memStream.Write(zeroBuffer, 0, methodSize - headerSize);
369-
ArrayPool<byte>.Shared.Return(zeroBuffer);
356+
stream.Position = actualLoc + headerSize;
357+
for (int i = 0; i < methodSize - headerSize; i++)
358+
{
359+
stream.WriteByte(0);
360+
}
370361
}
371362

372363
private static TaskItem GetTrimmedAssemblyItem(ITaskItem assemblyItem, string trimmedAssemblyFilePath, string originAssemblyFilePath)

0 commit comments

Comments
 (0)