handles, merge, odb: changes for Go 1.6 pointer passing rules

See http://tip.golang.org/cmd/cgo/#hdr-Passing_pointers .
This commit is contained in:
Ian Lance Taylor 2016-01-07 18:37:46 -08:00
parent 4ee13db86d
commit 42b11d403d
3 changed files with 25 additions and 20 deletions

View File

@ -52,12 +52,12 @@ func (v *HandleList) Track(pointer interface{}) unsafe.Pointer {
v.Unlock()
return unsafe.Pointer(&slot)
return unsafe.Pointer(uintptr(slot))
}
// Untrack stops tracking the pointer given by the handle
func (v *HandleList) Untrack(handle unsafe.Pointer) {
slot := *(*int)(handle)
slot := int(uintptr(handle))
v.Lock()
@ -69,7 +69,7 @@ func (v *HandleList) Untrack(handle unsafe.Pointer) {
// Get retrieves the pointer from the given handle
func (v *HandleList) Get(handle unsafe.Pointer) interface{} {
slot := *(*int)(handle)
slot := int(uintptr(handle))
v.RLock()

View File

@ -262,7 +262,7 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
}
oids := make([]*Oid, coids.count)
hdr := reflect.SliceHeader {
hdr := reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(coids.ids)),
Len: int(coids.count),
Cap: int(coids.count),
@ -321,17 +321,21 @@ type MergeFileInput struct {
}
// populate a C struct with merge file input, make sure to use freeMergeFileInput to clean up allocs
func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) {
func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) *C.char {
c.path = C.CString(input.Path)
var toFree *C.char
if input.Contents != nil {
c.ptr = (*C.char)(unsafe.Pointer(&input.Contents[0]))
toFree = C.CString(string(input.Contents))
c.ptr = toFree
c.size = C.size_t(len(input.Contents))
}
c.mode = C.uint(input.Mode)
return toFree
}
func freeCMergeFileInput(c *C.git_merge_file_input) {
func freeCMergeFileInput(c *C.git_merge_file_input, toFree *C.char) {
C.free(unsafe.Pointer(c.path))
C.free(unsafe.Pointer(toFree))
}
type MergeFileFlags int
@ -382,12 +386,12 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp
var cours C.git_merge_file_input
var ctheirs C.git_merge_file_input
populateCMergeFileInput(&cancestor, ancestor)
defer freeCMergeFileInput(&cancestor)
populateCMergeFileInput(&cours, ours)
defer freeCMergeFileInput(&cours)
populateCMergeFileInput(&ctheirs, theirs)
defer freeCMergeFileInput(&ctheirs)
t := populateCMergeFileInput(&cancestor, ancestor)
defer freeCMergeFileInput(&cancestor, t)
t = populateCMergeFileInput(&cours, ours)
defer freeCMergeFileInput(&cours, t)
t = populateCMergeFileInput(&ctheirs, theirs)
defer freeCMergeFileInput(&ctheirs, t)
var copts *C.git_merge_file_options
if options != nil {

5
odb.go
View File

@ -61,12 +61,13 @@ func (v *Odb) Exists(oid *Oid) bool {
func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
oid = new(Oid)
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
cstr := C.CString(string(data))
defer C.free(unsafe.Pointer(cstr))
runtime.LockOSThread()
defer runtime.UnlockOSThread()
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(hdr.Data), C.size_t(hdr.Len), C.git_otype(otype))
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(cstr), C.size_t(len(data)), C.git_otype(otype))
if ret < 0 {
return nil, MakeGitError(ret)