From ad56ac6353120681e3ef6752b87e617aeaa3abc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20David=20Ib=C3=A1=C3=B1ez?= Date: Wed, 27 Mar 2013 11:20:53 +0100 Subject: [PATCH] Fix compile with MSVC (issue #199) And use a macro to make type initialization shorter. --- include/pygit2/utils.h | 7 +++ src/diff.c | 2 +- src/index.c | 2 +- src/note.c | 2 +- src/pygit2.c | 98 +++++++++++++++--------------------------- src/reference.c | 2 +- src/tree.c | 2 +- 7 files changed, 46 insertions(+), 69 deletions(-) diff --git a/include/pygit2/utils.h b/include/pygit2/utils.h index a47c18a..3045144 100644 --- a/include/pygit2/utils.h +++ b/include/pygit2/utils.h @@ -135,4 +135,11 @@ char * py_str_to_c_str(PyObject *value, const char *encoding); goto label;\ } +/* Helpers to make type init shorter. */ +#define INIT_TYPE(type, base, new) \ + if (base != NULL) type.tp_base = base; \ + if (new != NULL) type.tp_new = new; \ + if (PyType_Ready(&type) < 0) return NULL; + + #endif diff --git a/src/diff.c b/src/diff.c index a113739..f2cb21e 100644 --- a/src/diff.c +++ b/src/diff.c @@ -197,7 +197,7 @@ DiffIter_dealloc(DiffIter *self) PyDoc_STRVAR(DiffIter__doc__, "Diff iterator object."); PyTypeObject DiffIterType = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.DiffIter", /* tp_name */ sizeof(DiffIter), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/src/index.c b/src/index.c index 30abfbb..fed0c73 100644 --- a/src/index.c +++ b/src/index.c @@ -526,7 +526,7 @@ IndexIter_iternext(IndexIter *self) PyDoc_STRVAR(IndexIter__doc__, "Index iterator."); PyTypeObject IndexIterType = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.IndexIter", /* tp_name */ sizeof(IndexIter), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/src/note.c b/src/note.c index 07df574..c887036 100644 --- a/src/note.c +++ b/src/note.c @@ -181,7 +181,7 @@ NoteIter_dealloc(NoteIter *self) PyDoc_STRVAR(NoteIter__doc__, "Note iterator object."); PyTypeObject NoteIterType = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.NoteIter", /* tp_name */ sizeof(NoteIter), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/src/pygit2.c b/src/pygit2.c index e730bf7..bbe3e4f 100644 --- a/src/pygit2.c +++ b/src/pygit2.c @@ -178,70 +178,40 @@ moduleinit(PyObject* m) GitError = PyErr_NewException("_pygit2.GitError", NULL, NULL); - RepositoryType.tp_new = PyType_GenericNew; - if (PyType_Ready(&RepositoryType) < 0) - return NULL; - - /* Do not set 'tp_new' for Git objects. To create Git objects use the - * Repository.create_XXX methods */ - if (PyType_Ready(&ObjectType) < 0) - return NULL; - CommitType.tp_base = &ObjectType; - if (PyType_Ready(&CommitType) < 0) - return NULL; - TreeType.tp_base = &ObjectType; - if (PyType_Ready(&TreeType) < 0) - return NULL; - BlobType.tp_base = &ObjectType; - if (PyType_Ready(&BlobType) < 0) - return NULL; - TagType.tp_base = &ObjectType; - if (PyType_Ready(&TagType) < 0) - return NULL; - - if (PyType_Ready(&DiffType) < 0) - return NULL; - if (PyType_Ready(&DiffIterType) < 0) - return NULL; - if (PyType_Ready(&PatchType) < 0) - return NULL; - if (PyType_Ready(&HunkType) < 0) - return NULL; - - TreeEntryType.tp_new = PyType_GenericNew; - if (PyType_Ready(&TreeEntryType) < 0) - return NULL; - IndexType.tp_new = PyType_GenericNew; - if (PyType_Ready(&IndexType) < 0) - return NULL; - IndexEntryType.tp_new = PyType_GenericNew; - if (PyType_Ready(&IndexEntryType) < 0) - return NULL; - TreeBuilderType.tp_new = PyType_GenericNew; - if (PyType_Ready(&TreeBuilderType) < 0) - return NULL; - ConfigType.tp_new = PyType_GenericNew; - if (PyType_Ready(&ConfigType) < 0) - return NULL; - WalkerType.tp_new = PyType_GenericNew; - if (PyType_Ready(&WalkerType) < 0) - return NULL; - ReferenceType.tp_new = PyType_GenericNew; - if (PyType_Ready(&ReferenceType) < 0) - return NULL; - if (PyType_Ready(&RefLogEntryType) < 0) - return NULL; - SignatureType.tp_new = PyType_GenericNew; - if (PyType_Ready(&SignatureType) < 0) - return NULL; - - if (PyType_Ready(&RemoteType) < 0) - return NULL; - - if (PyType_Ready(&NoteType) < 0) - return NULL; - if (PyType_Ready(&NoteIterType) < 0) - return NULL; + /* Repository */ + INIT_TYPE(RepositoryType, NULL, PyType_GenericNew) + /* Objects (make them with the Repository.create_XXX methods). */ + INIT_TYPE(ObjectType, NULL, NULL) + INIT_TYPE(CommitType, &ObjectType, NULL) + INIT_TYPE(SignatureType, NULL, PyType_GenericNew) + INIT_TYPE(TreeType, &ObjectType, NULL) + INIT_TYPE(TreeEntryType, NULL, PyType_GenericNew) + INIT_TYPE(TreeIterType, NULL, NULL) + INIT_TYPE(TreeBuilderType, NULL, PyType_GenericNew) + INIT_TYPE(BlobType, &ObjectType, NULL) + INIT_TYPE(TagType, &ObjectType, NULL) + /* References */ + INIT_TYPE(ReferenceType, NULL, PyType_GenericNew) + INIT_TYPE(RefLogEntryType, NULL, NULL) + INIT_TYPE(RefLogIterType, NULL, NULL) + /* Index */ + INIT_TYPE(IndexType, NULL, PyType_GenericNew) + INIT_TYPE(IndexEntryType, NULL, PyType_GenericNew) + INIT_TYPE(IndexIterType, NULL, NULL) + /* Diff */ + INIT_TYPE(DiffType, NULL, NULL) + INIT_TYPE(DiffIterType, NULL, NULL) + INIT_TYPE(PatchType, NULL, NULL) + INIT_TYPE(HunkType, NULL, NULL) + /* Log */ + INIT_TYPE(WalkerType, NULL, PyType_GenericNew) + /* Config */ + INIT_TYPE(ConfigType, NULL, PyType_GenericNew) + /* Remote */ + INIT_TYPE(RemoteType, NULL, NULL) + /* Notes */ + INIT_TYPE(NoteType, NULL, NULL) + INIT_TYPE(NoteIterType, NULL, NULL) Py_INCREF(GitError); PyModule_AddObject(m, "GitError", GitError); diff --git a/src/reference.c b/src/reference.c index 1191dcf..35dc30d 100644 --- a/src/reference.c +++ b/src/reference.c @@ -75,7 +75,7 @@ PyObject* RefLogIter_iternext(RefLogIter *self) PyDoc_STRVAR(RefLogIterType__doc__, "Internal reflog iterator object."); PyTypeObject RefLogIterType = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.RefLogIter", /* tp_name */ sizeof(RefLogIter), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/src/tree.c b/src/tree.c index e79c532..d2e5deb 100644 --- a/src/tree.c +++ b/src/tree.c @@ -446,7 +446,7 @@ TreeIter_iternext(TreeIter *self) PyDoc_STRVAR(TreeIter__doc__, "Tree iterator."); PyTypeObject TreeIterType = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_pygit2.TreeIter", /* tp_name */ sizeof(TreeIter), /* tp_basicsize */ 0, /* tp_itemsize */