diff options
author | Kevin Chabowski <kevin@kch42.de> | 2014-05-24 01:39:33 +0200 |
---|---|---|
committer | Kevin Chabowski <kevin@kch42.de> | 2014-05-24 01:39:33 +0200 |
commit | 84d815f4e006e02521759070bb89025dab80b219 (patch) | |
tree | 418a03f0b8be181cb29230ad5e808d3213b4d3cb /Transcompiler.php | |
parent | fdbe2e9521aa54ec6e0b70c1cb0f532248e531e4 (diff) | |
download | ste-84d815f4e006e02521759070bb89025dab80b219.tar.gz ste-84d815f4e006e02521759070bb89025dab80b219.tar.bz2 ste-84d815f4e006e02521759070bb89025dab80b219.zip |
Added scoping.
ste:mktag generated tags now have an own scope. They even resemble
closures, since they inherit their parent scope.
A lot of work was done to keep this compatible with older programs.
However:
* Templates that relied on the non-scoping behavior of tags will probably
fail.
* Since $ste->vars is no longer an actual array, things like
$ste->vars["foo"]["bar"] = "baz"
are no longer possible! A single field access will still work:
$ste->vars["foo"] = "bar"
Diffstat (limited to 'Transcompiler.php')
-rw-r--r-- | Transcompiler.php | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/Transcompiler.php b/Transcompiler.php index 8b52fa2..b92663c 100644 --- a/Transcompiler.php +++ b/Transcompiler.php @@ -295,7 +295,7 @@ class Transcompiler { throw new ParseCompileError("self::Transcompile Error: name missing in <ste:mktag>.", $ast->tpl, $ast->offset); } - $fxbody = "\$outputstack = array(''); \$outputstack_i = 0;\$ste->vars['_tag_parameters'] = \$params;\n"; + $fxbody = "\$outputstack = array(''); \$outputstack_i = 0;\$ste->set_local_var('_tag_parameters', \$params);\n"; list($tagname, $tagname_pre) = self::_transcompile($ast->params["name"], true); @@ -312,7 +312,7 @@ class Transcompiler { $fxbody .= self::_transcompile($ast->sub); $fxbody .= "return array_pop(\$outputstack);"; - $code .= "\$tag_fx = function(\$ste, \$params, \$sub)" . $usemandatory . "\n{\n" . self::indent_code($fxbody) . "\n};\n"; + $code .= "\$tag_fx = \$ste->make_closure(function(\$ste, \$params, \$sub)" . $usemandatory . "\n{\n" . self::indent_code($fxbody) . "\n});\n"; $code .= $tagname_pre; $code .= "\$ste->register_tag($tagname, \$tag_fx);\n"; @@ -394,7 +394,7 @@ class Transcompiler { } $code .= "\$outputstack[\$outputstack_i] .= \$ste->call_tag('" . Misc::escape_text($node->name) . "', \$${paramarray}, "; - $code .= empty($node->sub) ? "function(\$ste) { return ''; }" : self::transcompile($node->sub); + $code .= empty($node->sub) ? "function(\$ste) { return ''; }" : ("\$ste->make_closure(" . self::transcompile($node->sub) . ")"); $code .= ");\n"; } } |