ruby-changes:25577
From: glass <ko1@a...>
Date: Tue, 13 Nov 2012 11:12:57 +0900 (JST)
Subject: [ruby-changes:25577] glass:r37634 (trunk): * re.c (rb_memsearch_ss): performance improvement by using memmem(3) if
glass 2012-11-13 11:12:40 +0900 (Tue, 13 Nov 2012) New Revision: 37634 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37634 Log: * re.c (rb_memsearch_ss): performance improvement by using memmem(3) if possible. [ruby-dev:45530] [Feature #6311] * configure.in: check existence of memmem(3) and that it is not broken. Modified files: trunk/ChangeLog trunk/configure.in trunk/re.c Index: configure.in =================================================================== --- configure.in (revision 37633) +++ configure.in (revision 37634) @@ -2900,6 +2900,42 @@ ])]) fi +AC_CHECK_FUNC(memmem, [ + AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [ + AC_TRY_RUN([ +#include <string.h> + +int +main() +{ + char *str = "hogefugafoobar"; + char *rs = "foo"; + char *empty = ""; + char *p; + + p = memmem(str, strlen(str), rs, strlen(rs)); + if (p == str+8) { + p = memmem(str, strlen(str), empty, strlen(empty)); + if (p == str) + return 0; + else + return 1; + } + else { + return 1; + } +} + ], + rb_cv_broken_memmem=no, + rb_cv_broken_memmem=yes, + rb_cv_broken_memmem=yes) + ]) + if test "$rb_cv_broken_memmem" = no; then + AC_DEFINE(HAVE_MEMMEM, 1) + fi +]) + + CPPFLAGS="$CPPFLAGS "'$(DEFS)' test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}' if test -n "${cflags+set}"; then Index: ChangeLog =================================================================== --- ChangeLog (revision 37633) +++ ChangeLog (revision 37634) @@ -1,3 +1,10 @@ +Tue Nov 13 11:03:47 2012 Masaki Matsushita <glass.saga@g...> + + * re.c (rb_memsearch_ss): performance improvement by using memmem(3) if + possible. [ruby-dev:45530] [Feature #6311] + + * configure.in: check existence of memmem(3) and that it is not broken. + Tue Nov 13 06:50:02 2012 Aaron Patterson <aaron@t...> * probes.d: add DTrace probe declarations. [ruby-core:27448] Index: re.c =================================================================== --- re.c (revision 37633) +++ re.c (revision 37634) @@ -97,9 +97,21 @@ return memcmp(p1, p2, len); } +#ifdef HAVE_MEMMEM static inline long rb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long n) { + const unsigned char *y; + + if (y = memmem(ys, n, xs, m)) + return y - ys; + else + return -1; +} +#else +static inline long +rb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long n) +{ const unsigned char *x = xs, *xe = xs + m; const unsigned char *y = ys, *ye = ys + n; #ifndef VALUE_MAX @@ -132,6 +144,7 @@ } return y - ys - m; } +#endif static inline long rb_memsearch_qs(const unsigned char *xs, long m, const unsigned char *ys, long n) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/