D2586: cext: refactor cleanup code in bdiff()
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Sat Mar 3 15:16:04 EST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rHGb864f4536ca8: cext: refactor cleanup code in bdiff() (authored by indygreg, committed by ).
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D2586?vs=6435&id=6465
REVISION DETAIL
https://phab.mercurial-scm.org/D2586
AFFECTED FILES
mercurial/cext/bdiff.c
CHANGE DETAILS
diff --git a/mercurial/cext/bdiff.c b/mercurial/cext/bdiff.c
--- a/mercurial/cext/bdiff.c
+++ b/mercurial/cext/bdiff.c
@@ -62,11 +62,11 @@
{
char *sa, *sb, *rb, *ia, *ib;
PyObject *result = NULL;
- struct bdiff_line *al, *bl;
+ struct bdiff_line *al = NULL, *bl = NULL;
struct bdiff_hunk l, *h;
int an, bn, count;
Py_ssize_t len = 0, la, lb, li = 0, lcommon = 0, lmax;
- PyThreadState *_save;
+ PyThreadState *_save = NULL;
l.next = NULL;
@@ -89,12 +89,16 @@
an = bdiff_splitlines(sa + lcommon, la - lcommon, &al);
bn = bdiff_splitlines(sb + lcommon, lb - lcommon, &bl);
- if (!al || !bl)
- goto nomem;
+ if (!al || !bl) {
+ PyErr_NoMemory();
+ goto cleanup;
+ }
count = bdiff_diff(al, an, bl, bn, &l);
- if (count < 0)
- goto nomem;
+ if (count < 0) {
+ PyErr_NoMemory();
+ goto cleanup;
+ }
/* calculate length of output */
la = lb = 0;
@@ -110,7 +114,7 @@
result = PyBytes_FromStringAndSize(NULL, len);
if (!result)
- goto nomem;
+ goto cleanup;
/* build binary patch */
rb = PyBytes_AsString(result);
@@ -130,13 +134,19 @@
lb = h->b2;
}
-nomem:
+cleanup:
if (_save)
PyEval_RestoreThread(_save);
- free(al);
- free(bl);
- bdiff_freehunks(l.next);
- return result ? result : PyErr_NoMemory();
+ if (al) {
+ free(al);
+ }
+ if (bl) {
+ free(bl);
+ }
+ if (l.next) {
+ bdiff_freehunks(l.next);
+ }
+ return result;
}
/*
To: indygreg, #hg-reviewers, yuja
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list