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:
parent
117650bb08
commit
222b70d10f
@ -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,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(")");
|
||||
}
|
||||
|
@ -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_; }
|
||||
|
Loading…
Reference in New Issue
Block a user