11template <typename Traits>
22NodeGitWrapper<Traits>::NodeGitWrapper(typename Traits::cType *raw, bool selfFreeing, v8::Local<v8::Object> owner)
33 : nodegitContext(nodegit::Context::GetCurrentContext()) {
4+ nodegitContext->LinkTrackerList (this );
45 if (Traits::isSingleton) {
56 ReferenceCounter::incrementCountForPointer ((void *)raw);
67 this ->raw = raw;
@@ -20,6 +21,7 @@ NodeGitWrapper<Traits>::NodeGitWrapper(typename Traits::cType *raw, bool selfFre
2021 Traits::duplicate (&this ->raw , raw);
2122 selfFreeing = true ;
2223 } else {
24+ SetNativeOwners (owner);
2325 this ->owner .Reset (owner);
2426 this ->raw = raw;
2527 }
@@ -45,11 +47,15 @@ NodeGitWrapper<Traits>::NodeGitWrapper(const char *error)
4547
4648template <typename Traits>
4749NodeGitWrapper<Traits>::~NodeGitWrapper () {
50+ Unlink ();
4851 if (Traits::isFreeable && selfFreeing) {
4952 Traits::free (raw);
5053 SelfFreeingInstanceCount--;
5154 raw = NULL ;
5255 }
56+ else if (!selfFreeing) {
57+ --NonSelfFreeingConstructedCount;
58+ }
5359}
5460
5561template <typename Traits>
@@ -77,6 +83,33 @@ NAN_METHOD(NodeGitWrapper<Traits>::JSNewFunction) {
7783 info.GetReturnValue ().Set (info.This ());
7884}
7985
86+ template <typename Traits>
87+ void NodeGitWrapper<Traits>::SetNativeOwners(v8::Local<v8::Object> owners) {
88+ assert (owners->IsArray () || owners->IsObject ());
89+ Nan::HandleScope scope;
90+ std::unique_ptr< std::vector<nodegit::TrackerWrap*> > trackerOwners =
91+ std::make_unique< std::vector<nodegit::TrackerWrap*> >();
92+
93+ if (owners->IsArray ()) {
94+ v8::Local<v8::Context> context = Nan::GetCurrentContext ();
95+ const v8::Local<v8::Array> ownersArray = owners.As <v8::Array>();
96+ const uint32_t numOwners = ownersArray->Length ();
97+
98+ for (uint32_t i = 0 ; i < numOwners; ++i) {
99+ v8::Local<v8::Value> value = ownersArray->Get (context, i).ToLocalChecked ();
100+ const v8::Local<v8::Object> object = value.As <v8::Object>();
101+ Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap<Nan::ObjectWrap>(object);
102+ trackerOwners->push_back (static_cast <nodegit::TrackerWrap*>(objectWrap));
103+ }
104+ }
105+ else if (owners->IsObject ()) {
106+ Nan::ObjectWrap *objectWrap = Nan::ObjectWrap::Unwrap<Nan::ObjectWrap>(owners);
107+ trackerOwners->push_back (static_cast <nodegit::TrackerWrap*>(objectWrap));
108+ }
109+
110+ SetTrackerWrapOwners (std::move (trackerOwners));
111+ }
112+
80113template <typename Traits>
81114v8::Local<v8::Value> NodeGitWrapper<Traits>::New(const typename Traits::cType *raw, bool selfFreeing, v8::Local<v8::Object> owner) {
82115 Nan::EscapableHandleScope scope;
0 commit comments