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()
|
v.Unlock()
|
||||||
|
|
||||||
return unsafe.Pointer(&slot)
|
return unsafe.Pointer(uintptr(slot))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Untrack stops tracking the pointer given by the handle
|
// Untrack stops tracking the pointer given by the handle
|
||||||
func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
||||||
slot := *(*int)(handle)
|
slot := int(uintptr(handle))
|
||||||
|
|
||||||
v.Lock()
|
v.Lock()
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
||||||
|
|
||||||
// Get retrieves the pointer from the given handle
|
// Get retrieves the pointer from the given handle
|
||||||
func (v *HandleList) Get(handle unsafe.Pointer) interface{} {
|
func (v *HandleList) Get(handle unsafe.Pointer) interface{} {
|
||||||
slot := *(*int)(handle)
|
slot := int(uintptr(handle))
|
||||||
|
|
||||||
v.RLock()
|
v.RLock()
|
||||||
|
|
||||||
|
|
34
merge.go
34
merge.go
|
@ -85,8 +85,8 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type MergeOptions struct {
|
type MergeOptions struct {
|
||||||
Version uint
|
Version uint
|
||||||
TreeFlags MergeTreeFlag
|
TreeFlags MergeTreeFlag
|
||||||
|
|
||||||
RenameThreshold uint
|
RenameThreshold uint
|
||||||
TargetLimit uint
|
TargetLimit uint
|
||||||
|
@ -98,7 +98,7 @@ type MergeOptions struct {
|
||||||
func mergeOptionsFromC(opts *C.git_merge_options) MergeOptions {
|
func mergeOptionsFromC(opts *C.git_merge_options) MergeOptions {
|
||||||
return MergeOptions{
|
return MergeOptions{
|
||||||
Version: uint(opts.version),
|
Version: uint(opts.version),
|
||||||
TreeFlags: MergeTreeFlag(opts.tree_flags),
|
TreeFlags: MergeTreeFlag(opts.tree_flags),
|
||||||
RenameThreshold: uint(opts.rename_threshold),
|
RenameThreshold: uint(opts.rename_threshold),
|
||||||
TargetLimit: uint(opts.target_limit),
|
TargetLimit: uint(opts.target_limit),
|
||||||
FileFavor: MergeFileFavor(opts.file_favor),
|
FileFavor: MergeFileFavor(opts.file_favor),
|
||||||
|
@ -262,10 +262,10 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
oids := make([]*Oid, coids.count)
|
oids := make([]*Oid, coids.count)
|
||||||
hdr := reflect.SliceHeader {
|
hdr := reflect.SliceHeader{
|
||||||
Data: uintptr(unsafe.Pointer(coids.ids)),
|
Data: uintptr(unsafe.Pointer(coids.ids)),
|
||||||
Len: int(coids.count),
|
Len: int(coids.count),
|
||||||
Cap: int(coids.count),
|
Cap: int(coids.count),
|
||||||
}
|
}
|
||||||
|
|
||||||
goSlice := *(*[]C.git_oid)(unsafe.Pointer(&hdr))
|
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
|
// 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)
|
c.path = C.CString(input.Path)
|
||||||
|
var toFree *C.char
|
||||||
if input.Contents != nil {
|
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.size = C.size_t(len(input.Contents))
|
||||||
}
|
}
|
||||||
c.mode = C.uint(input.Mode)
|
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(c.path))
|
||||||
|
C.free(unsafe.Pointer(toFree))
|
||||||
}
|
}
|
||||||
|
|
||||||
type MergeFileFlags int
|
type MergeFileFlags int
|
||||||
|
@ -382,12 +386,12 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp
|
||||||
var cours C.git_merge_file_input
|
var cours C.git_merge_file_input
|
||||||
var ctheirs C.git_merge_file_input
|
var ctheirs C.git_merge_file_input
|
||||||
|
|
||||||
populateCMergeFileInput(&cancestor, ancestor)
|
t := populateCMergeFileInput(&cancestor, ancestor)
|
||||||
defer freeCMergeFileInput(&cancestor)
|
defer freeCMergeFileInput(&cancestor, t)
|
||||||
populateCMergeFileInput(&cours, ours)
|
t = populateCMergeFileInput(&cours, ours)
|
||||||
defer freeCMergeFileInput(&cours)
|
defer freeCMergeFileInput(&cours, t)
|
||||||
populateCMergeFileInput(&ctheirs, theirs)
|
t = populateCMergeFileInput(&ctheirs, theirs)
|
||||||
defer freeCMergeFileInput(&ctheirs)
|
defer freeCMergeFileInput(&ctheirs, t)
|
||||||
|
|
||||||
var copts *C.git_merge_file_options
|
var copts *C.git_merge_file_options
|
||||||
if options != nil {
|
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) {
|
func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
|
||||||
oid = new(Oid)
|
oid = new(Oid)
|
||||||
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
|
cstr := C.CString(string(data))
|
||||||
|
defer C.free(unsafe.Pointer(cstr))
|
||||||
|
|
||||||
runtime.LockOSThread()
|
runtime.LockOSThread()
|
||||||
defer runtime.UnlockOSThread()
|
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 {
|
if ret < 0 {
|
||||||
return nil, MakeGitError(ret)
|
return nil, MakeGitError(ret)
|
||||||
|
|
Loading…
Reference in New Issue