summaryrefslogtreecommitdiff
path: root/Transcompiler.php
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2014-05-24 01:39:33 +0200
committerKevin Chabowski <kevin@kch42.de>2014-05-24 01:39:33 +0200
commit84d815f4e006e02521759070bb89025dab80b219 (patch)
tree418a03f0b8be181cb29230ad5e808d3213b4d3cb /Transcompiler.php
parentfdbe2e9521aa54ec6e0b70c1cb0f532248e531e4 (diff)
downloadste-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.php6
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";
}
}