xdiff: delete local variables and initialize/free xdfile_t directly

These local variables are essentially a hand-rolled additional implementation of xdl_free_ctx() inlined into xdl_prepare_ctx(). Modify the code to use the existing xdl_free_ctx() function so there aren't two ways to free such variables. Signed-off-by: Ezekiel Newren <ezekielnewren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ezekiel Newren committed Sep 26, 2025 at 22:41 UTC d1c028bdf75b9bcd380f85f74a34edcbaa060fee
1 file changed +30 -48
xdiff/xprepare.c
+30 -48
@@ -134,99 +134,81 @@ static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t
134 }
135
136
137 +static void xdl_free_ctx(xdfile_t *xdf)
138 +{
139 + xdl_free(xdf->rhash);
140 + xdl_free(xdf->rindex);
141 + xdl_free(xdf->rchg - 1);
142 + xdl_free(xdf->ha);
143 + xdl_free(xdf->recs);
144 + xdl_cha_free(&xdf->rcha);
145 +}
146 +
147 +
148 static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_t const *xpp,
149 xdlclassifier_t *cf, xdfile_t *xdf) {
139 - unsigned int hbits;
140 - long nrec, hsize, bsize;
150 + long bsize;
151 unsigned long hav;
152 char const *blk, *cur, *top, *prev;
153 xrecord_t *crec;
144 - xrecord_t **recs;
145 - xrecord_t **rhash;
146 - unsigned long *ha;
147 - char *rchg;
148 - long *rindex;
154
150 - ha = NULL;
151 - rindex = NULL;
152 - rchg = NULL;
153 - rhash = NULL;
154 - recs = NULL;
155 + xdf->ha = NULL;
156 + xdf->rindex = NULL;
157 + xdf->rchg = NULL;
158 + xdf->rhash = NULL;
159 + xdf->recs = NULL;
160
161 if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0)
162 goto abort;
158 - if (!XDL_ALLOC_ARRAY(recs, narec))
163 + if (!XDL_ALLOC_ARRAY(xdf->recs, narec))
164 goto abort;
165
161 - hbits = xdl_hashbits((unsigned int) narec);
162 - hsize = 1 << hbits;
163 - if (!XDL_CALLOC_ARRAY(rhash, hsize))
166 + xdf->hbits = xdl_hashbits((unsigned int) narec);
167 + if (!XDL_CALLOC_ARRAY(xdf->rhash, 1 << xdf->hbits))
168 goto abort;
169
166 - nrec = 0;
170 + xdf->nrec = 0;
171 if ((cur = blk = xdl_mmfile_first(mf, &bsize))) {
172 for (top = blk + bsize; cur < top; ) {
173 prev = cur;
174 hav = xdl_hash_record(&cur, top, xpp->flags);
171 - if (XDL_ALLOC_GROW(recs, nrec + 1, narec))
175 + if (XDL_ALLOC_GROW(xdf->recs, xdf->nrec + 1, narec))
176 goto abort;
177 if (!(crec = xdl_cha_alloc(&xdf->rcha)))
178 goto abort;
179 crec->ptr = prev;
180 crec->size = (long) (cur - prev);
181 crec->ha = hav;
178 - recs[nrec++] = crec;
179 - if (xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
182 + xdf->recs[xdf->nrec++] = crec;
183 + if (xdl_classify_record(pass, cf, xdf->rhash, xdf->hbits, crec) < 0)
184 goto abort;
185 }
186 }
187
184 - if (!XDL_CALLOC_ARRAY(rchg, nrec + 2))
188 + if (!XDL_CALLOC_ARRAY(xdf->rchg, xdf->nrec + 2))
189 goto abort;
190
191 if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
192 (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)) {
189 - if (!XDL_ALLOC_ARRAY(rindex, nrec + 1))
193 + if (!XDL_ALLOC_ARRAY(xdf->rindex, xdf->nrec + 1))
194 goto abort;
191 - if (!XDL_ALLOC_ARRAY(ha, nrec + 1))
195 + if (!XDL_ALLOC_ARRAY(xdf->ha, xdf->nrec + 1))
196 goto abort;
197 }
198
195 - xdf->nrec = nrec;
196 - xdf->recs = recs;
197 - xdf->hbits = hbits;
198 - xdf->rhash = rhash;
199 - xdf->rchg = rchg + 1;
200 - xdf->rindex = rindex;
199 + xdf->rchg += 1;
200 xdf->nreff = 0;
202 - xdf->ha = ha;
201 xdf->dstart = 0;
204 - xdf->dend = nrec - 1;
202 + xdf->dend = xdf->nrec - 1;
203
204 return 0;
205
206 abort:
209 - xdl_free(ha);
210 - xdl_free(rindex);
211 - xdl_free(rchg);
212 - xdl_free(rhash);
213 - xdl_free(recs);
214 - xdl_cha_free(&xdf->rcha);
207 + xdl_free_ctx(xdf);
208 return -1;
209 }
210
211
219 -static void xdl_free_ctx(xdfile_t *xdf) {
220 -
221 - xdl_free(xdf->rhash);
222 - xdl_free(xdf->rindex);
223 - xdl_free(xdf->rchg - 1);
224 - xdl_free(xdf->ha);
225 - xdl_free(xdf->recs);
226 - xdl_cha_free(&xdf->rcha);
227 -}
228 -
229 -
212 void xdl_free_env(xdfenv_t *xe) {
213
214 xdl_free_ctx(&xe->xdf2);