Skip to content

Commit be3a626

Browse files
committed
tree: use HandleList for C function callbacks.
1 parent bde012f commit be3a626

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

tree.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,25 @@ type TreeWalkCallback func(string, *TreeEntry) int
9393
func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe.Pointer) C.int {
9494
root := C.GoString((*C.char)(_root))
9595
entry := (*C.git_tree_entry)(_entry)
96-
callback := *(*TreeWalkCallback)(ptr)
9796

98-
return C.int(callback(root, newTreeEntry(entry)))
97+
if callback, ok := pointerHandles.Get(ptr).(TreeWalkCallback); ok {
98+
return C.int(callback(root, newTreeEntry(entry)))
99+
} else {
100+
return C.int(-1)
101+
}
99102
}
100103

101104
func (t Tree) Walk(callback TreeWalkCallback) error {
102105
runtime.LockOSThread()
103106
defer runtime.UnlockOSThread()
104107

108+
ptr := pointerHandles.Track(callback)
109+
defer pointerHandles.Untrack(ptr)
110+
105111
err := C._go_git_treewalk(
106112
t.cast_ptr,
107113
C.GIT_TREEWALK_PRE,
108-
unsafe.Pointer(&callback),
114+
ptr,
109115
)
110116

111117
if err < 0 {

0 commit comments

Comments
 (0)