[Mono-list] little patch for string-icalls.c
Dietmar Maurer
dietmar@ximian.com
20 Apr 2002 08:20:23 +0200
please commit to CVS.
On Fri, 2002-04-19 at 19:37, Gonzalo Paniagua Javier wrote:
> Here it is.
>
> There are a couple of fixes and changes to
> mono_string_cmp_char() that makes it be faster by saving some
> function calls.
>
> ----
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/public/mono/mono/metadata/ChangeLog,v
> retrieving revision 1.301
> diff -u -r1.301 ChangeLog
> --- ChangeLog 19 Apr 2002 12:33:57 -0000 1.301
> +++ ChangeLog 19 Apr 2002 13:42:39 -0000
> @@ -1,3 +1,9 @@
> +2002-04-19 Gonzalo Paniagua Javier <gonzalo@ximian.com>
> +
> + * string-icalls.c: fix IndexOf and LastIndexOf. Now
> + InternalCompareStr don't call twice mono_string_cmp_char for the last
> + character. Improved performance in mono_string_cmp_char.
> +
> 2002-04-19 Dan Lewis <dihlewis@yahoo.co.uk>
>
> * object.h, object.c: changed array format so that szarrays do not
> Index: string-icalls.c
> ===================================================================
> RCS file: /cvs/public/mono/mono/metadata/string-icalls.c,v
> retrieving revision 1.2
> diff -u -r1.2 string-icalls.c
> --- string-icalls.c 18 Apr 2002 09:43:58 -0000 1.2
> +++ string-icalls.c 19 Apr 2002 13:42:39 -0000
> @@ -283,6 +283,9 @@
> cmpstr = mono_string_chars(value);
>
> for (pos = sindex; pos != count + sindex; pos++) {
> + if (pos + lencmpstr > count + sindex)
> + return -1;
> +
> if (0 == memcmp(src + pos, cmpstr, lencmpstr * sizeof(gunichar2)))
> return pos;
> }
> @@ -338,7 +341,7 @@
> src = mono_string_chars(me);
> cmpstr = mono_string_chars(value);
>
> - for (pos = sindex; pos > sindex - count; pos -= lencmpstr) {
> + for (pos = sindex; pos > sindex - count; pos--) {
> if (0 == memcmp(src + pos, cmpstr, lencmpstr * sizeof(gunichar2)))
> return pos;
> }
> @@ -486,6 +489,7 @@
> */
> gint32 lenstr1;
> gint32 lenstr2;
> + gint32 charcmp;
> gunichar2 *str1;
> gunichar2 *str2;
>
> @@ -509,8 +513,9 @@
> if (i1 + pos >= lenstr1 || i2 + pos >= lenstr2)
> break;
>
> - if (0 != mono_string_cmp_char(str1[i1 + pos], str2[i2 + pos], mode))
> - break;
> + charcmp = mono_string_cmp_char(str1[i1 + pos], str2[i2 + pos], mode);
> + if (charcmp != 0)
> + return charcmp;
> }
>
> /* the lesser wins, so if we have looped until length we just need to check the last char */
> @@ -557,20 +562,24 @@
> mono_string_cmp_char (gunichar2 c1, gunichar2 c2, gint16 mode)
> {
> gint32 result;
> + GUnicodeType c1type, c2type;
>
> + c1type = g_unichar_type (c1);
> + c2type = g_unichar_type (c2);
> switch (mode) {
> case 0:
> /* TODO: compare with culture info */
> - if (g_unichar_isupper(c1) && g_unichar_islower(c2))
> + if (c1type == G_UNICODE_UPPERCASE_LETTER && c2type == G_UNICODE_LOWERCASE_LETTER)
> return 1;
>
> - if (g_unichar_islower(c1) && g_unichar_isupper(c2))
> + if (c1type == G_UNICODE_LOWERCASE_LETTER && c2type == G_UNICODE_UPPERCASE_LETTER)
> return -1;
>
> result = (gint32) c1 - c2;
> break;
> case 1:
> - result = (gint32) g_unichar_tolower(c1) - g_unichar_tolower(c2);
> + result = (gint32) (c1type != G_UNICODE_LOWERCASE_LETTER ? g_unichar_tolower(c1) : c1) -
> + (c2type != G_UNICODE_LOWERCASE_LETTER ? g_unichar_tolower(c2) : c2);
> break;
> /* fix: compare ordinal */
> case 2:
> @@ -578,11 +587,5 @@
> break;
> }
>
> - if (result < 0)
> - return -1;
> -
> - if (result > 0)
> - return 1;
> -
> - return 0;
> + return ((result < 0) ? -1 : (result > 0) ? 1 : 0);
> }