Speedup VMX::Template

databind
vitalif 2009-09-01 22:15:35 +00:00 committed by Vitaliy Filippov
parent ed56bcd351
commit ea27a53187
1 changed files with 35 additions and 9 deletions

View File

@ -12,6 +12,7 @@ my $mtimes = {}; # время изменения файлов
my $uncompiled_code = {}; # нескомпилированный код my $uncompiled_code = {}; # нескомпилированный код
my $compiled_code = {}; # скомпилированный код (sub'ы) my $compiled_code = {}; # скомпилированный код (sub'ы)
my $langhashes = {}; # хеши ленгпаков my $langhashes = {}; # хеши ленгпаков
my $langmerged = {}; # кэш объединённых ленгпаков
my $assigncache = {}; # кэш eval'ов присвоений my $assigncache = {}; # кэш eval'ов присвоений
# Конструктор # Конструктор
@ -67,22 +68,36 @@ sub set_code
sub load_lang sub load_lang
{ {
my $self = shift; my $self = shift;
return $self->load_lang_hashes(map return $self->{lang} unless @_;
my $modified = 0;
my ($mtime, $load);
for (@_)
{ {
my $load = 0; $load = 0;
my $mtime;
if (!defined($mtimes->{$_}) || $self->{reload}) if (!defined($mtimes->{$_}) || $self->{reload})
{ {
$mtime = [ stat($_) ] -> [ 9 ]; $mtime = [ stat $_ ] -> [ 9 ];
$load = 1 if !defined($mtimes->{$_}) || $mtime > $mtimes->{$_}; $modified = $load = 1 if !defined($mtimes->{$_}) || $mtime > $mtimes->{$_};
} }
if ($load) if ($load)
{ {
$mtimes->{$_} = $mtime; $mtimes->{$_} = $mtime;
$langhashes->{$_} = do $_; $langhashes->{$_} = do $_;
} }
$langhashes->{$_}; $mtime = $_;
} @_); $mtime =~ tr!/!_!;
$self->{_lkey} .= '_' . $mtime;
}
if ($load || !$langmerged->{$self->{_lkey}})
{
$self->load_lang_hashes(map { $langhashes->{$_} } @_);
$langmerged->{$self->{_lkey}} = $self->{lang};
}
else
{
$self->{lang} = $langmerged->{$self->{_lkey}};
}
return $self->{lang};
} }
# Функция загружает хеши переводов # Функция загружает хеши переводов
@ -92,7 +107,17 @@ sub load_lang_hashes
my $self = shift; my $self = shift;
my $i = 0; my $i = 0;
Hash::Merge::set_behavior('RIGHT_PRECEDENT'); Hash::Merge::set_behavior('RIGHT_PRECEDENT');
$self->{lang} = Hash::Merge::merge ($self->{lang}, $_) foreach @_; for (@_)
{
if (%{$self->{lang}})
{
$self->{lang} = Hash::Merge::merge ($self->{lang}, $_);
}
else
{
$self->{lang} = $_;
}
}
return $i; return $i;
} }
@ -381,6 +406,7 @@ sub compile
# удаляем комментарии <!--# ... #--> # удаляем комментарии <!--# ... #-->
$code =~ s/\s*<!--#.*?#-->//gos; $code =~ s/\s*<!--#.*?#-->//gos;
$code =~ s/(?:^|\n)[ \t\r]*(<!--\s*[a-z]+(\s+.*)?-->)/$1/giso;
$self->{blocks} = []; $self->{blocks} = [];
$self->{in} = []; $self->{in} = [];
@ -468,7 +494,7 @@ sub compile_code_fragment
my $t; my $t;
$e =~ s/^\s+//so; $e =~ s/^\s+//so;
$e =~ s/\s+$//so; $e =~ s/\s+$//so;
if ($e =~ /^(ELS(?:E\s+)?)?IF(!?)\s*/iso) if ($e =~ /^(ELS(?:E\s*)?)?IF(!?)\s*/iso)
{ {
$t = $'; $t = $';
if ($2) if ($2)