Skip to content

Commit b55cd1c

Browse files
committed
Get rid of the rest of MarshalAs
This removes the last of the instances where we copy the C struct into a managed struct, where we're just going to copy it to another managed struct. Instead copy straight from the unmanaged to memanged memory just once.
1 parent d3622c3 commit b55cd1c

26 files changed

+253
-185
lines changed

‎LibGit2Sharp/BlameHunk.cs‎

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,34 @@ public class BlameHunk : IEquatable<BlameHunk>
1919
x =>x.InitialSignature,
2020
x =>x.InitialCommit);
2121

22-
23-
internalunsafeBlameHunk(IRepositoryrepository,GitBlameHunkrawHunk)
22+
internalunsafeBlameHunk(IRepositoryrepository,git_blame_hunk*rawHunk)
2423
{
25-
finalCommit=newLazy<Commit>(()=>repository.Lookup<Commit>(rawHunk.FinalCommitId));
26-
origCommit=newLazy<Commit>(()=>repository.Lookup<Commit>(rawHunk.OrigCommitId));
24+
varorigId=ObjectId.BuildFromPtr(&rawHunk->orig_commit_id);
25+
varfinalId=ObjectId.BuildFromPtr(&rawHunk->final_commit_id);
26+
27+
finalCommit=newLazy<Commit>(()=>repository.Lookup<Commit>(finalId));
28+
origCommit=newLazy<Commit>(()=>repository.Lookup<Commit>(origId));
29+
2730

28-
if(rawHunk.OrigPath!=IntPtr.Zero)
31+
if(rawHunk->orig_path!=null)
2932
{
30-
InitialPath=LaxUtf8Marshaler.FromNative(rawHunk.OrigPath);
33+
InitialPath=LaxUtf8Marshaler.FromNative(rawHunk->orig_path);
3134
}
32-
LineCount=rawHunk.LinesInHunk;
35+
LineCount=rawHunk->lines_in_hunk;
3336

3437
// Libgit2's line numbers are 1-based
35-
FinalStartLineNumber=rawHunk.FinalStartLineNumber-1;
36-
InitialStartLineNumber=rawHunk.OrigStartLineNumber-1;
38+
FinalStartLineNumber=rawHunk->final_start_line_number-1;
39+
InitialStartLineNumber=rawHunk->orig_start_line_number-1;
3740

3841
// Signature objects need to have ownership of their native pointers
39-
if(rawHunk.FinalSignature!=null)
42+
if(rawHunk->final_signature!=null)
4043
{
41-
FinalSignature=newSignature(Proxy.git_signature_dup(rawHunk.FinalSignature));
44+
FinalSignature=newSignature(rawHunk->final_signature);
4245
}
4346

44-
if(rawHunk.OrigSignature!=null)
47+
if(rawHunk->orig_signature!=null)
4548
{
46-
InitialSignature=newSignature(Proxy.git_signature_dup(rawHunk.OrigSignature));
49+
InitialSignature=newSignature(rawHunk->orig_signature);
4750
}
4851
}
4952

‎LibGit2Sharp/BlameHunkCollection.cs‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
usingSystem.Collections;
33
usingSystem.Collections.Generic;
44
usingSystem.Linq;
5+
usingSystem.Runtime.InteropServices;
56
usingLibGit2Sharp.Core;
67
usingLibGit2Sharp.Core.Handles;
78

@@ -20,26 +21,32 @@ public class BlameHunkCollection : IEnumerable<BlameHunk>
2021
/// </summary>
2122
protectedBlameHunkCollection(){}
2223

23-
internalBlameHunkCollection(Repositoryrepo,RepositoryHandlerepoHandle,stringpath,BlameOptionsoptions)
24+
internalunsafeBlameHunkCollection(Repositoryrepo,RepositoryHandlerepoHandle,stringpath,BlameOptionsoptions)
2425
{
2526
this.repo=repo;
2627

27-
varrawopts=newGitBlameOptions
28+
varrawopts=newgit_blame_options
2829
{
2930
version=1,
3031
flags=options.Strategy.ToGitBlameOptionFlags(),
31-
MinLine=(uint)options.MinLine,
32-
MaxLine=(uint)options.MaxLine,
32+
min_line=(uint)options.MinLine,
33+
max_line=(uint)options.MaxLine,
3334
};
3435

3536
if(options.StartingAt!=null)
3637
{
37-
rawopts.NewestCommit=repo.Committish(options.StartingAt).Oid;
38+
fixed (byte*p=rawopts.newest_commit.Id)
39+
{
40+
Marshal.Copy(repo.Committish(options.StartingAt).Oid.Id,0,newIntPtr(p),git_oid.Size);
41+
}
3842
}
3943

4044
if(options.StoppingAt!=null)
4145
{
42-
rawopts.OldestCommit=repo.Committish(options.StoppingAt).Oid;
46+
fixed (byte*p=rawopts.oldest_commit.Id)
47+
{
48+
Marshal.Copy(repo.Committish(options.StoppingAt).Oid.Id,0,newIntPtr(p),git_oid.Size);
49+
}
4350
}
4451

4552
using(varblameHandle=Proxy.git_blame_file(repoHandle,path,rawopts))

‎LibGit2Sharp/CertificateSsh.cs‎

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
usingLibGit2Sharp.Core;
1+
usingSystem;
2+
usingSystem.Runtime.InteropServices;
3+
usingLibGit2Sharp.Core;
24

35
namespaceLibGit2Sharp
46
{
@@ -37,17 +39,29 @@ protected CertificateSsh()
3739
/// True if we have the SHA1 hostkey hash from the server
3840
/// </summary>public readonly bool HasSHA1;
3941

40-
internalCertificateSsh(GitCertificateSshcert)
42+
internalunsafeCertificateSsh(git_certificate_ssh*cert)
4143
{
4244

43-
HasMD5=cert.type.HasFlag(GitCertificateSshType.MD5);
44-
HasSHA1=cert.type.HasFlag(GitCertificateSshType.SHA1);
45+
HasMD5=cert->type.HasFlag(GitCertificateSshType.MD5);
46+
HasSHA1=cert->type.HasFlag(GitCertificateSshType.SHA1);
4547

4648
HashMD5=newbyte[16];
47-
cert.HashMD5.CopyTo(HashMD5,0);
49+
fixed (byte*p=&HashMD5[0])
50+
{
51+
for(vari=0;i<HashMD5.Length;i++)
52+
{
53+
HashMD5[i]=p[i];
54+
}
55+
}
4856

4957
HashSHA1=newbyte[20];
50-
cert.HashSHA1.CopyTo(HashSHA1,0);
58+
fixed (byte*p=&HashSHA1[0])
59+
{
60+
for(vari=0;i<HashSHA1.Length;i++)
61+
{
62+
HashMD5[i]=p[i];
63+
}
64+
}
5165
}
5266
}
5367
}

‎LibGit2Sharp/CertificateX509.cs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
usingSystem.Runtime.InteropServices;
1+
usingSystem;
2+
usingSystem.Runtime.InteropServices;
23
usingSystem.Security.Cryptography.X509Certificates;
34
usingLibGit2Sharp.Core;
45

@@ -21,11 +22,11 @@ protected CertificateX509()
2122
/// </summary>
2223
publicvirtualX509CertificateCertificate{get;privateset;}
2324

24-
internalCertificateX509(GitCertificateX509cert)
25+
internalunsafeCertificateX509(git_certificate_x509*cert)
2526
{
26-
intlen=checked((int)cert.len.ToUInt32());
27+
intlen=checked((int)cert->len.ToUInt32());
2728
byte[]data=newbyte[len];
28-
Marshal.Copy(cert.data,data,0,len);
29+
Marshal.Copy(newIntPtr(cert->data),data,0,len);
2930
Certificate=newX509Certificate(data);
3031
}
3132
}

‎LibGit2Sharp/Core/GitBlame.cs‎

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,32 +41,32 @@ internal enum GitBlameOptionFlags
4141
}
4242

4343
[StructLayout(LayoutKind.Sequential)]
44-
internalclassGitBlameOptions
44+
internalclassgit_blame_options
4545
{
4646
publicuintversion=1;
4747
publicGitBlameOptionFlagsflags;
48-
publicUInt16MinMatchCharacters;
49-
publicGitOidNewestCommit;
50-
publicGitOidOldestCommit;
51-
publicuintMinLine;
52-
publicuintMaxLine;
48+
publicUInt16min_match_characters;
49+
publicgit_oidnewest_commit;
50+
publicgit_oidoldest_commit;
51+
publicuintmin_line;
52+
publicuintmax_line;
5353
}
5454

5555
[StructLayout(LayoutKind.Sequential)]
56-
internalunsafeclassGitBlameHunk
56+
internalunsafestructgit_blame_hunk
5757
{
58-
publicushortLinesInHunk;
58+
publicushortlines_in_hunk;
5959

60-
publicGitOidFinalCommitId;
61-
publicushortFinalStartLineNumber;
62-
publicgit_signature*FinalSignature;
60+
publicgit_oidfinal_commit_id;
61+
publicushortfinal_start_line_number;
62+
publicgit_signature*final_signature;
6363

64-
publicGitOidOrigCommitId;
65-
publicIntPtrOrigPath;
66-
publicushortOrigStartLineNumber;
67-
publicgit_signature*OrigSignature;
64+
publicgit_oidorig_commit_id;
65+
publicchar*orig_path;
66+
publicushortorig_start_line_number;
67+
publicgit_signature*orig_signature;
6868

69-
publicbyteBoundary;
69+
publicbyteboundary;
7070
}
7171

7272
internalstaticclassBlameStrategyExtensions

‎LibGit2Sharp/Core/GitCertificate.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespaceLibGit2Sharp.Core
44
{
55
[StructLayout(LayoutKind.Sequential)]
6-
internalstructGitCertificate
6+
internalstructgit_certificate
77
{
88
publicGitCertificateTypetype;
99
}

‎LibGit2Sharp/Core/GitCertificateSsh.cs‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,19 @@
33
namespaceLibGit2Sharp.Core
44
{
55
[StructLayout(LayoutKind.Sequential)]
6-
internalstructGitCertificateSsh
6+
internalunsafestructgit_certificate_ssh
77
{
88
publicGitCertificateTypecert_type;
99
publicGitCertificateSshTypetype;
1010

1111
/// <summary>
1212
/// The MD5 hash (if appropriate)
1313
/// </summary>
14-
[MarshalAs(UnmanagedType.ByValArray,SizeConst=16)]
15-
publicbyte[]HashMD5;
14+
publicunsafefixedbyteHashMD5[16];
1615

1716
/// <summary>
1817
/// The MD5 hash (if appropriate)
1918
/// </summary>
20-
[MarshalAs(UnmanagedType.ByValArray,SizeConst=20)]
21-
publicbyte[]HashSHA1;
19+
publicunsafefixedbyteHashSHA1[20];
2220
}
2321
}

‎LibGit2Sharp/Core/GitCertificateX509.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespaceLibGit2Sharp.Core
55
{
66
[StructLayout(LayoutKind.Sequential)]
7-
internalstructGitCertificateX509
7+
internalunsafestructgit_certificate_x509
88
{
99
/// <summary>
1010
/// Type of the certificate, in this case, GitCertificateType.X509
@@ -13,7 +13,7 @@ internal struct GitCertificateX509
1313
/// <summary>
1414
/// Pointer to the X509 certificate data
1515
/// </summary>
16-
publicIntPtrdata;
16+
publicbyte*data;
1717
/// <summary>
1818
/// The size of the certificate data
1919
/// </summary>

‎LibGit2Sharp/Core/GitFilter.cs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ public delegate int git_filter_stream_fn(
110110
/// The file source being filtered
111111
/// </summary>
112112
[StructLayout(LayoutKind.Sequential)]
113-
internalclassGitFilterSource
113+
internalunsafestructgit_filter_source
114114
{
115-
publicIntPtrrepository;
115+
publicgit_repository*repository;
116116

117-
publicIntPtrpath;
117+
publicchar*path;
118118

119-
publicGitOidoid;
119+
publicgit_oidoid;
120120
}
121121
}

‎LibGit2Sharp/Core/GitPushUpdate.cs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
namespaceLibGit2Sharp.Core
55
{
66
[StructLayout(LayoutKind.Sequential)]
7-
internalstructGitPushUpdate
7+
internalunsafestructgit_push_update
88
{
9-
publicIntPtrsrc_refname;
10-
publicIntPtrdst_refname;
11-
publicGitOidsrc;
12-
publicGitOiddst;
9+
publicchar*src_refname;
10+
publicchar*dst_refname;
11+
publicgit_oidsrc;
12+
publicgit_oiddst;
1313
}
1414
}

0 commit comments

Comments
(0)