Correct handling of temporaries as parameters.
authorrossberg <rossberg@chromium.org>
Tue, 4 Aug 2015 13:02:59 +0000 (06:02 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 4 Aug 2015 13:03:53 +0000 (13:03 +0000)
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}

src/parser.h
src/scopes.cc
src/variables.h

index df1b439..733665c 100644 (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(
index 52e50ea..0240049 100644 (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,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(")");
   }
index deebc5f..dcd2e6a 100644 (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_; }