It struck me as redundant and weird:

do {
  current = next;
  ...
} while ((current = next));

is identical to (or perhaps a very tiny bit slower than) the simpler:

while ((current = next)) {
  ...
}