Browse Source

tree-diff: don't assume compare_tree_entry() returns -1,0,1

It does, but we'll be reworking it in the next patch after it won't, and
besides it is better to stick to standard
strcmp/memcmp/base_name_compare/etc... convention, where comparison
function returns <0, =0, >0

Regarding performance, comparing for <0, =0, >0 should be a little bit
faster, than switch, because it is just 1 test-without-immediate
instruction and then up to 3 conditional branches, and in switch you
have up to 3 tests with immediate and up to 3 conditional branches.

No worry, that update_tree_entry(t2) is duplicated for =0 and >0 - it
will be good after we'll be adding support for multiparent walker and
will stay that way.

=0 case goes first, because it happens more often in real diffs - i.e.
paths are the same.

Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Kirill Smelkov 11 years ago committed by Junio C Hamano
parent
commit
5dfb2bbd8d
  1. 22
      tree-diff.c

22
tree-diff.c

@ -178,18 +178,24 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, @@ -178,18 +178,24 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
update_tree_entry(t1);
continue;
}
switch (compare_tree_entry(t1, t2, &base, opt)) {
case -1:

cmp = compare_tree_entry(t1, t2, &base, opt);

/* t1 = t2 */
if (cmp == 0) {
update_tree_entry(t1);
continue;
case 0:
update_tree_entry(t2);
}

/* t1 < t2 */
else if (cmp < 0) {
update_tree_entry(t1);
/* Fallthrough */
case 1:
}

/* t1 > t2 */
else {
update_tree_entry(t2);
continue;
}
die("git diff-tree: internal error");
}

strbuf_release(&base);

Loading…
Cancel
Save