#ifndef NODEGIT_WRAPPER_H #define NODEGIT_WRAPPER_H #include #include // the Traits template parameter supplies: // typename cppClass - the C++ type of the NodeGit wrapper (e.g. GitRepository) // typename cType - the C type of the libgit2 object being wrapped (e.g. git_repository) // // static const bool isDuplicable // static void duplicate(cType **dest, cType *src) - duplicates src using dupFunction or cpyFunction // // static const bool isFreeable // static void free(cType *raw) - frees the object using freeFunctionName template class NodeGitWrapper : public Nan::ObjectWrap { public: // replicate Traits typedefs for ease of use typedef typename Traits::cType cType; typedef typename Traits::cppClass cppClass; // whether raw should be freed on destruction // TODO: this should be protected but we have a few use cases that change this to // false from the outside. I suspect it gets turned to false to avoid // double-free problems in cases like when we pass cred objects to libgit2 // and it frees them. We should probably be NULLing raw in that case // (and through a method) instead of changing selfFreeing, but that's // a separate issue. bool selfFreeing; protected: cType *raw; // owner of the object, in the memory management sense. only populated // when using ownedByThis, and the type doesn't have a dupFunction // CopyablePersistentTraits are used to get the reset-on-destruct behavior. Nan::Persistent > owner; static Nan::Persistent constructor_template; // diagnostic count of self-freeing object instances static int SelfFreeingInstanceCount; // diagnostic count of constructed non-self-freeing object instances static int NonSelfFreeingConstructedCount; static void InitializeTemplate(v8::Local &tpl); NodeGitWrapper(cType *raw, bool selfFreeing, v8::Local owner); NodeGitWrapper(const char *error); // calls ThrowError ~NodeGitWrapper(); static NAN_METHOD(JSNewFunction); static NAN_METHOD(GetSelfFreeingInstanceCount); static NAN_METHOD(GetNonSelfFreeingConstructedCount); public: static v8::Local New(const cType *raw, bool selfFreeing, v8::Local owner = v8::Local()); cType *GetValue(); void ClearValue(); }; #endif