Changeset 21926 for src/perl6

Show
Ignore:
Timestamp:
08/17/08 22:51:03 (3 months ago)
Author:
lwall
Message:

[gimme5] tweak a couple overzealoous optimizations

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/perl6/gimme5

    r21901 r21926  
    16631663        $text =~ s/\.\./-/g; 
    16641664        $text =~ s/^-\[/[^/; 
     1665        $text = "(?<=$text)" if $REV; 
    16651666        if ($$self{i}) { 
    1666             $self->bind("\$C->_PATTERN$REV(qr/\\G(?i:$text)/)"); 
     1667            $self->bind("\$C->_PATTERN(qr/\\G(?i:$text)/)"); 
    16671668        } 
    16681669        else { 
    1669             $self->bind("\$C->_PATTERN$REV(qr/\\G$text/)"); 
     1670            $self->bind("\$C->_PATTERN(qr/\\G$text/)"); 
    16701671        } 
    16711672    } 
     
    21062107            my $atom = $$self{atom}->walk(@_); 
    21072108            if ($q) { 
    2108                 if ($atom =~ s{ ^ \$C->_PATTERN\(qr/\\G(.*?)/\) $ }{(?:$1)}sx) { 
     2109                if ($atom =~ m{ ^ \$C->_PATTERN\(qr/\\G(.*?)/\) $ }sx ) { 
     2110                    my $a = "(?:$1)"; 
    21092111                    my ($qfer,$how,$rest) = @{$$self{quant}}; 
    21102112                    my $h = $how eq '!' ? '' : 
    21112113                            $how eq '?' ? '?' : 
    21122114                                          '+'; 
    2113                     if ($qfer eq '**') { 
     2115                    if ($how eq '?' or $REV) { 
     2116                        ; 
     2117                    } 
     2118                    elsif ($qfer eq '**') { 
    21142119                        $h = $how eq '!' ? 'g' : 
    21152120                             $how eq '?' ? 'f' : 
     
    21312136                        } 
    21322137                        $quant = "\$C->$rep$h( $rest, "; 
    2133                         $result = $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 
     2138                        return $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 
    21342139                    } 
    21352140                    else { 
    21362141                        $PURE = 0; 
    2137                         $result = "\$C->_PATTERN\(qr/\\G($atom$qfer$h)/\)"; 
     2142                        return "\$C->_PATTERN\(qr/\\G($a$qfer$h)/\)"; 
    21382143                    } 
    21392144                } 
    2140                 else { 
    2141                     my ($qfer,$how,$rest) = @{$$self{quant}}; 
    2142                     my $h = $how eq '!' ? 'g' : 
    2143                             $how eq '?' ? 'f' : 
    2144                                           'r'; 
    2145                     if ($qfer eq '*') { 
    2146                         $PURE = 0; 
    2147                         $quant = "\$C->_STAR$h$REV("; 
    2148                     } 
    2149                     elsif ($qfer eq '+') { 
    2150                         $quant = "\$C->_PLUS$h$REV("; 
    2151                     } 
    2152                     elsif ($qfer eq '?') { 
    2153                         $PURE = 0; 
    2154                         $quant = "\$C->_OPT$h$REV("; 
    2155                     } 
    2156                     elsif ($qfer eq '**') { 
    2157                         if (ref $rest) { 
    2158                             if (ref $rest eq "RE_block") { 
    2159                                 $PURE = 0; 
    2160                                 $rep = "_REPINDIRECT$REV"; 
    2161                                 $rest = $rest->walk(); 
    2162                             } 
    2163                             else { 
    2164                                 $rep = "_REPSEP$REV"; 
    2165                                 $rest = " sub { my \$C=shift;\n" . ::indent($rest->walk()) . "\n}"; 
    2166                             } 
     2145 
     2146                my ($qfer,$how,$rest) = @{$$self{quant}}; 
     2147                my $h = $how eq '!' ? 'g' : 
     2148                        $how eq '?' ? 'f' : 
     2149                                      'r'; 
     2150                if ($qfer eq '*') { 
     2151                    $PURE = 0; 
     2152                    $quant = "\$C->_STAR$h$REV("; 
     2153                } 
     2154                elsif ($qfer eq '+') { 
     2155                    $quant = "\$C->_PLUS$h$REV("; 
     2156                } 
     2157                elsif ($qfer eq '?') { 
     2158                    $PURE = 0; 
     2159                    $quant = "\$C->_OPT$h$REV("; 
     2160                } 
     2161                elsif ($qfer eq '**') { 
     2162                    if (ref $rest) { 
     2163                        if (ref $rest eq "RE_block") { 
     2164                            $PURE = 0; 
     2165                            $rep = "_REPINDIRECT$REV"; 
     2166                            $rest = $rest->walk(); 
    21672167                        } 
    21682168                        else { 
    2169                             $PURE = 0 if $rest =~ /^0/; 
    2170                             $rest = "'$rest'"; 
     2169                            $rep = "_REPSEP$REV"; 
     2170                            $rest = " sub { my \$C=shift;\n" . ::indent($rest->walk()) . "\n}"; 
    21712171                        } 
    2172                         $quant = "\$C->$rep$h( $rest, "; 
    21732172                    } 
    2174                     $result = $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 
     2173                    else { 
     2174                        $PURE = 0 if $rest =~ /^0/; 
     2175                        $rest = "'$rest'"; 
     2176                    } 
     2177                    $quant = "\$C->$rep$h( $rest, "; 
    21752178                } 
     2179                return $quant . "sub { my \$C=shift;\n" . ::indent($atom) . "\n})"; 
    21762180            } 
    21772181            else { 
    2178                 $result = $atom; 
     2182                return $atom; 
    21792183            } 
    21802184        } 
    21812185        else { 
    2182             $result = '"' . $$self{atom} . '"'; 
     2186            return '"' . $$self{atom} . '"'; 
    21832187        } 
    21842188        $result;