From 9de5cbf03569abf79a4c6c1e139590478156e159 Mon Sep 17 00:00:00 2001 From: vitalif Date: Fri, 28 Nov 2014 00:17:19 +0000 Subject: [PATCH] Fix another bunch of VMXTemplate errors --- VMXTemplate.pm | 16 ++++++++++++---- VMXTemplate/Compiler.pm | 8 ++++++-- VMXTemplate/Lexer.pm | 15 +++++++++------ VMXTemplate/Options.pm | 3 ++- VMXTemplate/Parser.pm | 4 ++-- template.yp | 4 ++-- 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/VMXTemplate.pm b/VMXTemplate.pm index 9a4eb6c..dab2005 100644 --- a/VMXTemplate.pm +++ b/VMXTemplate.pm @@ -215,14 +215,16 @@ sub compile my ($code, $fn, $force_reload) = @_; Encode::_utf8_off($code); # for md5_hex my $key = $fn ? 'F'.$fn : 'C'.md5_hex($code); + $force_reload = 1 if !$self->{compiled_code}->{$key}; + $force_reload = 1 if $self->{options}->{disable_cache}; # Load code my $mtime; if ($fn) { $fn = $self->{options}->{root}.$fn if $fn !~ m!^/!so; - if (!$force_reload && $self->{reload} && $self->{ltimes}->{$fn}+$self->{reload} < time) + if (!$force_reload && $self->{options}->{reload} && $self->{ltimes}->{$fn}+$self->{options}->{reload} < time) { $mtime = [ stat $fn ] -> [ 9 ]; $force_reload = 1 if $mtime > $self->{mtimes}->{$fn}; @@ -263,7 +265,7 @@ sub compile if ($self->{options}->{cache_dir}) { $h = $self->{options}->{cache_dir}.md5_hex($code).'.pl'; - if (-e $h && !$force_reload) + if (-e $h) { my $r = $self->{compiled_code}->{$key} = do $h; if ($@) @@ -272,13 +274,19 @@ sub compile unlink $h; } elsif (ref $r eq 'CODE' || - !$r->{':version'} || $r->{version} < CODE_VERSION) + !$r->{':version'} || $r->{':version'} < CODE_VERSION) { # we got cache from older version, force recompile } else { - return $r; + if ($fn) + { + # remember modification and load time + $self->{mtimes}->{$fn} = $mtime; + $self->{ltimes}->{$fn} = time; + } + return ($r, $key); } } } diff --git a/VMXTemplate/Compiler.pm b/VMXTemplate/Compiler.pm index cf8ac6e..d837000 100644 --- a/VMXTemplate/Compiler.pm +++ b/VMXTemplate/Compiler.pm @@ -15,7 +15,10 @@ sub _Lexer sub _error { my ($self) = @_; - $self->{lexer}->warn('Unexpected ' . $self->YYCurtok . ($self->YYCurval ? ' ' . $self->YYCurval : '')); + if ($self->YYCurtok ne 'error') + { + $self->{lexer}->warn('Unexpected ' . $self->YYCurtok . ($self->YYCurval ? ' ' . $self->YYCurval : '')); + } $self->{lexer}->skip_error; } @@ -40,6 +43,7 @@ sub compile delete $self->{functions}->{':main'}; } return ($self->{options}->{use_utf8} ? "use utf8;\n" : ""). + ($self->{options}->{input_filename} ? "# $self->{options}->{input_filename}\n" : ''). "{\n':version' => ".VMXTemplate->CODE_VERSION.",\n". join(",\n", map { "'$_->{name}' => $_->{body}" } values %{$self->{functions}})."};\n"; } @@ -348,7 +352,7 @@ sub function_strftime my $self = shift; my ($fmt, $date, $time) = @_; $date = "($date).' '.($time)" if $time; - $date = "POSIX::strftime($date, localtime(timestamp($date)))"; + $date = "POSIX::strftime($fmt, localtime(timestamp($date)))"; $date = "utf8on($date)" if $self->{use_utf8}; return $date; } diff --git a/VMXTemplate/Lexer.pm b/VMXTemplate/Lexer.pm index dab7bad..519633a 100644 --- a/VMXTemplate/Lexer.pm +++ b/VMXTemplate/Lexer.pm @@ -31,6 +31,7 @@ sub new keywords => { map { $_ => 1 } split / /, $keywords_str }, # Last directive start position, directive and substitution start/end counters + skip_chars => 0, last_start => 0, last_start_line => 0, in_code => 0, @@ -60,7 +61,7 @@ sub set_code $self->{code} = $code; $self->{eaten} = ''; $self->{lineno} = $self->{in_code} = $self->{in_subst} = 0; - $self->{last_start} = $self->{last_start_line} = 0; + $self->{skip_chars} = $self->{last_start} = $self->{last_start_line} = 0; } sub eat @@ -89,7 +90,8 @@ sub line sub skip_error { my ($self) = @_; - $self->{code} = substr($self->{eaten}, $self->{last_start}+1, length($self->{eaten}), '') . $self->{code}; + $self->{code} = substr($self->{eaten}, $self->{last_start}, length($self->{eaten}), '') . $self->{code}; + $self->{skip_chars} = 1; $self->{lineno} = $self->{last_start_line}; $self->{in_code} = $self->{in_subst} = 0; } @@ -105,8 +107,9 @@ sub read_token if ($self->{in_code} <= 0 && $self->{in_subst} <= 0) { my $r; - my $code_pos = index($self->{code}, $self->{options}->{begin_code}); - my $subst_pos = $self->{options}->{begin_subst} ne '' ? index($self->{code}, $self->{options}->{begin_subst}) : -1; + my $code_pos = index($self->{code}, $self->{options}->{begin_code}, $self->{skip_chars}); + my $subst_pos = $self->{options}->{begin_subst} ne '' ? index($self->{code}, $self->{options}->{begin_subst}, $self->{skip_chars}) : -1; + $self->{skip_chars} = 0; if ($code_pos == -1 && $subst_pos == -1) { # No more directives @@ -189,8 +192,8 @@ sub read_token return ('name', $l); } elsif ($self->{code} =~ /^( - (\")(?:[^\"\\\\]+|\\\\.)*\" | - \'(?:[^\'\\\\]+|\\\\.)*\' | + (\")(?:[^\"\\]+|\\.)*\" | + \'(?:[^\'\\]+|\\.)*\' | 0\d+ | \d+(\.\d+)? | 0x\d+)/xis) { # String or numeric non-negative literal diff --git a/VMXTemplate/Options.pm b/VMXTemplate/Options.pm index 93d7e39..fec7b71 100644 --- a/VMXTemplate/Options.pm +++ b/VMXTemplate/Options.pm @@ -22,6 +22,7 @@ sub new cache_dir => undef, # compiled templates cache directory reload => 2, # 0 means to not check for new versions of cached templates # > 0 - check at most each seconds + disable_cache => 0, # turn cache off completely? filters => [], # filters to run on output of every template use_utf8 => 1, # templates are in UTF-8 and all template variables should be in UTF-8 raise_error => 0, # die() on fatal template errors @@ -78,7 +79,7 @@ sub get_errors return '
'. 'VMXTemplate errors:
  • '. join('
  • ', map { html_pbr($_) } @{$self->{errors}}). - '
'; + '
'; } return ''; } diff --git a/VMXTemplate/Parser.pm b/VMXTemplate/Parser.pm index 79c6f97..06e5194 100644 --- a/VMXTemplate/Parser.pm +++ b/VMXTemplate/Parser.pm @@ -2665,7 +2665,7 @@ sub sub #line 313 "template.yp" { - "{'".addcslashes($_[2], "'")."'}"; + "->{'".addcslashes($_[2], "'")."'}"; } ], [#Rule 81 @@ -2673,7 +2673,7 @@ sub sub #line 316 "template.yp" { - ($_[2][1] eq 'i' ? '['.$_[2][0].']' : "{".$_[2][0]."}"); + ($_[2][1] eq 'i' ? '->['.$_[2][0].']' : "->{".$_[2][0]."}"); } ], [#Rule 82 diff --git a/template.yp b/template.yp index 009e4e8..bb01c48 100644 --- a/template.yp +++ b/template.yp @@ -311,10 +311,10 @@ varref: name { } ; varpart: '.' name { - "{'".addcslashes($_[2], "'")."'}"; + "->{'".addcslashes($_[2], "'")."'}"; } | '[' exp ']' { - ($_[2][1] eq 'i' ? '['.$_[2][0].']' : "{".$_[2][0]."}"); + ($_[2][1] eq 'i' ? '->['.$_[2][0].']' : "->{".$_[2][0]."}"); } | '.' name '(' ')' { '->'.$_[2].'()';