got compiler working
Uri Guttman [Thu, 18 Dec 2008 18:47:23 +0000 (13:47 -0500)]
bug fix: chunk parser didn't want /g in while loop
bug fix: redid loop unrolling to push sublists onto main data list
bench.pl shows the compiler and renderer match
need to add tests and optimize the compiled code

lib/Template/Simple.pm

index 277195b..4dd68a4 100644 (file)
@@ -125,7 +125,7 @@ CODE
 
        my $code_ref = eval $source ;
 
-die $@ if $@ ;
+print $@ if $@ ;
 
        $self->{compiled_cache}{$template_name} = $code_ref ;
        $self->{source_cache}{$template_name} = $source ;
@@ -149,13 +149,19 @@ sub _compile_chunk {
 
 # loop all nested chunks and the text separating them
 
-       while( $template =~ m{$self->{chunk_re}}g ) {
+       while( $template =~ m{$self->{chunk_re}} ) {
 
 # grab the pre-match text and compile its scalars and save all of its parts
 
                push @parts, $self->_compile_scalars(
                                substr( $template, 0, $-[0] ) ) ;
 
+# print "OFF: $-[0] $+[0]\n" ;
+# print "PRE: [", substr( $template, 0, $-[0] ), "]\n\n" ;
+# print "CHUNK: [$1] BODY [$2]\n\n" ;
+# print "TRUNC: [", substr( $template, 0, $+[0] ), "]\n\n" ;
+# print "LEFT: [$template]\n\n" ;
+
 # compile the nested chunk and save its parts
 
                push @parts, $self->_compile_chunk( $1, $2, "$indent\t\t" ) ;
@@ -163,6 +169,10 @@ sub _compile_chunk {
 # chop off the pre-match and the chunk
 
                substr( $template, 0, $+[0], '' ) ;
+
+# print "LEFT2: [$template]\n\n" ;
+# print Dumper \@parts ;
+
        }
 
 # compile trailing text for scalars and save all of its parts
@@ -190,11 +200,22 @@ CODE
 
        $code .= <<CODE ;
 ${indent}my \$out ;
-${indent}foreach my \$data ( ref \$data eq 'ARRAY' ? \@{\$data} : \$data ) {
+
+${indent}my \@data = \$data ;
+${indent}while( defined( my \$data = shift \@data ) ) {
+
+${indent}      if ( ref \$data eq 'ARRAY' ) {
+${indent}              push \@data, \@{\$data} ;
+${indent}              next ;
+${indent}      }
 
        ${indent}\$out .= ref \$data ne 'HASH' ? \$data :
 CODE
 
+#${indent}foreach my \$data ( ref \$data eq 'ARRAY' ? \@{\$data} : \$data ) {
+
+
+
        $indent .= "\t" ;
 
 # now generate the code to output all the parts of this chunk. they
@@ -235,6 +256,9 @@ sub _compile_scalars {
                        dump_text( substr( $template, 0, $-[0] ) ),
                        "\$data->{$1}"
                ) ;
+
+# truncate the matched text so the next match starts at begining of string
+
                substr( $template, 0, $+[0], '' ) ;
        }
 
@@ -366,8 +390,8 @@ sub _render_hash {
        $rendered =~ s{$self->{chunk_re}}
                      {
                        # print "CHUNK $1\nBODY\n----\n<$2>\n\n------\n" ;
-                       print "CHUNK $1\nBODY\n----\n<$2>\n\n------\n" ;
-                       print "pre CHUNK [$`]\n" ;
+#                      print "CHUNK $1\nBODY\n----\n<$2>\n\n------\n" ;
+#                      print "pre CHUNK [$`]\n" ;
                        ${ $self->_render_chunk( \"$2", $href->{$1} ) }
                      }gex ;