On 05/12/2010 06:30 PM, [email protected] wrote:
Author: NotFound
Date: Thu May 13 01:30:49 2010
New Revision: 46564
URL: https://trac.parrot.org/parrot/changeset/46564

Log:
simplify mixed_cs_index

Modified:
    trunk/src/string/charset/ascii.c

Modified: trunk/src/string/charset/ascii.c
==============================================================================
--- trunk/src/string/charset/ascii.c    Thu May 13 01:26:03 2010        (r46563)
+++ trunk/src/string/charset/ascii.c    Thu May 13 01:30:49 2010        (r46564)
@@ -531,43 +531,32 @@
      UINTVAL offs)
  {
      ASSERT_ARGS(mixed_cs_index)
+
      String_iter src_iter, search_iter;
-    UINTVAL len, next_pos;
-    INTVAL found_at;
+    const UINTVAL maxpos = src->strlen - search->strlen + 1;
+    const UINTVAL cfirst = Parrot_str_indexed(interp, search, 0);

      ENCODING_ITER_INIT(interp, src,&src_iter);
      src_iter.set_position(interp,&src_iter, offs);
      ENCODING_ITER_INIT(interp, search,&search_iter);
-    len = search->strlen;
-
-    found_at = -1;
-    next_pos = offs;

-    for (; len&&  offs<  src->strlen ;) {
-        const UINTVAL c1 = src_iter.get_and_advance(interp,&src_iter);
-        const UINTVAL c2 = search_iter.get_and_advance(interp,&search_iter);
-
-        if (c1 == c2) {
-            --len;
-            if (found_at == -1)
-                found_at = offs;
-            ++offs;
-        }
-        else {
-            len = search->strlen;
-            ++offs;
-            ++next_pos;
-            if (offs != next_pos) {
-                src_iter.set_position(interp,&src_iter, next_pos);
-                offs = next_pos;
+    while (src_iter.charpos<  maxpos) {
+        if (cfirst == src_iter.get_and_advance(interp,&src_iter)) {
+            const INTVAL next_pos = src_iter.charpos;
+            const INTVAL next_byte = src_iter.bytepos;
+            UINTVAL len;
+            search_iter.set_position(interp,&search_iter, 1);
+            for (len = search->strlen - 1; len; --len) {
+                if ((src_iter.get_and_advance(interp,&src_iter)) !=
+                        (search_iter.get_and_advance(interp,&search_iter)))
+                    break;
              }
-
-            found_at = -1;
-            search_iter.set_position(interp,&search_iter, 0);
+            if (len == 0)
+                return next_pos - 1;
+            src_iter.charpos = next_pos;
+            src_iter.bytepos = next_byte;
          }
      }
-    if (len == 0)
-        return found_at;
      return -1;
  }

_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-commits


This change causes a segfault when running parrot-nqp on an empty file (empty.pm) as follows:
touch empty.pm
./parrot-nqp --target=pir -o empty.pir empty.pm
Curiously the segfault only happens when the options are in that order. Using "-o empty.pir --target=pir" works fine. If it looks like this commit is exposing something broken, a tt is in order.
I reverted it in r46573.

Christoph
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to