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}
This commit is contained in:
rossberg 2015-08-04 06:02:59 -07:00 committed by Commit bot
parent 117650bb08
commit 222b70d10f
3 changed files with 17 additions and 11 deletions

View File

@ -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(

View File

@ -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,6 +862,9 @@ static void PrintVar(int indent, Variable* var) {
if (var->is_used() || !var->IsUnallocated()) {
Indent(indent, Variable::Mode2String(var->mode()));
PrintF(" ");
if (var->raw_name()->IsEmpty())
PrintF(".%p", var);
else
PrintName(var->raw_name());
PrintF("; // ");
PrintLocation(var);
@ -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(")");
}

View File

@ -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_; }