git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
Cc: Jeff King <peff@peff.net>, Johannes Sixt <j.sixt@viscovery.net>,
	git@vger.kernel.org
Subject: Re: [PATCH 8/4] match-trees: drop "x = x" initializations
Date: Mon, 25 Mar 2013 09:10:48 -0700	[thread overview]
Message-ID: <7vzjxrzchj.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <514F8244.8070702@lsrfire.ath.cx> (=?utf-8?Q?=22Ren=C3=A9?= Scharfe"'s message of "Sun, 24 Mar 2013 23:46:28 +0100")

René Scharfe <rene.scharfe@lsrfire.ath.cx> writes:

> Am 24.03.2013 05:55, schrieb Junio C Hamano:
>> So I like your change for readability, but for GCC 4.4.5 we still
>> need the unnecessary initialization.
>
> Hrm, perhaps we can make it even simpler for the compiler.

And the result is even simpler for human readers, I'd have to say.

> I'm a bit uneasy about this one because we lack proper tests for
> this code and I don't know how to write ones off the bat.

This looks pretty much a straight-forward equivalent rewrite from
your earlier one, which was also an obvious equivalent to the
original, at least to me.  The first four lines in the original were
made into two tree_entry() calls (what a useful helper we haven't
been using!) and that allows us to lose explicit update_tree_entry()
calls.



>  match-trees.c | 68 ++++++++++++++++++++++++-----------------------------------
>  1 file changed, 28 insertions(+), 40 deletions(-)
>
> diff --git a/match-trees.c b/match-trees.c
> index 26f7ed1..2bb734d 100644
> --- a/match-trees.c
> +++ b/match-trees.c
> @@ -47,6 +47,13 @@ static int score_matches(unsigned mode1, unsigned mode2, const char *path)
>  	return score;
>  }
>  
> +static int base_name_entries_compare(const struct name_entry *a,
> +				     const struct name_entry *b)
> +{
> +	return base_name_compare(a->path, tree_entry_len(a), a->mode,
> +				 b->path, tree_entry_len(b), b->mode);
> +}
> +
>  /*
>   * Inspect two trees, and give a score that tells how similar they are.
>   */
> @@ -71,54 +78,35 @@ static int score_trees(const unsigned char *hash1, const unsigned char *hash2)
>  	if (type != OBJ_TREE)
>  		die("%s is not a tree", sha1_to_hex(hash2));
>  	init_tree_desc(&two, two_buf, size);
> -	while (one.size | two.size) {
> -		const unsigned char *elem1 = elem1;
> -		const unsigned char *elem2 = elem2;
> -		const char *path1 = path1;
> -		const char *path2 = path2;
> -		unsigned mode1 = mode1;
> -		unsigned mode2 = mode2;
> +	for (;;) {
> +		struct name_entry e1, e2;
> +		int got_entry_from_one = tree_entry(&one, &e1);
> +		int got_entry_from_two = tree_entry(&two, &e2);
>  		int cmp;
>  
> -		if (one.size)
> -			elem1 = tree_entry_extract(&one, &path1, &mode1);
> -		if (two.size)
> -			elem2 = tree_entry_extract(&two, &path2, &mode2);
> -
> -		if (!one.size) {
> -			/* two has more entries */
> -			score += score_missing(mode2, path2);
> -			update_tree_entry(&two);
> -			continue;
> -		}
> -		if (!two.size) {
> +		if (got_entry_from_one && got_entry_from_two)
> +			cmp = base_name_entries_compare(&e1, &e2);
> +		else if (got_entry_from_one)
>  			/* two lacks this entry */
> -			score += score_missing(mode1, path1);
> -			update_tree_entry(&one);
> -			continue;
> -		}
> -		cmp = base_name_compare(path1, strlen(path1), mode1,
> -					path2, strlen(path2), mode2);
> -		if (cmp < 0) {
> +			cmp = -1;
> +		else if (got_entry_from_two)
> +			/* two has more entries */
> +			cmp = 1;
> +		else
> +			break;
> +
> +		if (cmp < 0)
>  			/* path1 does not appear in two */
> -			score += score_missing(mode1, path1);
> -			update_tree_entry(&one);
> -			continue;
> -		}
> -		else if (cmp > 0) {
> +			score += score_missing(e1.mode, e1.path);
> +		else if (cmp > 0)
>  			/* path2 does not appear in one */
> -			score += score_missing(mode2, path2);
> -			update_tree_entry(&two);
> -			continue;
> -		}
> -		else if (hashcmp(elem1, elem2))
> +			score += score_missing(e2.mode, e2.path);
> +		else if (hashcmp(e1.sha1, e2.sha1))
>  			/* they are different */
> -			score += score_differs(mode1, mode2, path1);
> +			score += score_differs(e1.mode, e2.mode, e1.path);
>  		else
>  			/* same subtree or blob */
> -			score += score_matches(mode1, mode2, path1);
> -		update_tree_entry(&one);
> -		update_tree_entry(&two);
> +			score += score_matches(e1.mode, e2.mode, e1.path);
>  	}
>  	free(one_buf);
>  	free(two_buf);

  reply	other threads:[~2013-03-25 16:11 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-21 11:03 [PATCH 0/4] drop some "int x = x" hacks to silence gcc warnings Jeff King
2013-03-21 11:05 ` [PATCH 1/4] wt-status: fix possible use of uninitialized variable Jeff King
2013-03-21 19:49   ` Jonathan Nieder
2013-03-21 19:55     ` Junio C Hamano
2013-03-21 19:58       ` Jonathan Nieder
2013-03-22 16:15     ` Jeff King
2013-03-21 11:08 ` [PATCH 2/4] fast-import: use pointer-to-pointer to keep list tail Jeff King
2013-03-21 20:43   ` Jonathan Nieder
2013-03-21 11:10 ` [PATCH 3/4] drop some obsolete "x = x" compiler warning hacks Jeff King
2013-03-21 15:16   ` Erik Faye-Lund
2013-03-21 20:47   ` Jonathan Nieder
2013-03-24  7:17     ` Torsten Bögershausen
2013-03-21 11:13 ` [PATCH 4/4] transport: drop "int cmp = cmp" hack Jeff King
2013-03-21 20:59   ` Jonathan Nieder
2013-03-24  4:00   ` Junio C Hamano
2013-03-24  9:32     ` Jeff King
2013-03-24 14:54       ` Torsten Bögershausen
2013-03-25 19:50       ` Junio C Hamano
2013-03-25 21:06         ` Jeff King
2013-03-25 21:55           ` Junio C Hamano
2013-03-21 11:45 ` [PATCH 0/4] drop some "int x = x" hacks to silence gcc warnings Johannes Sixt
2013-03-21 11:55   ` Jeff King
2013-03-21 14:58     ` Junio C Hamano
2013-03-21 15:19       ` Junio C Hamano
2013-03-21 15:44         ` Jeff King
2013-03-21 15:44           ` [PATCH 5/4] fast-import: clarify "inline" logic in file_change_m Jeff King
2013-03-21 15:45           ` [PATCH 6/4] run-command: always set failed_errno in start_command Jeff King
2013-03-21 21:02           ` [PATCH 0/4] drop some "int x = x" hacks to silence gcc warnings Jonathan Nieder
2013-03-22 16:18           ` Jeff King
2013-03-22 16:19             ` [PATCH 7/4] submodule: clarify logic in show_submodule_summary Jeff King
2013-03-22 21:10               ` Junio C Hamano
2013-03-22 16:21             ` [PATCH 8/4] match-trees: drop "x = x" initializations Jeff King
2013-03-22 21:26               ` Junio C Hamano
2013-03-22 21:33                 ` Junio C Hamano
2013-03-22 21:36                   ` Jeff King
2013-03-23 18:57               ` René Scharfe
2013-03-24  4:55                 ` Junio C Hamano
2013-03-24 10:01                   ` Jeff King
2013-03-24 22:46                   ` René Scharfe
2013-03-25 16:10                     ` Junio C Hamano [this message]
2013-03-21 13:44   ` [PATCH 0/4] drop some "int x = x" hacks to silence gcc warnings Joachim Schmitz
2013-03-21 13:56     ` Joachim Schmitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vzjxrzchj.fsf@alter.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=j.sixt@viscovery.net \
    --cc=peff@peff.net \
    --cc=rene.scharfe@lsrfire.ath.cx \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).