
(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!