Skip to content

Instantly share code, notes, and snippets.

@hanabokuro
Created June 23, 2011 09:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hanabokuro/1042245 to your computer and use it in GitHub Desktop.
Save hanabokuro/1042245 to your computer and use it in GitHub Desktop.
Text::Xslate::Compiler simulate global_vars
sub _generate_variable {
my($self, $node) = @_;
if(defined(my $lvar_id = $self->lvar->{$node->value})) {
return $self->opcode( load_lvar => $lvar_id, symbol => $node );
}
else {
my $name = $self->_variable_to_value($node);
my @code;
my @lvar_name_list = sort { $self->lvar->{$b} <=> $self->lvar->{$a} } grep { /^\$/ } keys %{$self->lvar};
my $index = 0;
foreach my $lvar_name (@lvar_name_list){
my $skip = 2 + (@lvar_name_list - ++$index)*3; # 3 means 'load_var','fetch_filed_s','or'.
push(@code,
$self->opcode( load_lvar => $self->lvar->{$lvar_name}, symbol => $lvar_name ),
$self->opcode( fetch_field_s => $name, line => $node->line ),
$self->opcode( or => $skip),
);
}
if($name =~ /~/) {
$self->_error("Undefined iterator variable $node", $node);
}
push(@code, $self->opcode( fetch_s => $name, line => $node->line ));
@code;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment