Re: [PATCH] Teach git-apply about '-R'
- From
Linus Torvalds <torvalds@osdl.org>
- Date
- Jul 28, 2006, 15:14 UTC
- Message-ID
- <Pine.LNX.4.64.0607280809550.4168@g5.osdl.org>
- In-Reply-To
- <Pine.LNX.4.63.0607281213250.29667@wbgn013.biozentrum.uni-wuerzburg.de>
On Fri, 28 Jul 2006, Johannes Schindelin wrote:
> > +/* a and b may not overlap! */ > +static void memswap(void *a, void *b, unsigned int len)
This is disgusting.
Especially since it's also slow as hell.
Show 9 quoted lines
> + memswap(p->new_name, p->old_name, sizeof(char *));
> + memswap(&p->new_mode, &p->old_mode, sizeof(unsigned int));
> + memswap(&p->is_new, &p->is_delete, sizeof(int));
> + memswap(&p->lines_added, &p->lines_deleted, sizeof(int));
> + memswap(p->old_sha1_prefix, p->new_sha1_prefix, 41);
> +
> + for (; frag; frag = frag->next) {
> + memswap(&frag->newpos, &frag->oldpos, sizeof(int));
> + memswap(&frag->newlines, &frag->oldlines, sizeof(int));All but one of those are register sizes, so doing a horribly ugly "memswap()"to do them is truly nasty, when you could have done
#define swap(a,b) myswap((a),(b),sizeof(a))
#define myswap(a,b,size) do { \
unsigned char mytmp[size]; \
memcpy(tmp, &a, size); \
memcpy(&a, &b, size); \
memcpy(&b, mytmp, size); \
} while (0)and it would have worked MUCH more efficiently, since any sane compiler would immediately have noticed that you're doing word-sized copies, and optimized the hell out of it.
(Untested, of course).
Linus