summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-14 13:12:21 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-14 14:38:09 -0500
commit91eb6cf8098bb675220e9e63111febf69f6cddfd (patch)
tree056bbf11b1a7afa9e2e088e40fd1ef84dca88d1b
parent50dce9cb66fefbb2435dde7384a6c80b1e3e02d0 (diff)
downloadtext-handlebars-91eb6cf8098bb675220e9e63111febf69f6cddfd.tar.gz
text-handlebars-91eb6cf8098bb675220e9e63111febf69f6cddfd.zip
generate the opcodes for this directly
-rw-r--r--lib/Text/Handlebars/Compiler.pm45
1 files changed, 44 insertions, 1 deletions
diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm
index cfea67a..77c4726 100644
--- a/lib/Text/Handlebars/Compiler.pm
+++ b/lib/Text/Handlebars/Compiler.pm
@@ -129,7 +129,7 @@ sub _generate_block {
$self->call($node, '(is_falsy)', $name->clone),
$self->call($node, '(make_array)', $self->parser->literal(1)),
$self->make_ternary(
- $self->call($node, 'is_array_ref', $name->clone),
+ $self->is_array_ref($name->clone),
$name->clone,
$self->call($node, '(make_array)', $self->parser->literal(1)),
),
@@ -184,6 +184,38 @@ sub _generate_block {
);
}
+sub _generate_unary {
+ my $self = shift;
+ my ($node) = @_;
+
+ # XXX copied from Text::Xslate::Compiler because it uses a hardcoded list
+ # of unary ops
+ if ($self->is_unary($node->id)) {
+ my @code = (
+ $self->compile_ast($node->first),
+ $self->opcode($node->id)
+ );
+ if( $Text::Xslate::Compiler::OPTIMIZE and $self->_code_is_literal($code[0]) ) {
+ $self->_fold_constants(\@code);
+ }
+ return @code;
+ }
+ else {
+ return $self->SUPER::_generate_unary(@_);
+ }
+}
+
+sub is_unary {
+ my $self = shift;
+ my ($id) = @_;
+
+ my %unary = (
+ map { $_ => 1 } qw(builtin_is_array_ref)
+ );
+
+ return $unary{$id};
+}
+
sub call {
my $self = shift;
my ($node, $name, @args) = @_;
@@ -234,6 +266,17 @@ sub check_lambda {
);
}
+sub is_array_ref {
+ my $self = shift;
+ my ($var) = @_;
+
+ return $self->parser->symbol('(is_array_ref)')->clone(
+ id => 'builtin_is_array_ref',
+ arity => 'unary',
+ first => $var,
+ );
+}
+
__PACKAGE__->meta->make_immutable;
no Any::Moose;