> (gdb) p xe->xdf1.ha[0]
> $28 = 1
> (gdb) p xe->xdf2.ha[0]
> $29 = 1
>
> ok, so the lines are tracked as having the same hash index in the 
> preprocessed ha lists too.
>
> so i dunno why this is happening, and i'm wondering if it could be because of 
> some check in the diff implementation that skips setting rchg if it already 
> is. this codebase has had many people working on it over the years and 
> different approaches to things have accumulated.
>
> but now i get to step into the git xdiff code and see !!

before i step into the git xdiff code i did notice this important-looking thing:

859                     /*
860                      * Allocate and setup K vectors to be used by the 
differential
861                      * algorithm.
862                      *
863                      * One is to store the forward path and one to store 
the backward path.
864                      */
865                     ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
866                 kvd.resize(2 * (size_t)ndiags + 2);

Line 866 (with indentation tab/space mismatches) resizes an array. The first 
time this is run, it'll be full of zeros, but after that it won't be! Lemme fix 
that.

member variable:     std::vector<long> kvd; /* stores path vectors in default 
algorithm */

$ git diff diff_xdiff.cpp
diff --git a/src/diff_xdiff.cpp b/src/diff_xdiff.cpp
index 6fd8cba..94db2fa 100644
--- a/src/diff_xdiff.cpp
+++ b/src/diff_xdiff.cpp
@@ -863,7 +863,7 @@ private:
                 * One is to store the forward path and one to store the 
backward path.
                 */
                ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
-            kvd.resize(2 * (size_t)ndiags + 2);
+            kvd.assign(2 * (size_t)ndiags + 2, 0);
                kvdf = kvd.data();
                kvdb = kvdf + ndiags;
                kvdf += xe->xdf2.nreff + 1;


didn't fix it!

Reply via email to