xdiff/xprepare: refactor abort cleanups
Group free()'s that are called when a malloc() fails in xdl_prepare_ctx(), making for more readable code. Also add a free() on ha, in case future git hackers add allocs after the ha malloc. Signed-off-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Tay Ray Chuan committed
Jul 7, 2011 at 12:23 UTC
159607a8f1ad16c0a04e0f17d5f8a35299696bc6
1 file changed
+32
-59
xdiff/xprepare.c
+32
-59
@@ -143,24 +143,21 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
143
char *rchg;
144
long *rindex;
145
146
- if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0) {
146
+ ha = NULL;
147
+ rindex = NULL;
148
+ rchg = NULL;
149
+ rhash = NULL;
150
+ recs = NULL;
151
148
- return -1;
149
- }
150
- if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *)))) {
151
-
152
- xdl_cha_free(&xdf->rcha);
153
- return -1;
154
- }
152
+ if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0)
153
+ goto abort;
154
+ if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
155
+ goto abort;
156
157
hbits = xdl_hashbits((unsigned int) narec);
158
hsize = 1 << hbits;
158
- if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *)))) {
159
-
160
- xdl_free(recs);
161
- xdl_cha_free(&xdf->rcha);
162
- return -1;
163
- }
159
+ if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
160
+ goto abort;
161
memset(rhash, 0, hsize * sizeof(xrecord_t *));
162
163
nrec = 0;
@@ -175,63 +172,30 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
172
hav = xdl_hash_record(&cur, top, xpp->flags);
173
if (nrec >= narec) {
174
narec *= 2;
178
- if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *)))) {
179
-
180
- xdl_free(rhash);
181
- xdl_free(recs);
182
- xdl_cha_free(&xdf->rcha);
183
- return -1;
184
- }
175
+ if (!(rrecs = (xrecord_t **) xdl_realloc(recs, narec * sizeof(xrecord_t *))))
176
+ goto abort;
177
recs = rrecs;
178
}
187
- if (!(crec = xdl_cha_alloc(&xdf->rcha))) {
188
-
189
- xdl_free(rhash);
190
- xdl_free(recs);
191
- xdl_cha_free(&xdf->rcha);
192
- return -1;
193
- }
179
+ if (!(crec = xdl_cha_alloc(&xdf->rcha)))
180
+ goto abort;
181
crec->ptr = prev;
182
crec->size = (long) (cur - prev);
183
crec->ha = hav;
184
recs[nrec++] = crec;
185
199
- if (xdl_classify_record(cf, rhash, hbits, crec) < 0) {
200
-
201
- xdl_free(rhash);
202
- xdl_free(recs);
203
- xdl_cha_free(&xdf->rcha);
204
- return -1;
205
- }
186
+ if (xdl_classify_record(cf, rhash, hbits, crec) < 0)
187
+ goto abort;
188
}
189
}
190
209
- if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char)))) {
210
-
211
- xdl_free(rhash);
212
- xdl_free(recs);
213
- xdl_cha_free(&xdf->rcha);
214
- return -1;
215
- }
191
+ if (!(rchg = (char *) xdl_malloc((nrec + 2) * sizeof(char))))
192
+ goto abort;
193
memset(rchg, 0, (nrec + 2) * sizeof(char));
194
218
- if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long)))) {
219
-
220
- xdl_free(rchg);
221
- xdl_free(rhash);
222
- xdl_free(recs);
223
- xdl_cha_free(&xdf->rcha);
224
- return -1;
225
- }
226
- if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long)))) {
227
-
228
- xdl_free(rindex);
229
- xdl_free(rchg);
230
- xdl_free(rhash);
231
- xdl_free(recs);
232
- xdl_cha_free(&xdf->rcha);
233
- return -1;
234
- }
195
+ if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long))))
196
+ goto abort;
197
+ if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long))))
198
+ goto abort;
199
200
xdf->nrec = nrec;
201
xdf->recs = recs;
@@ -245,6 +209,15 @@ static int xdl_prepare_ctx(mmfile_t *mf, long narec, xpparam_t const *xpp,
209
xdf->dend = nrec - 1;
210
211
return 0;
212
+
213
+abort:
214
+ xdl_free(ha);
215
+ xdl_free(rindex);
216
+ xdl_free(rchg);
217
+ xdl_free(rhash);
218
+ xdl_free(recs);
219
+ xdl_cha_free(&xdf->rcha);
220
+ return -1;
221
}
222
223