Skip to content

Commit 1e1a4d6

Browse files
authored
Merge pull request nodegit#1090 from smith-kyle/mem-safety-time
Memory management: duplicate time
2 parents 07121fa + ce35433 commit 1e1a4d6

4 files changed

Lines changed: 32 additions & 0 deletions

File tree

generate/input/descriptor.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,9 @@
24532453
}
24542454
}
24552455
},
2456+
"time": {
2457+
"dupFunction": "git_time_dup"
2458+
},
24562459
"trace": {
24572460
"functions": {
24582461
"git_trace_set": {

generate/templates/manual/include/functions/copy.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const git_time *git_time_dup(const git_time *arg);
1515
const git_diff_delta *git_diff_delta_dup(const git_diff_delta *arg);
1616
const git_diff_file *git_diff_file_dup(const git_diff_file *arg);
1717

18+
void git_time_dup(git_time **out, const git_time *arg);
1819
void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg);
1920

2021
#endif

generate/templates/manual/src/functions/copy.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ const git_error *git_error_dup(const git_error *arg) {
1111
return result;
1212
}
1313

14+
void git_time_dup(git_time **out, const git_time *arg) {
15+
*out = (git_time *)malloc(sizeof(git_time));
16+
memcpy(*out, arg, sizeof(git_time));
17+
}
18+
1419
void git_transfer_progress_dup(git_transfer_progress **out, const git_transfer_progress *arg) {
1520
*out = (git_transfer_progress *)malloc(sizeof(git_transfer_progress));
1621
memcpy(*out, arg, sizeof(git_transfer_progress));

test/tests/signature.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var assert = require("assert");
22
var path = require("path");
33
var local = path.join.bind(path, __dirname);
44

5+
var garbageCollect = require("../utils/garbage_collect.js");
56
var exec = require("../../utils/execPromise");
67

78
describe("Signature", function() {
@@ -83,4 +84,26 @@ describe("Signature", function() {
8384
});
8485
});
8586
});
87+
88+
it("duplicates time", function() {
89+
garbageCollect();
90+
var Time = NodeGit.Time;
91+
var startSelfFreeingCount = Time.getSelfFreeingInstanceCount();
92+
var startNonSelfFreeingCount =
93+
Time.getNonSelfFreeingConstructedCount();
94+
var time = Signature.now(name, email).when();
95+
96+
garbageCollect();
97+
var endSelfFreeingCount = Time.getSelfFreeingInstanceCount();
98+
var endNonSelfFreeingCount = Time.getNonSelfFreeingConstructedCount();
99+
// we should get one duplicated, self-freeing time
100+
assert.equal(startSelfFreeingCount + 1, endSelfFreeingCount);
101+
assert.equal(startNonSelfFreeingCount, endNonSelfFreeingCount);
102+
103+
time = null;
104+
garbageCollect();
105+
endSelfFreeingCount = Time.getSelfFreeingInstanceCount();
106+
// the self-freeing time should get freed
107+
assert.equal(startSelfFreeingCount, endSelfFreeingCount);
108+
});
86109
});

0 commit comments

Comments
 (0)