• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SamboyCoding / Cpp2IL / 13931838342

18 Mar 2025 07:26PM UTC coverage: 27.187% (-0.09%) from 27.279%
13931838342

Pull #425

github

web-flow
Merge 47060cc8e into 6f9cec570
Pull Request #425: Add support for the Mach-O universal file format

1270 of 6472 branches covered (19.62%)

Branch coverage included in aggregate %.

2 of 55 new or added lines in 4 files covered. (3.64%)

3379 of 10628 relevant lines covered (31.79%)

122585.14 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/LibCpp2IL/MachO/MachOUniversalFile.cs
1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Linq;
5
using LibCpp2IL.Logging;
6

7
namespace LibCpp2IL.MachO;
8

9
public class MachOUniversalFile : ClassReadingBinaryReader
10
{
NEW
11
    public MachOFile BestMachOFile { get; }
×
12

NEW
13
    public override float MetadataVersion => BestMachOFile?.MetadataVersion ?? 0;
×
14

NEW
15
    private static readonly MachOCpuType[] OrderedSupportedCpuTypes =
×
NEW
16
    [
×
NEW
17
        MachOCpuType.CPU_TYPE_X86_64,
×
NEW
18
        MachOCpuType.CPU_TYPE_ARM64,
×
NEW
19
        MachOCpuType.CPU_TYPE_I386,
×
NEW
20
        MachOCpuType.CPU_TYPE_ARM,
×
NEW
21
        MachOCpuType.CPU_TYPE_ARM64_32
×
NEW
22
    ];
×
23

NEW
24
    public MachOUniversalFile(MemoryStream input) : base(input)
×
25
    {
NEW
26
        LibLogger.VerboseNewline("Reading universal Mach-O file...");
×
27

NEW
28
        LibLogger.VerboseNewline("\tReading universal Mach-O header...");
×
NEW
29
        var header = ReadReadable<MachOUniversalHeader>();
×
NEW
30
        if (header.NumberFileEntries == 0)
×
NEW
31
            throw new("Cannot read a Mach-O file from the universal Mach-O container: no file entries exists.");
×
32

NEW
33
        LibLogger.VerboseNewline($"\tFound {header.NumberFileEntries} Mach-O file entries.");
×
NEW
34
        var entries = new List<MachOUniversalFileEntry>();
×
NEW
35
        LibLogger.VerboseNewline("\tReading Mach-O file entries...");
×
NEW
36
        for (var i = 0; i < header.NumberFileEntries; i++)
×
NEW
37
            entries.Add(ReadReadable<MachOUniversalFileEntry>());
×
38

NEW
39
        LibLogger.VerboseNewline("\tSelecting a suitable Mach-O file entry to read...");
×
NEW
40
        var selectedEntry = entries
×
NEW
41
            .Where(x => OrderedSupportedCpuTypes.Contains(x.CpuType))
×
NEW
42
            .Select(x => (entry: x, supportOrder: Array.IndexOf(OrderedSupportedCpuTypes, x.CpuType)))
×
NEW
43
            .OrderBy(x => x.supportOrder)
×
NEW
44
            .Select(x => x.entry)
×
NEW
45
            .FirstOrDefault();
×
46

NEW
47
        if (selectedEntry is null)
×
48
        {
NEW
49
            selectedEntry = entries[0];
×
NEW
50
            LibLogger.WarnNewline($"\tCouldn't find a Mach-O file entry with a supported CPU architecture, " +
×
NEW
51
                                  $"falling back to the first entry with CPU type {selectedEntry.CpuType}");
×
52
        }
53
        else
54
        {
NEW
55
            LibLogger.VerboseNewline($"\tSelected Mach-O file entry with CPU type: {selectedEntry.CpuType}");
×
56
        }
57

NEW
58
        LibLogger.VerboseNewline($"\tReading Mach-O file at offset 0x{selectedEntry.FileOffset:X} for 0x{selectedEntry.FileSize:X} bytes");
×
NEW
59
        input.Seek((int)selectedEntry.FileOffset, SeekOrigin.Begin);
×
NEW
60
        var machOFileBuffer = new byte[selectedEntry.FileSize];
×
NEW
61
        var numberBytesRead = input.Read(machOFileBuffer, 0, (int)selectedEntry.FileSize);
×
NEW
62
        if (numberBytesRead != (int)selectedEntry.FileSize)
×
NEW
63
            LibLogger.WarnNewline($"Read {numberBytesRead} bytes, but expected to read {selectedEntry.FileSize} bytes");
×
NEW
64
        var memoryStream = new MemoryStream(machOFileBuffer, 0, (int)selectedEntry.FileSize, false, true);
×
NEW
65
        BestMachOFile = new MachOFile(memoryStream);
×
NEW
66
    }
×
67
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc