From 1a74a2d03638743ebd62ccaf6c7a8053bd8e8241 Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Tue, 3 Mar 2015 12:19:06 +0000 Subject: [PATCH 1/3] Allocate the correct amount of memory --- generate/templates/manual/src/str_array_converter.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index d5a7081f7..b75f3810c 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -25,7 +25,7 @@ git_strarray *StrArrayConverter::Convert(Handle val) { } git_strarray *StrArrayConverter::ConvertArray(Array *val) { - git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray*)); + git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray)); result->count = val->Length(); result->strings = (char **)malloc(sizeof(char*) * result->count); @@ -47,7 +47,7 @@ git_strarray* StrArrayConverter::ConvertString(Handle val) { } git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { - git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray*)); + git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray)); result->count = argc; result->strings = (char **)malloc(sizeof(char*) * result->count); From 3d4cecfb2df046b76c5884d680067e174f44274f Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Tue, 3 Mar 2015 12:26:58 +0000 Subject: [PATCH 2/3] Reduce number of heap allocations for string array --- .../templates/manual/src/str_array_converter.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index b75f3810c..4786a6599 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -24,10 +24,17 @@ git_strarray *StrArrayConverter::Convert(Handle val) { } } +static git_strarray * AllocGitStrArray(const size_t count) { + const size_t size = sizeof(git_strarray) + (sizeof(char*) * count); + uint8_t* memory = reinterpret_cast(malloc(size)); + git_strarray *result = reinterpret_cast(memory); + result->count = count; + result->strings = reinterpret_cast(memory + sizeof(git_strarray)); + return result; +} + git_strarray *StrArrayConverter::ConvertArray(Array *val) { - git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray)); - result->count = val->Length(); - result->strings = (char **)malloc(sizeof(char*) * result->count); + git_strarray *result = AllocGitStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { NanUtf8String entry(val->Get(i)); @@ -47,9 +54,7 @@ git_strarray* StrArrayConverter::ConvertString(Handle val) { } git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { - git_strarray *result = (git_strarray *)malloc(sizeof(git_strarray)); - result->count = argc; - result->strings = (char **)malloc(sizeof(char*) * result->count); + git_strarray *result = AllocGitStrArray(argc); for(size_t i = 0; i < result->count; i++) { result->strings[i] = strdup(argv[i]); From 3e5cb89b9f49f3a45c6828bfbd39266f74b2667d Mon Sep 17 00:00:00 2001 From: Matt Clarkson Date: Tue, 3 Mar 2015 15:07:41 +0000 Subject: [PATCH 3/3] Expose AllocStrArray --- generate/templates/manual/include/str_array_converter.h | 1 + generate/templates/manual/src/str_array_converter.cc | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/generate/templates/manual/include/str_array_converter.h b/generate/templates/manual/include/str_array_converter.h index 5f580e961..c0df65fc9 100644 --- a/generate/templates/manual/include/str_array_converter.h +++ b/generate/templates/manual/include/str_array_converter.h @@ -16,6 +16,7 @@ class StrArrayConverter { private: static git_strarray *ConvertArray(Array *val); static git_strarray *ConvertString(Handle val); + static git_strarray *AllocStrArray(const size_t count); static git_strarray *ConstructStrArray(int argc, char** argv); }; diff --git a/generate/templates/manual/src/str_array_converter.cc b/generate/templates/manual/src/str_array_converter.cc index 4786a6599..3e8de909e 100644 --- a/generate/templates/manual/src/str_array_converter.cc +++ b/generate/templates/manual/src/str_array_converter.cc @@ -24,7 +24,7 @@ git_strarray *StrArrayConverter::Convert(Handle val) { } } -static git_strarray * AllocGitStrArray(const size_t count) { +static git_strarray * StrArrayConverter::AllocStrArray(const size_t count) { const size_t size = sizeof(git_strarray) + (sizeof(char*) * count); uint8_t* memory = reinterpret_cast(malloc(size)); git_strarray *result = reinterpret_cast(memory); @@ -34,7 +34,7 @@ static git_strarray * AllocGitStrArray(const size_t count) { } git_strarray *StrArrayConverter::ConvertArray(Array *val) { - git_strarray *result = AllocGitStrArray(val->Length()); + git_strarray *result = AllocStrArray(val->Length()); for(size_t i = 0; i < result->count; i++) { NanUtf8String entry(val->Get(i)); @@ -54,7 +54,7 @@ git_strarray* StrArrayConverter::ConvertString(Handle val) { } git_strarray *StrArrayConverter::ConstructStrArray(int argc, char** argv) { - git_strarray *result = AllocGitStrArray(argc); + git_strarray *result = AllocStrArray(argc); for(size_t i = 0; i < result->count; i++) { result->strings[i] = strdup(argv[i]);