Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Default values for positional arguments.
  • Loading branch information
pmurias committed Dec 3, 2014
1 parent 1cf4ad3 commit 5fc70e5
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions src/vm/js/QAST/Compiler.nqp
Expand Up @@ -1019,7 +1019,7 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
my $slurpy_named; # *%foo
my $slurpy; # *@foo

my @pos; # $foo
my @sig := ['caller_ctx','_NAMED'];
my @setup;

my $bind_named := '';
Expand Down Expand Up @@ -1047,26 +1047,34 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
@setup.push("{self.mangle_name($_.name)} = $value;\n");
} else {
my $default := '';
my $name := self.mangle_name($_.name);
if $_.default {
# TODO
#$default := self.as_js($_.default, :want($T_OBJ));
# Overwriting a parameter makes the v8 optimizer bail out so to avoid that we introduce a new variable
my $tmp := self.unique_var($name~'_');

$*BLOCK.add_js_lexical($name);
@sig.push($tmp);
my $default_value := self.as_js($_.default, :want($T_OBJ));
@setup.push(Chunk.new($T_VOID, "", [
"if (arguments.length < {+@sig}) \{\n",
$default_value,
"$name = {$default_value.expr};\n\} else \{\n$name = $tmp;\n\}\n"
]));

} else {
@sig.push($name);
}
@pos.push([$_,$default]);
}
}

# if $slurpy_named {
# $bind_named := $bind_named ~ self.bind_var($slurpy_named,self.js('_NAMED'),1) ~ ";\n";
# }

my @sig := ['caller_ctx','_NAMED'];

for @pos -> $pos {
@sig.push(self.mangle_name($pos[0].name));
}

if $slurpy {
@setup.push("{self.mangle_name($slurpy.name)} = Array.prototype.slice.call(arguments,{2+@pos});\n");
@setup.push("{self.mangle_name($slurpy.name)} = Array.prototype.slice.call(arguments,{+@sig});\n");
}
if $slurpy_named {
@setup.push("{self.mangle_name($slurpy_named.name)} = nqp.slurpy_named(_NAMED);\n");
Expand Down Expand Up @@ -1321,6 +1329,7 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {

has $!unique_vars;

# TODO avoid accidental name collisions
method unique_var($prefix) {
$!unique_vars := $!unique_vars + 1;
$prefix~$!unique_vars;
Expand Down

0 comments on commit 5fc70e5

Please sign in to comment.