Fix line number calculation

master
Vitaliy Filippov 2017-02-24 14:38:31 +03:00
parent 912141f7c8
commit f32d481341
2 changed files with 19 additions and 11 deletions

View File

@ -822,12 +822,12 @@ class VMXTemplateLexer
{
// We didn't yet reach the code beginning
$str = substr($this->code, $this->pos, $code_pos-$this->pos);
$this->lineno += substr_count($str, "\n");
if ($this->options->eat_code_line)
{
$str = preg_replace('/\n[ \t]*$/s', $was_code ? '' : "\n", $str);
}
$r = array('literal', "'".addcslashes($str, "'\\")."'");
$this->lineno += substr_count($r[1], "\n");
$this->pos = $code_pos;
}
elseif ($code_pos !== false)

View File

@ -49,6 +49,9 @@ if (!defined('TS_UNIX'))
class VMXTemplate
{
// Loaded template class names
public static $loadedClasses = [];
static $Mon, $mon, $Wday;
static $cache_type = NULL;
static $cache = array();
@ -352,11 +355,11 @@ class VMXTemplate
/**
* Translate template file line number from stack frame $frame (taken from debug_backtrace())
*/
public static function translateLine(&$frame)
public function translateLine(&$frame)
{
if (!empty($frame['class']) && substr($frame['class'], 0, 9) == 'Template_')
if (isset(VMXTemplate::$loadedClasses[$frame['file']]))
{
$class = $frame['class'];
$class = VMXTemplate::$loadedClasses[$frame['file']];
if (isset($class::$smap))
{
$l = $frame['line'];
@ -369,14 +372,18 @@ class VMXTemplate
else
$s = ($e+$s)>>1;
}
$frame['class'] = '';
$frame['type'] = '';
if (substr($frame['function'], 0, 3) == 'fn_')
$frame['function'] = substr($frame['function'], 3);
$frame['file'] = $class::$template_filename;
$frame['line'] = $s;
$frame['line'] = $class::$smap[$s][1];
}
}
if (!empty($frame['class']) && substr($frame['class'], 0, 9) == 'Template_')
{
$class = $frame['class'];
$frame['class'] = $class::$template_filename;
$frame['type'] = '->';
if (substr($frame['function'], 0, 3) == 'fn_')
$frame['function'] = substr($frame['function'], 3);
}
}
/**
@ -463,6 +470,7 @@ class VMXTemplate
$this->compiler = new VMXTemplateCompiler($this->options);
}
$compiled = $this->compiler->parse_all($code, $fn, $func_ns);
$compiled .= "VMXTemplate::\$loadedClasses['".addcslashes(realpath(dirname($file)).'/'.basename($file), '\\\'')."'] = 'Template_$func_ns';\n";
if (!file_put_contents($file, $compiled))
{
throw new VMXTemplateException("Failed writing $file");
@ -830,12 +838,12 @@ class VMXTemplateOptions
$this->end_subst = false;
$this->no_code_subst = false;
}
$this->cache_dir = preg_replace('!/*$!s', '/', $this->cache_dir);
$this->cache_dir = preg_replace('!([^/])/*$!s', '\1/', $this->cache_dir);
if (!is_writable($this->cache_dir))
{
throw new VMXTemplateException('VMXTemplate: cache_dir='.$this->cache_dir.' is not writable');
}
$this->root = preg_replace('!/*$!s', '/', $this->root);
$this->root = preg_replace('!([^/])/*$!s', '\1/', $this->root);
}
function __destruct()