From 8a73c75f1a68f2855d03e6d2ce45c95c414aa71a Mon Sep 17 00:00:00 2001 From: Carlos Martín Nieto Date: Mon, 26 May 2014 09:28:07 +0200 Subject: Keep a pointer to the repository in the objects and references Otherwise, the garbage collector might decide it's a good idea to throw away the repository instance while the C object still has a pointer to it. Hilarity ensues. --- reference.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'reference.go') diff --git a/reference.go b/reference.go index 9a2a8e5..e17e2b3 100644 --- a/reference.go +++ b/reference.go @@ -18,11 +18,12 @@ const ( ) type Reference struct { - ptr *C.git_reference + ptr *C.git_reference + repo *Repository } -func newReferenceFromC(ptr *C.git_reference) *Reference { - ref := &Reference{ptr: ptr} +func newReferenceFromC(ptr *C.git_reference, repo *Repository) *Reference { + ref := &Reference{ptr: ptr, repo: repo} runtime.SetFinalizer(ref, (*Reference).Free) return ref } @@ -52,7 +53,7 @@ func (v *Reference) SetSymbolicTarget(target string, sig *Signature, msg string) return nil, MakeGitError(ret) } - return newReferenceFromC(ptr), nil + return newReferenceFromC(ptr, v.repo), nil } func (v *Reference) SetTarget(target *Oid, sig *Signature, msg string) (*Reference, error) { @@ -77,7 +78,7 @@ func (v *Reference) SetTarget(target *Oid, sig *Signature, msg string) (*Referen return nil, MakeGitError(ret) } - return newReferenceFromC(ptr), nil + return newReferenceFromC(ptr, v.repo), nil } func (v *Reference) Resolve() (*Reference, error) { @@ -91,7 +92,7 @@ func (v *Reference) Resolve() (*Reference, error) { return nil, MakeGitError(ret) } - return newReferenceFromC(ptr), nil + return newReferenceFromC(ptr, v.repo), nil } func (v *Reference) Rename(name string, force bool, sig *Signature, msg string) (*Reference, error) { @@ -119,7 +120,7 @@ func (v *Reference) Rename(name string, force bool, sig *Signature, msg string) return nil, MakeGitError(ret) } - return newReferenceFromC(ptr), nil + return newReferenceFromC(ptr, v.repo), nil } func (v *Reference) Target() *Oid { @@ -158,7 +159,7 @@ func (v *Reference) Peel(t ObjectType) (Object, error) { return nil, MakeGitError(err) } - return allocObject(cobj), nil + return allocObject(cobj, v.repo), nil } // Owner returns a weak reference to the repository which owns this @@ -298,7 +299,7 @@ func (v *ReferenceIterator) Next() (*Reference, error) { return nil, MakeGitError(ret) } - return newReferenceFromC(ptr), nil + return newReferenceFromC(ptr, v.repo), nil } // Free the reference iterator -- cgit v1.2.3