diff options
| author | Carlos MartÃn Nieto <[email protected]> | 2017-07-08 16:51:22 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-07-08 16:51:22 +0200 |
| commit | 08db2e2c167404c5ed9be0fc1c995e41bad479bb (patch) | |
| tree | 4a9c1357f3682d4134318e73ef85aa172cbfbd48 /diff.go | |
| parent | 29c0b730076fe402c22ea3e3a11a7ed541663637 (diff) | |
| parent | 55a1096141519a1f380d0702671cfe9bf90ec435 (diff) | |
Merge pull request #393 from libgit2/cmn/keepalive-all-the-things
KeepAlive all the things
Diffstat (limited to 'diff.go')
| -rw-r--r-- | diff.go | 57 |
1 files changed, 42 insertions, 15 deletions
@@ -127,14 +127,17 @@ func diffLineFromC(line *C.git_diff_line) DiffLine { } type Diff struct { - ptr *C.git_diff + ptr *C.git_diff + repo *Repository } func (diff *Diff) NumDeltas() (int, error) { if diff.ptr == nil { return -1, ErrInvalid } - return int(C.git_diff_num_deltas(diff.ptr)), nil + ret := int(C.git_diff_num_deltas(diff.ptr)) + runtime.KeepAlive(diff) + return ret, nil } func (diff *Diff) GetDelta(index int) (DiffDelta, error) { @@ -142,16 +145,19 @@ func (diff *Diff) GetDelta(index int) (DiffDelta, error) { return DiffDelta{}, ErrInvalid } ptr := C.git_diff_get_delta(diff.ptr, C.size_t(index)) - return diffDeltaFromC(ptr), nil + ret := diffDeltaFromC(ptr) + runtime.KeepAlive(diff) + return ret, nil } -func newDiffFromC(ptr *C.git_diff) *Diff { +func newDiffFromC(ptr *C.git_diff, repo *Repository) *Diff { if ptr == nil { return nil } diff := &Diff{ - ptr: ptr, + ptr: ptr, + repo: repo, } runtime.SetFinalizer(diff, (*Diff).Free) @@ -187,6 +193,7 @@ func (diff *Diff) FindSimilar(opts *DiffFindOptions) error { defer runtime.UnlockOSThread() ecode := C.git_diff_find_similar(diff.ptr, copts) + runtime.KeepAlive(diff) if ecode < 0 { return MakeGitError(ecode) } @@ -209,15 +216,21 @@ func (stats *DiffStats) Free() error { } func (stats *DiffStats) Insertions() int { - return int(C.git_diff_stats_insertions(stats.ptr)) + ret := int(C.git_diff_stats_insertions(stats.ptr)) + runtime.KeepAlive(stats) + return ret } func (stats *DiffStats) Deletions() int { - return int(C.git_diff_stats_deletions(stats.ptr)) + ret := int(C.git_diff_stats_deletions(stats.ptr)) + runtime.KeepAlive(stats) + return ret } func (stats *DiffStats) FilesChanged() int { - return int(C.git_diff_stats_files_changed(stats.ptr)) + ret := int(C.git_diff_stats_files_changed(stats.ptr)) + runtime.KeepAlive(stats) + return ret } type DiffStatsFormat int @@ -240,6 +253,7 @@ func (stats *DiffStats) String(format DiffStatsFormat, ret := C.git_diff_stats_to_buf(&buf, stats.ptr, C.git_diff_stats_format_t(format), C.size_t(width)) + runtime.KeepAlive(stats) if ret < 0 { return "", MakeGitError(ret) } @@ -253,7 +267,9 @@ func (diff *Diff) Stats() (*DiffStats, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - if ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr); ecode < 0 { + ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr) + runtime.KeepAlive(diff) + if ecode < 0 { return nil, MakeGitError(ecode) } runtime.SetFinalizer(stats, (*DiffStats).Free) @@ -301,6 +317,7 @@ func (diff *Diff) ForEach(cbFile DiffForEachFileCallback, detail DiffDetail) err defer pointerHandles.Untrack(handle) ecode := C._go_git_diff_foreach(diff.ptr, 1, intHunks, intLines, handle) + runtime.KeepAlive(diff) if ecode < 0 { return data.Error } @@ -380,6 +397,7 @@ func (diff *Diff) Patch(deltaIndex int) (*Patch, error) { defer runtime.UnlockOSThread() ecode := C.git_patch_from_diff(&patchPtr, diff.ptr, C.size_t(deltaIndex)) + runtime.KeepAlive(diff) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -537,7 +555,7 @@ func diffNotifyCb(_diff_so_far unsafe.Pointer, delta_to_add *C.git_diff_delta, m if data != nil { if data.Diff == nil { - data.Diff = newDiffFromC(diff_so_far) + data.Diff = newDiffFromC(diff_so_far, nil) } err := data.Callback(data.Diff, diffDeltaFromC(delta_to_add), C.GoString(matched_pathspec)) @@ -618,6 +636,8 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) ( defer runtime.UnlockOSThread() ecode := C.git_diff_tree_to_tree(&diffPtr, v.ptr, oldPtr, newPtr, copts) + runtime.KeepAlive(oldTree) + runtime.KeepAlive(newTree) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -625,7 +645,7 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) ( if notifyData != nil && notifyData.Diff != nil { return notifyData.Diff, nil } - return newDiffFromC(diffPtr), nil + return newDiffFromC(diffPtr, v), nil } func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff, error) { @@ -643,6 +663,7 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff, defer runtime.UnlockOSThread() ecode := C.git_diff_tree_to_workdir(&diffPtr, v.ptr, oldPtr, copts) + runtime.KeepAlive(oldTree) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -650,7 +671,7 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff, if notifyData != nil && notifyData.Diff != nil { return notifyData.Diff, nil } - return newDiffFromC(diffPtr), nil + return newDiffFromC(diffPtr, v), nil } func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOptions) (*Diff, error) { @@ -673,6 +694,8 @@ func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOpti defer runtime.UnlockOSThread() ecode := C.git_diff_tree_to_index(&diffPtr, v.ptr, oldPtr, indexPtr, copts) + runtime.KeepAlive(oldTree) + runtime.KeepAlive(index) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -680,7 +703,7 @@ func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOpti if notifyData != nil && notifyData.Diff != nil { return notifyData.Diff, nil } - return newDiffFromC(diffPtr), nil + return newDiffFromC(diffPtr, v), nil } func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions) (*Diff, error) { @@ -698,6 +721,7 @@ func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions defer runtime.UnlockOSThread() ecode := C.git_diff_tree_to_workdir_with_index(&diffPtr, v.ptr, oldPtr, copts) + runtime.KeepAlive(oldTree) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -705,7 +729,7 @@ func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions if notifyData != nil && notifyData.Diff != nil { return notifyData.Diff, nil } - return newDiffFromC(diffPtr), nil + return newDiffFromC(diffPtr, v), nil } func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff, error) { @@ -723,6 +747,7 @@ func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff, defer runtime.UnlockOSThread() ecode := C.git_diff_index_to_workdir(&diffPtr, v.ptr, indexPtr, copts) + runtime.KeepAlive(index) if ecode < 0 { return nil, MakeGitError(ecode) } @@ -730,7 +755,7 @@ func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff, if notifyData != nil && notifyData.Diff != nil { return notifyData.Diff, nil } - return newDiffFromC(diffPtr), nil + return newDiffFromC(diffPtr, v), nil } // DiffBlobs performs a diff between two arbitrary blobs. You can pass @@ -773,6 +798,8 @@ func DiffBlobs(oldBlob *Blob, oldAsPath string, newBlob *Blob, newAsPath string, defer runtime.UnlockOSThread() ecode := C._go_git_diff_blobs(oldBlobPtr, oldBlobPath, newBlobPtr, newBlobPath, copts, 1, intHunks, intLines, handle) + runtime.KeepAlive(oldBlob) + runtime.KeepAlive(newBlob) if ecode < 0 { return MakeGitError(ecode) } |
