From 84d815f4e006e02521759070bb89025dab80b219 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Sat, 24 May 2014 01:39:33 +0200 Subject: 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" --- Transcompiler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Transcompiler.php') 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 .", $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"; } } -- cgit v1.2.3-70-g09d2