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:
parent
4ee13db86d
commit
42b11d403d
|
@ -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()
|
||||
|
||||
|
|
24
merge.go
24
merge.go
|
@ -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
5
odb.go
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue