Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c2b73df

Browse files
committed
Use pointers for retrieving a config entry
This avoids a copy of the struct when we only want to grab the strings to convert them to managed strings.
1 parent b1f1f47 commit c2b73df

File tree

6 files changed

+21
-50
lines changed

6 files changed

+21
-50
lines changed

LibGit2Sharp/Configuration.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -732,13 +732,12 @@ private IEnumerable<ConfigurationEntry<string>> BuildConfigEntries()
732732
return Proxy.git_config_foreach(configHandle, BuildConfigEntry);
733733
}
734734

735-
private static ConfigurationEntry<string> BuildConfigEntry(IntPtr entryPtr)
735+
private static unsafe ConfigurationEntry<string> BuildConfigEntry(IntPtr entryPtr)
736736
{
737-
var entry = entryPtr.MarshalAs<GitConfigEntry>();
738-
739-
return new ConfigurationEntry<string>(LaxUtf8Marshaler.FromNative(entry.namePtr),
740-
LaxUtf8Marshaler.FromNative(entry.valuePtr),
741-
(ConfigurationLevel)entry.level);
737+
var entry = (GitConfigEntry*)entryPtr.ToPointer();
738+
return new ConfigurationEntry<string>(LaxUtf8Marshaler.FromNative(entry->namePtr),
739+
LaxUtf8Marshaler.FromNative(entry->valuePtr),
740+
(ConfigurationLevel)entry->level);
742741
}
743742

744743
/// <summary>

LibGit2Sharp/Core/GitConfigEntry.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
namespace LibGit2Sharp.Core
55
{
66
[StructLayout(LayoutKind.Sequential)]
7-
internal struct GitConfigEntry
7+
internal unsafe struct GitConfigEntry
88
{
9-
public IntPtr namePtr;
10-
public IntPtr valuePtr;
9+
public char* namePtr;
10+
public char* valuePtr;
1111
public uint level;
12-
public IntPtr freePtr;
13-
public IntPtr payloadPtr;
12+
public void* freePtr;
13+
public void* payloadPtr;
1414
}
1515
}

LibGit2Sharp/Core/Handles/GitConfigEntryHandle.cs

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

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,11 @@ internal static extern int git_config_delete_multivar(
348348
internal static extern void git_config_free(IntPtr cfg);
349349

350350
[DllImport(libgit2)]
351-
internal static extern void git_config_entry_free(IntPtr entry);
351+
internal static extern unsafe void git_config_entry_free(GitConfigEntry* entry);
352352

353353
[DllImport(libgit2)]
354-
internal static extern int git_config_get_entry(
355-
out GitConfigEntryHandle entry,
354+
internal static extern unsafe int git_config_get_entry(
355+
out GitConfigEntry* entry,
356356
ConfigurationSafeHandle cfg,
357357
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name);
358358

LibGit2Sharp/Core/Proxy.cs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -473,42 +473,31 @@ public static void git_config_free(IntPtr config)
473473
NativeMethods.git_config_free(config);
474474
}
475475

476-
public static void git_config_entry_free(IntPtr entry)
476+
public static unsafe ConfigurationEntry<T> git_config_get_entry<T>(ConfigurationSafeHandle config, string key)
477477
{
478-
NativeMethods.git_config_entry_free(entry);
479-
}
480-
481-
public static ConfigurationEntry<T> git_config_get_entry<T>(ConfigurationSafeHandle config, string key)
482-
{
483-
GitConfigEntryHandle handle = null;
484-
485478
if (!configurationParser.ContainsKey(typeof(T)))
486479
{
487480
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Generic Argument of type '{0}' is not supported.", typeof(T).FullName));
488481
}
489482

490-
GitConfigEntry entry;
491-
483+
GitConfigEntry* entry = null;
492484
try
493485
{
494-
var res = NativeMethods.git_config_get_entry(out handle, config, key);
486+
var res = NativeMethods.git_config_get_entry(out entry, config, key);
495487
if (res == (int)GitErrorCode.NotFound)
496488
{
497489
return null;
498490
}
499491

500492
Ensure.ZeroResult(res);
501-
502-
entry = handle.MarshalAsGitConfigEntry();
493+
return new ConfigurationEntry<T>(LaxUtf8Marshaler.FromNative(entry->namePtr),
494+
(T)configurationParser[typeof(T)](LaxUtf8Marshaler.FromNative(entry->valuePtr)),
495+
(ConfigurationLevel)entry->level);
503496
}
504497
finally
505498
{
506-
handle.SafeDispose();
499+
NativeMethods.git_config_entry_free(entry);
507500
}
508-
509-
return new ConfigurationEntry<T>(LaxUtf8Marshaler.FromNative(entry.namePtr),
510-
(T)configurationParser[typeof(T)](LaxUtf8Marshaler.FromNative(entry.valuePtr)),
511-
(ConfigurationLevel)entry.level);
512501
}
513502

514503
public static ConfigurationSafeHandle git_config_new()
@@ -593,7 +582,7 @@ public static ICollection<TResult> git_config_foreach<TResult>(
593582
return git_foreach(resultSelector, c => NativeMethods.git_config_foreach(config, (e, p) => c(e, p), IntPtr.Zero));
594583
}
595584

596-
public static IEnumerable<ConfigurationEntry<string>> git_config_iterator_glob(
585+
public static unsafe IEnumerable<ConfigurationEntry<string>> git_config_iterator_glob(
597586
ConfigurationSafeHandle config,
598587
string regexp,
599588
Func<IntPtr, ConfigurationEntry<string>> resultSelector)

LibGit2Sharp/LibGit2Sharp.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@
241241
<Compile Include="Core\Handles\NullIndexSafeHandle.cs" />
242242
<Compile Include="Core\ILazy.cs" />
243243
<Compile Include="Core\LazyGroup.cs" />
244-
<Compile Include="Core\Handles\GitConfigEntryHandle.cs" />
245244
<Compile Include="Core\Proxy.cs" />
246245
<Compile Include="Credentials.cs" />
247246
<Compile Include="Core\TarWriter.cs" />

0 commit comments

Comments
 (0)