Commit 222b70d1 authored by rossberg's avatar rossberg Committed by Commit bot

Correct handling of temporaries as parameters.

They need to be properly recorded in the scope's temps set, otherwise allocation doesn't know about them and can break. (Not observable right now, but necessary for follow-up changes to parameter destructuring.)

Also, print temporary variables in a useful manner.

R=adamk@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1263563002

Cr-Commit-Position: refs/heads/master@{#29998}
parent 117650bb
......@@ -1317,8 +1317,9 @@ void ParserTraits::DeclareFormalParameter(
const AstRawString* name = is_simple
? pattern->AsVariableProxy()->raw_name()
: parser_->ast_value_factory()->empty_string();
VariableMode mode = is_simple ? VAR : TEMPORARY;
Variable* var =
parameters->scope->DeclareParameter(name, VAR, is_rest, &is_duplicate);
parameters->scope->DeclareParameter(name, mode, is_rest, &is_duplicate);
parameters->AddParameter(var, is_simple ? nullptr : pattern);
if (is_duplicate) {
classifier->RecordDuplicateFormalParameterError(
......
......@@ -465,16 +465,14 @@ Variable* Scope::DeclareParameter(const AstRawString* name, VariableMode mode,
bool is_rest, bool* is_duplicate) {
DCHECK(!already_resolved());
DCHECK(is_function_scope());
Variable* var;
if (!name->IsEmpty()) {
if (mode == TEMPORARY) {
var = NewTemporary(name);
} else {
var = variables_.Declare(this, name, mode, Variable::NORMAL,
kCreatedInitialized);
// TODO(wingo): Avoid O(n^2) check.
*is_duplicate = IsDeclaredParameter(name);
} else {
var = new (zone())
Variable(this, name, TEMPORARY, Variable::NORMAL, kCreatedInitialized);
}
if (is_rest) {
DCHECK_NULL(rest_parameter_);
......@@ -620,9 +618,10 @@ void Scope::CollectStackAndContextLocals(
if (var->IsContextSlot()) {
DCHECK(has_forced_context_allocation());
context_locals->Add(var, zone());
} else {
DCHECK(var->IsStackLocal());
} else if (var->IsStackLocal()) {
stack_locals->Add(var, zone());
} else {
DCHECK(var->IsParameter());
}
}
}
......@@ -863,7 +862,10 @@ static void PrintVar(int indent, Variable* var) {
if (var->is_used() || !var->IsUnallocated()) {
Indent(indent, Variable::Mode2String(var->mode()));
PrintF(" ");
PrintName(var->raw_name());
if (var->raw_name()->IsEmpty())
PrintF(".%p", var);
else
PrintName(var->raw_name());
PrintF("; // ");
PrintLocation(var);
bool comma = !var->IsUnallocated();
......@@ -909,7 +911,11 @@ void Scope::Print(int n) {
PrintF(" (");
for (int i = 0; i < params_.length(); i++) {
if (i > 0) PrintF(", ");
PrintName(params_[i]->raw_name());
const AstRawString* name = params_[i]->raw_name();
if (name->IsEmpty())
PrintF(".%p", params_[i]);
else
PrintName(name);
}
PrintF(")");
}
......
......@@ -44,7 +44,6 @@ class Variable: public ZoneObject {
return force_context_allocation_;
}
void ForceContextAllocation() {
DCHECK(mode_ != TEMPORARY);
force_context_allocation_ = true;
}
bool is_used() { return is_used_; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment