Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Optimize &defined as a builtin
  • Loading branch information
sorear committed Nov 24, 2010
1 parent 1bda7f5 commit 7d54b1c
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
10 changes: 5 additions & 5 deletions perf/hashmark.pl
@@ -1,20 +1,20 @@
# vim: ft=perl6
sub _exists_key(\$container, $key) {
$container.defined ?? $container.exists-key($key) !! False
defined($container) ?? $container.exists-key($key) !! False
}
sub _delete_key(\$container, $key) {
$container.defined ?? $container.delete-key($key) !! Any
defined($container) ?? $container.delete-key($key) !! Any
}
sub _at_key(\$container, $key) {
$container.defined
defined($container)
?? $container.at-key($key)
!! Any!Any::butWHENCE(sub (\$var) {
$container.defined && die("Autovivification collision");
defined($container) && die("Autovivification collision");
$container = Hash.new;
$container!Hash::extend($key, $var);
});
}

my $i = 0;
my %hash;
%hash{$i} = $i until ($i++) == 100000;
%hash{$i} = $i until ($i++) == 1000000;
6 changes: 5 additions & 1 deletion src/Op.pm
Expand Up @@ -1190,7 +1190,11 @@ use CgOp;
my ($self, $body) = @_;
no strict 'refs';
my $name = $self->name;
&{ "CgOp::bif_$name" }(map { $_->cgop($body) } @{ $self->args });
my @a = (map { $_->cgop($body) } @{ $self->args });
if ($name eq 'defined') {
return CgOp::obj_asdef($a[0]);
}
&{ "CgOp::bif_$name" }(@a);
}

__PACKAGE__->meta->make_immutable;
Expand Down
7 changes: 7 additions & 0 deletions src/Optimizer/Simplifier.pm
Expand Up @@ -43,6 +43,7 @@ our %funcs = (
'&postfix:<++>' => \&do_postinc,
'&postcircumfix:<{ }>' => \&do_atkey,
'&postcircumfix:<[ ]>' => \&do_atpos,
'&defined' => \&do_defined,
);

sub do_assign {
Expand Down Expand Up @@ -77,6 +78,12 @@ sub do_numeq {
return Op::Builtin->new(name => 'numeq', args => $args);
}

sub do_defined {
my ($body, $nv, $invname, $args) = @_;
return unless @$args == 1;
return Op::Builtin->new(name => 'defined', args => $args);
}

# TODO: similar conversion for :delete and :exists
sub do_atkey {
my ($body, $nv, $invname, $args) = @_;
Expand Down

0 comments on commit 7d54b1c

Please sign in to comment.