| Index: src/scopes.h
 | 
| diff --git a/src/scopes.h b/src/scopes.h
 | 
| index f3c64f9eadf73c7c4f9c1671779c4f55926697f9..5e3dc1f0654bf65c3ee738665fcb7bf2107be63b 100644
 | 
| --- a/src/scopes.h
 | 
| +++ b/src/scopes.h
 | 
| @@ -144,15 +144,14 @@ class Scope: public ZoneObject {
 | 
|    // Create a new unresolved variable.
 | 
|    VariableProxy* NewUnresolved(AstNodeFactory* factory,
 | 
|                                 const AstRawString* name,
 | 
| -                               Variable::Kind kind = Variable::NORMAL,
 | 
|                                 int start_position = RelocInfo::kNoPosition,
 | 
|                                 int end_position = RelocInfo::kNoPosition) {
 | 
|      // Note that we must not share the unresolved variables with
 | 
|      // the same name because they may be removed selectively via
 | 
|      // RemoveUnresolved().
 | 
|      DCHECK(!already_resolved());
 | 
| -    VariableProxy* proxy =
 | 
| -        factory->NewVariableProxy(name, kind, start_position, end_position);
 | 
| +    VariableProxy* proxy = factory->NewVariableProxy(
 | 
| +        name, Variable::NORMAL, start_position, end_position);
 | 
|      unresolved_.Add(proxy, zone_);
 | 
|      return proxy;
 | 
|    }
 | 
| @@ -218,6 +217,9 @@ class Scope: public ZoneObject {
 | 
|    // Inform the scope that the corresponding code uses "super".
 | 
|    void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; }
 | 
|  
 | 
| +  // Inform the scope that the corresponding code uses "this".
 | 
| +  void RecordThisUsage() { scope_uses_this_ = true; }
 | 
| +
 | 
|    // Set the language mode flag (unless disabled by a global flag).
 | 
|    void SetLanguageMode(LanguageMode language_mode) {
 | 
|      language_mode_ = language_mode;
 | 
| @@ -321,6 +323,10 @@ class Scope: public ZoneObject {
 | 
|    bool inner_uses_super_property() const {
 | 
|      return inner_scope_uses_super_property_;
 | 
|    }
 | 
| +  // Does this scope access "this".
 | 
| +  bool uses_this() const { return scope_uses_this_; }
 | 
| +  // Does any inner scope access "this".
 | 
| +  bool inner_uses_this() const { return inner_scope_uses_this_; }
 | 
|  
 | 
|    const Scope* NearestOuterEvalScope() const {
 | 
|      if (is_eval_scope()) return this;
 | 
| @@ -340,21 +346,7 @@ class Scope: public ZoneObject {
 | 
|    LanguageMode language_mode() const { return language_mode_; }
 | 
|  
 | 
|    // The variable corresponding to the 'this' value.
 | 
| -  Variable* receiver() {
 | 
| -    DCHECK(has_this_declaration());
 | 
| -    DCHECK_NOT_NULL(receiver_);
 | 
| -    return receiver_;
 | 
| -  }
 | 
| -
 | 
| -  Variable* LookupThis() { return Lookup(ast_value_factory_->this_string()); }
 | 
| -
 | 
| -  // TODO(wingo): Add a GLOBAL_SCOPE scope type which will lexically allocate
 | 
| -  // "this" (and no other variable) on the native context.  Script scopes then
 | 
| -  // will not have a "this" declaration.
 | 
| -  bool has_this_declaration() const {
 | 
| -    return (is_function_scope() && !is_arrow_scope()) || is_module_scope() ||
 | 
| -           is_script_scope();
 | 
| -  }
 | 
| +  Variable* receiver() { return receiver_; }
 | 
|  
 | 
|    // The variable corresponding to the 'new.target' value.
 | 
|    Variable* new_target_var() { return new_target_; }
 | 
| @@ -585,6 +577,8 @@ class Scope: public ZoneObject {
 | 
|    bool scope_uses_arguments_;
 | 
|    // This scope uses "super" property ('super.foo').
 | 
|    bool scope_uses_super_property_;
 | 
| +  // This scope uses "this".
 | 
| +  bool scope_uses_this_;
 | 
|    // This scope contains an "use asm" annotation.
 | 
|    bool asm_module_;
 | 
|    // This scope's outer context is an asm module.
 | 
| @@ -600,6 +594,7 @@ class Scope: public ZoneObject {
 | 
|    bool inner_scope_calls_eval_;
 | 
|    bool inner_scope_uses_arguments_;
 | 
|    bool inner_scope_uses_super_property_;
 | 
| +  bool inner_scope_uses_this_;
 | 
|    bool force_eager_compilation_;
 | 
|    bool force_context_allocation_;
 | 
|  
 | 
| @@ -711,8 +706,6 @@ class Scope: public ZoneObject {
 | 
|    void AllocateNonParameterLocal(Isolate* isolate, Variable* var);
 | 
|    void AllocateNonParameterLocals(Isolate* isolate);
 | 
|    void AllocateVariablesRecursively(Isolate* isolate);
 | 
| -  void AllocateParameter(Variable* var, int index);
 | 
| -  void AllocateReceiver();
 | 
|    void AllocateModules();
 | 
|  
 | 
|    // Resolve and fill in the allocation information for all variables
 | 
| 
 |