Skip to content

Commit e5aa4fb

Browse files
committed
Use pointers for tree entries
We wrap the owned handle in a IDisposable to keep the using() pattern.
1 parent c2b73df commit e5aa4fb

File tree

8 files changed

+61
-42
lines changed

8 files changed

+61
-42
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
usingSystem;
2+
3+
namespaceLibGit2Sharp.Core.Handles
4+
{
5+
internalunsafeclassTreeEntryOwnedHandle:IDisposable
6+
{
7+
internalgit_tree_entry*Handle{get;set;}
8+
9+
internalTreeEntryOwnedHandle(git_tree_entry*entry)
10+
{
11+
Handle=entry;
12+
}
13+
14+
publicvoidDispose()
15+
{
16+
Proxy.git_tree_entry_free(Handle);
17+
}
18+
}
19+
}

‎LibGit2Sharp/Core/Handles/TreeEntrySafeHandle_Owned.cs‎

Lines changed: 0 additions & 11 deletions
This file was deleted.

‎LibGit2Sharp/Core/NativeMethods.cs‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,29 +1737,29 @@ internal static extern int git_transport_unregister(
17371737
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalCookie=UniqueId.UniqueIdentifier,MarshalTypeRef=typeof(StrictUtf8Marshaler))]stringprefix);
17381738

17391739
[DllImport(libgit2)]
1740-
internalstaticexternuintgit_tree_entry_filemode(SafeHandleentry);
1740+
internalstaticexternunsafeuintgit_tree_entry_filemode(git_tree_entry*entry);
17411741

17421742
[DllImport(libgit2)]
1743-
internalstaticexternTreeEntrySafeHandlegit_tree_entry_byindex(GitObjectSafeHandletree,UIntPtridx);
1743+
internalstaticexternunsafegit_tree_entry*git_tree_entry_byindex(GitObjectSafeHandletree,UIntPtridx);
17441744

17451745
[DllImport(libgit2)]
1746-
internalstaticexternintgit_tree_entry_bypath(
1747-
outTreeEntrySafeHandle_Ownedtree,
1746+
internalstaticexternunsafeintgit_tree_entry_bypath(
1747+
outgit_tree_entry*tree,
17481748
GitObjectSafeHandleroot,
17491749
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalCookie=UniqueId.UniqueIdentifier,MarshalTypeRef=typeof(StrictFilePathMarshaler))]FilePathtreeentry_path);
17501750

17511751
[DllImport(libgit2)]
1752-
internalstaticexternvoidgit_tree_entry_free(IntPtrtreeEntry);
1752+
internalstaticexternunsafevoidgit_tree_entry_free(git_tree_entry*treeEntry);
17531753

17541754
[DllImport(libgit2)]
1755-
internalstaticexternOidSafeHandlegit_tree_entry_id(SafeHandleentry);
1755+
internalstaticexternunsafeOidSafeHandlegit_tree_entry_id(git_tree_entry*entry);
17561756

17571757
[DllImport(libgit2)]
17581758
[return:MarshalAs(UnmanagedType.CustomMarshaler,MarshalCookie=UniqueId.UniqueIdentifier,MarshalTypeRef=typeof(LaxUtf8NoCleanupMarshaler))]
1759-
internalstaticexternstringgit_tree_entry_name(SafeHandleentry);
1759+
internalstaticexternunsafestringgit_tree_entry_name(git_tree_entry*entry);
17601760

17611761
[DllImport(libgit2)]
1762-
internalstaticexternGitObjectTypegit_tree_entry_type(SafeHandleentry);
1762+
internalstaticexternunsafeGitObjectTypegit_tree_entry_type(git_tree_entry*entry);
17631763

17641764
[DllImport(libgit2)]
17651765
internalstaticexternUIntPtrgit_tree_entrycount(GitObjectSafeHandletree);

‎LibGit2Sharp/Core/Opaques.cs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
usingSystem;
2+
3+
namespaceLibGit2Sharp.Core
4+
{
5+
internalstructgit_tree_entry{}
6+
}
7+

‎LibGit2Sharp/Core/Proxy.cs‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,21 +3156,21 @@ public static void git_transport_unregister(String prefix)
31563156

31573157
#region git_tree_
31583158

3159-
publicstaticModegit_tree_entry_attributes(SafeHandleentry)
3159+
publicstaticunsafeModegit_tree_entry_attributes(git_tree_entry*entry)
31603160
{
31613161
return(Mode)NativeMethods.git_tree_entry_filemode(entry);
31623162
}
31633163

3164-
publicstaticTreeEntrySafeHandlegit_tree_entry_byindex(GitObjectSafeHandletree,longidx)
3164+
publicstaticunsafegit_tree_entry*git_tree_entry_byindex(GitObjectSafeHandletree,longidx)
31653165
{
31663166
returnNativeMethods.git_tree_entry_byindex(tree,(UIntPtr)idx);
31673167
}
31683168

3169-
publicstaticTreeEntrySafeHandle_Ownedgit_tree_entry_bypath(RepositorySafeHandlerepo,ObjectIdid,FilePathtreeentry_path)
3169+
publicstaticunsafeTreeEntryOwnedHandlegit_tree_entry_bypath(RepositorySafeHandlerepo,ObjectIdid,FilePathtreeentry_path)
31703170
{
31713171
using(varobj=newObjectSafeWrapper(id,repo))
31723172
{
3173-
TreeEntrySafeHandle_OwnedtreeEntryPtr;
3173+
git_tree_entry*treeEntryPtr;
31743174
intres=NativeMethods.git_tree_entry_bypath(outtreeEntryPtr,obj.ObjectPtr,treeentry_path);
31753175

31763176
if(res==(int)GitErrorCode.NotFound)
@@ -3180,26 +3180,26 @@ public static TreeEntrySafeHandle_Owned git_tree_entry_bypath(RepositorySafeHand
31803180

31813181
Ensure.ZeroResult(res);
31823182

3183-
returntreeEntryPtr;
3183+
returnnewTreeEntryOwnedHandle(treeEntryPtr);
31843184
}
31853185
}
31863186

3187-
publicstaticvoidgit_tree_entry_free(IntPtrtreeEntry)
3187+
publicstaticunsafevoidgit_tree_entry_free(git_tree_entry*treeEntry)
31883188
{
31893189
NativeMethods.git_tree_entry_free(treeEntry);
31903190
}
31913191

3192-
publicstaticObjectIdgit_tree_entry_id(SafeHandleentry)
3192+
publicstaticunsafeObjectIdgit_tree_entry_id(git_tree_entry*entry)
31933193
{
31943194
returnNativeMethods.git_tree_entry_id(entry).MarshalAsObjectId();
31953195
}
31963196

3197-
publicstaticstringgit_tree_entry_name(SafeHandleentry)
3197+
publicstaticunsafestringgit_tree_entry_name(git_tree_entry*entry)
31983198
{
31993199
returnNativeMethods.git_tree_entry_name(entry);
32003200
}
32013201

3202-
publicstaticGitObjectTypegit_tree_entry_type(SafeHandleentry)
3202+
publicstaticunsafeGitObjectTypegit_tree_entry_type(git_tree_entry*entry)
32033203
{
32043204
returnNativeMethods.git_tree_entry_type(entry);
32053205
}

‎LibGit2Sharp/LibGit2Sharp.csproj‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@
287287
<CompileInclude="Core\Handles\NotOwnedSafeHandleBase.cs" />
288288
<CompileInclude="Core\Handles\OidSafeHandle.cs" />
289289
<CompileInclude="Core\Handles\TreeBuilderSafeHandle.cs" />
290-
<CompileInclude="Core\Handles\TreeEntrySafeHandle_Owned.cs" />
291290
<CompileInclude="Core\Handles\ReferenceSafeHandle.cs" />
292291
<CompileInclude="Core\Handles\SignatureSafeHandle.cs" />
293292
<CompileInclude="Core\Handles\TreeEntrySafeHandle.cs" />
@@ -381,6 +380,8 @@
381380
<CompileInclude="Core\GitCertificateSshType.cs" />
382381
<CompileInclude="CertificateSsh.cs" />
383382
<CompileInclude="IDiffResult.cs" />
383+
<CompileInclude="Core\Opaques.cs" />
384+
<CompileInclude="Core\Handles\TreeEntryOwnedHandle.cs" />
384385
</ItemGroup>
385386
<ItemGroup>
386387
<CodeAnalysisDictionaryInclude="CustomDictionary.xml" />

‎LibGit2Sharp/Tree.cs‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,24 +47,24 @@ public virtual TreeEntry this[string relativePath]
4747
get{returnRetrieveFromPath(relativePath);}
4848
}
4949

50-
privateTreeEntryRetrieveFromPath(FilePathrelativePath)
50+
privateunsafeTreeEntryRetrieveFromPath(FilePathrelativePath)
5151
{
5252
if(relativePath.IsNullOrEmpty())
5353
{
5454
returnnull;
5555
}
5656

57-
using(TreeEntrySafeHandle_OwnedtreeEntryPtr=Proxy.git_tree_entry_bypath(repo.Handle,Id,relativePath))
57+
using(TreeEntryOwnedHandletreeEntry=Proxy.git_tree_entry_bypath(repo.Handle,Id,relativePath))
5858
{
59-
if(treeEntryPtr==null)
59+
if(treeEntry==null)
6060
{
6161
returnnull;
6262
}
6363

6464
stringposixPath=relativePath.Posix;
6565
stringfilename=posixPath.Split('/').Last();
6666
stringparentPath=posixPath.Substring(0,posixPath.Length-filename.Length);
67-
returnnewTreeEntry(treeEntryPtr,Id,repo,path.Combine(parentPath));
67+
returnnewTreeEntry(treeEntry.Handle,Id,repo,path.Combine(parentPath));
6868
}
6969
}
7070

@@ -75,6 +75,11 @@ internal string Path
7575

7676
#region IEnumerable<TreeEntry> Members
7777

78+
unsafeTreeEntrybyIndex(ObjectSafeWrapperobj,uinti,ObjectIdparentTreeId,Repositoryrepo,FilePathparentPath)
79+
{
80+
returnnewTreeEntry(Proxy.git_tree_entry_byindex(obj.ObjectPtr,i),parentTreeId,repo,parentPath);
81+
}
82+
7883
/// <summary>
7984
/// Returns an enumerator that iterates through the collection.
8085
/// </summary>
@@ -83,10 +88,8 @@ public virtual IEnumerator<TreeEntry> GetEnumerator()
8388
{
8489
using(varobj=newObjectSafeWrapper(Id,repo.Handle))
8590
{
86-
for(uinti=0;i<Count;i++)
87-
{
88-
TreeEntrySafeHandlehandle=Proxy.git_tree_entry_byindex(obj.ObjectPtr,i);
89-
yieldreturnnewTreeEntry(handle,Id,repo,path);
91+
for(uinti=0;i<Count;i++){
92+
yieldreturnbyIndex(obj,i,Id,repo,path);
9093
}
9194
}
9295
}

‎LibGit2Sharp/TreeEntry.cs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ public class TreeEntry : IEquatable<TreeEntry>
2727
protectedTreeEntry()
2828
{}
2929

30-
internalTreeEntry(SafeHandleobj,ObjectIdparentTreeId,Repositoryrepo,FilePathparentPath)
30+
internalunsafeTreeEntry(git_tree_entry*entry,ObjectIdparentTreeId,Repositoryrepo,FilePathparentPath)
3131
{
3232
this.parentTreeId=parentTreeId;
3333
this.repo=repo;
34-
targetOid=Proxy.git_tree_entry_id(obj);
34+
targetOid=Proxy.git_tree_entry_id(entry);
3535

36-
GitObjectTypetreeEntryTargetType=Proxy.git_tree_entry_type(obj);
36+
GitObjectTypetreeEntryTargetType=Proxy.git_tree_entry_type(entry);
3737
TargetType=treeEntryTargetType.ToTreeEntryTargetType();
3838

3939
target=newLazy<GitObject>(RetrieveTreeEntryTarget);
4040

41-
Mode=Proxy.git_tree_entry_attributes(obj);
42-
Name=Proxy.git_tree_entry_name(obj);
41+
Mode=Proxy.git_tree_entry_attributes(entry);
42+
Name=Proxy.git_tree_entry_name(entry);
4343
path=newLazy<string>(()=>System.IO.Path.Combine(parentPath.Native,Name));
4444
}
4545

0 commit comments

Comments
(0)