]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
Precompile pagespecs, about 10% overall speedup
[git.ikiwiki.info.git] / IkiWiki.pm
index 668de7e9368be67c12425e8acb13c2355e548fe1..221d1e589d1a977ec97648220e78804565e07be3 100644 (file)
@@ -1106,6 +1106,8 @@ sub add_depends ($$) { #{{{
        my $page=shift;
        my $pagespec=shift;
        
+       return unless pagespec_valid($pagespec);
+
        if (! exists $depends{$page}) {
                $depends{$page}=$pagespec;
        }
@@ -1167,8 +1169,6 @@ sub pagespec_merge ($$) { #{{{
 } #}}}
 
 sub pagespec_translate ($) { #{{{
-       # This assumes that $page is in scope in the function
-       # that evalulates the translated pagespec code.
        my $spec=shift;
 
        # Support for old-style GlobLists.
@@ -1205,18 +1205,18 @@ sub pagespec_translate ($) { #{{{
                }
                elsif ($word =~ /^(\w+)\((.*)\)$/) {
                        if (exists $IkiWiki::PageSpec::{"match_$1"}) {
-                               $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@params)";
+                               $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@_)";
                        }
                        else {
                                $code.=' 0';
                        }
                }
                else {
-                       $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@params)";
+                       $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@_)";
                }
        }
 
-       return $code;
+       return eval 'sub { my $page=shift; '.$code.' }';
 } #}}}
 
 sub pagespec_match ($$;@) { #{{{
@@ -1229,9 +1229,16 @@ sub pagespec_match ($$;@) { #{{{
                unshift @params, 'location';
        }
 
-       my $ret=eval pagespec_translate($spec);
+       my $sub=pagespec_translate($spec);
        return IkiWiki::FailReason->new('syntax error') if $@;
-       return $ret;
+       return $sub->($page, @params);
+} #}}}
+
+sub pagespec_valid ($) { #{{{
+       my $spec=shift;
+
+       my $sub=pagespec_translate($spec);
+       return ! $@;
 } #}}}
 
 package IkiWiki::FailReason;