diff options
| author | Carlos Martín Nieto <[email protected]> | 2015-05-30 22:23:23 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <[email protected]> | 2015-05-30 22:23:23 +0200 |
| commit | 35ff0de8559ed987ff82b025cc2bb5983f29e559 (patch) | |
| tree | 62b2ffe5ef7c32f89a49bb722c1cce85b2a9656b /tree.go | |
| parent | 193deb7ae3cbc5d5a1f7f186aae6edb20bff950a (diff) | |
| parent | e8531dd5c31fc87044e9061b18f37df9b05bd0ac (diff) | |
Merge pull request #196 from pks-t/pointer-indirection
[WIP/RFC] Pointer indirection
Diffstat (limited to 'tree.go')
| -rw-r--r-- | tree.go | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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 { |
