From 131eb38b3800c8ede6e3b981538edfc062ef7a0b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 14 Oct 2012 13:47:40 -0500 Subject: this doesn't need to be a function either --- lib/Text/Handlebars.pm | 9 ------- lib/Text/Handlebars/Compiler.pm | 55 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm index 0a02f77..d104003 100644 --- a/lib/Text/Handlebars.pm +++ b/lib/Text/Handlebars.pm @@ -124,15 +124,6 @@ sub default_functions { return { %{ $class->SUPER::default_functions(@_) }, %{ $class->default_helpers }, - '(is_falsy)' => sub { - my ($val) = @_; - if (ref($val) && ref($val) eq 'ARRAY') { - return @$val == 0; - } - else { - return !$val; - } - }, '(is_code)' => sub { my ($val) = @_; return ref($val) && ref($val) eq 'CODE'; diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm index 48844d1..0282fff 100644 --- a/lib/Text/Handlebars/Compiler.pm +++ b/lib/Text/Handlebars/Compiler.pm @@ -126,7 +126,7 @@ sub _generate_block { } my $iterations = $self->make_ternary( - $self->call($node, '(is_falsy)', $name->clone), + $self->is_falsy($name->clone), $self->make_array($self->parser->literal(1)), $self->make_ternary( $self->is_array_ref($name->clone), @@ -139,7 +139,7 @@ sub _generate_block { my $body_block = [ $self->make_ternary( - $self->call($node, '(is_falsy)', $name->clone), + $self->is_falsy($name->clone), $name->clone( arity => 'block_body', first => undef, @@ -216,6 +216,24 @@ sub is_unary { return $unary{$id}; } +sub _generate_array_length { + my $self = shift; + my ($node) = @_; + + my $max_index = $self->parser->symbol('(max_index)')->clone( + id => 'max_index', + arity => 'unary', + first => $node->first, + ); + + return ( + $self->compile_ast($max_index), + $self->opcode('move_to_sb'), + $self->opcode('literal', 1), + $self->opcode('add'), + ); +} + sub call { my $self = shift; my ($node, $name, @args) = @_; @@ -297,6 +315,39 @@ sub make_hash { ); } +sub is_falsy { + my $self = shift; + my ($node) = @_; + + return $self->not( + $self->make_ternary( + $self->is_array_ref($node->clone), + $self->array_length($node->clone), + $node + ) + ); +} + +sub not { + my $self = shift; + my ($node) = @_; + + return $self->parser->symbol('!')->clone( + arity => 'unary', + first => $node, + ); +} + +sub array_length { + my $self = shift; + my ($node) = @_; + + return $self->parser->symbol('(array_length)')->clone( + arity => 'array_length', + first => $node, + ); +} + __PACKAGE__->meta->make_immutable; no Any::Moose; -- cgit v1.2.3