Rewrite collapsing parser while loop (mere op-level golf)
Peter Rabbitson [Tue, 3 Mar 2015 23:06:47 +0000 (00:06 +0100)]
lib/DBIx/Class/ResultSource/RowParser/Util.pm
t/resultset/rowparser_internals.t

index 702240f..cb760ff 100644 (file)
@@ -181,9 +181,25 @@ sub assemble_collapsing_parser {
   # array, since the collapsed prefetch is smaller by definition.
   # At the end we cut the leftovers away and move on.
   while ($cur_row_data = (
-    ( $rows_pos >= 0 and $_[0][$rows_pos++] )
+    (
+      $rows_pos >= 0
+        and
+      (
+        $_[0][$rows_pos++]
+          or
+        # It may be tempting to drop the -1 and undef $rows_pos instead
+        # thus saving the >= comparison above as well
+        # However NULL-handlers and underdefined root markers both use
+        # $rows_pos as a last-resort-uniqueness marker (it either is
+        # monotonically increasing while we parse ->all, or is set at
+        # a steady -1 when we are dealing with a single root node). For
+        # the time being the complication of changing all callsites seems
+        # overkill, for what is going to be a very modest saving of ops
+        ( ($rows_pos = -1), undef )
+      )
+    )
       or
-    ( $_[1] and $rows_pos = -1 and $_[1]->() )
+    ( $_[1] and $_[1]->() )
   ) ) {
 
     # the undef checks may or may not be there
index 69b2e64..646ead0 100644 (file)
@@ -252,9 +252,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{0,1,3,4,5} = (
@@ -314,9 +322,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{0, 1, 3, 4, 5} = @{$cur_row_data}[0, 1, 3, 4, 5];
@@ -433,9 +449,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{0, 1, 5, 6, 8, 10} = (
@@ -502,9 +526,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{( 0, 1, 5, 6, 8, 10 )} = @{$cur_row_data}[( 0, 1, 5, 6, 8, 10 )];
@@ -618,9 +650,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{( 0, 2, 3, 4, 8 )} = (
@@ -690,9 +730,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids);
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
-        ||
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
+        or
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       # do not care about nullability here
@@ -763,9 +811,17 @@ is_same_src (
     my ($result_pos, @collapse_idx, $cur_row_data, %cur_row_ids );
 
     while ($cur_row_data = (
-      ( $rows_pos >= 0 and $_[0][$rows_pos++] )
+      (
+        $rows_pos >= 0
+          and
+        (
+          $_[0][$rows_pos++]
+            or
+          ( ($rows_pos = -1), undef )
+        )
+      )
         or
-      ( $_[1] and $rows_pos = -1 and $_[1]->() )
+      ( $_[1] and $_[1]->() )
     ) ) {
 
       @cur_row_ids{0,1} = @{$cur_row_data}[0,1];