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()
|
||||
|
||||
|
|
34
merge.go
34
merge.go
|
@ -85,8 +85,8 @@ const (
|
|||
)
|
||||
|
||||
type MergeOptions struct {
|
||||
Version uint
|
||||
TreeFlags MergeTreeFlag
|
||||
Version uint
|
||||
TreeFlags MergeTreeFlag
|
||||
|
||||
RenameThreshold uint
|
||||
TargetLimit uint
|
||||
|
@ -98,7 +98,7 @@ type MergeOptions struct {
|
|||
func mergeOptionsFromC(opts *C.git_merge_options) MergeOptions {
|
||||
return MergeOptions{
|
||||
Version: uint(opts.version),
|
||||
TreeFlags: MergeTreeFlag(opts.tree_flags),
|
||||
TreeFlags: MergeTreeFlag(opts.tree_flags),
|
||||
RenameThreshold: uint(opts.rename_threshold),
|
||||
TargetLimit: uint(opts.target_limit),
|
||||
FileFavor: MergeFileFavor(opts.file_favor),
|
||||
|
@ -262,10 +262,10 @@ 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),
|
||||
Len: int(coids.count),
|
||||
Cap: int(coids.count),
|
||||
}
|
||||
|
||||
goSlice := *(*[]C.git_oid)(unsafe.Pointer(&hdr))
|
||||
|
@ -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