summaryrefslogtreecommitdiff
path: root/tree.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2015-05-30 22:23:23 +0200
committerCarlos Martín Nieto <[email protected]>2015-05-30 22:23:23 +0200
commit35ff0de8559ed987ff82b025cc2bb5983f29e559 (patch)
tree62b2ffe5ef7c32f89a49bb722c1cce85b2a9656b /tree.go
parent193deb7ae3cbc5d5a1f7f186aae6edb20bff950a (diff)
parente8531dd5c31fc87044e9061b18f37df9b05bd0ac (diff)
Merge pull request #196 from pks-t/pointer-indirection
[WIP/RFC] Pointer indirection
Diffstat (limited to 'tree.go')
-rw-r--r--tree.go16
1 files changed, 11 insertions, 5 deletions
diff --git a/tree.go b/tree.go
index c18d02a..aad2c8d 100644
--- a/tree.go
+++ b/tree.go
@@ -90,22 +90,28 @@ func (t Tree) EntryCount() uint64 {
type TreeWalkCallback func(string, *TreeEntry) int
//export CallbackGitTreeWalk
-func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe.Pointer) C.int {
- root := C.GoString((*C.char)(_root))
+func CallbackGitTreeWalk(_root *C.char, _entry unsafe.Pointer, ptr unsafe.Pointer) C.int {
+ root := C.GoString(_root)
entry := (*C.git_tree_entry)(_entry)
- callback := *(*TreeWalkCallback)(ptr)
- return C.int(callback(root, newTreeEntry(entry)))
+ if callback, ok := pointerHandles.Get(ptr).(TreeWalkCallback); ok {
+ return C.int(callback(root, newTreeEntry(entry)))
+ } else {
+ panic("invalid treewalk callback")
+ }
}
func (t Tree) Walk(callback TreeWalkCallback) error {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
+ ptr := pointerHandles.Track(callback)
+ defer pointerHandles.Untrack(ptr)
+
err := C._go_git_treewalk(
t.cast_ptr,
C.GIT_TREEWALK_PRE,
- unsafe.Pointer(&callback),
+ ptr,
)
if err < 0 {