Chromium Code Reviews| Index: src/scopes.h |
| diff --git a/src/scopes.h b/src/scopes.h |
| index 98a3014dbcbcad75ee4b9080c9c20ab89888c5e7..67b52134ca13531266365084960d5f38ea253166 100644 |
| --- a/src/scopes.h |
| +++ b/src/scopes.h |
| @@ -145,13 +145,14 @@ class Scope: public ZoneObject { |
| VariableProxy* NewUnresolved(AstNodeFactory* factory, |
| const AstRawString* name, |
| Interface* interface = Interface::NewValue(), |
| - int position = RelocInfo::kNoPosition) { |
| + int position = RelocInfo::kNoPosition, |
| + bool is_this = false) { |
|
wingo
2015/02/04 10:02:13
Boolean parameters are an antipattern, especially
aperez
2015/02/04 21:00:42
Acknowledged. Even better: the actual name of the
|
| // 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, false, interface, position); |
| + factory->NewVariableProxy(name, is_this, interface, position); |
| unresolved_.Add(proxy, zone_); |
| return proxy; |
| } |
| @@ -222,9 +223,6 @@ class Scope: public ZoneObject { |
| scope_uses_super_constructor_call_ = true; |
| } |
| - // Inform the scope that the corresponding code uses "this". |
| - void RecordThisUsage() { scope_uses_this_ = true; } |
| - |
| // Set the strict mode flag (unless disabled by a global flag). |
| void SetStrictMode(StrictMode strict_mode) { strict_mode_ = strict_mode; } |
| @@ -328,9 +326,8 @@ class Scope: public ZoneObject { |
| return inner_scope_uses_super_constructor_call_; |
| } |
| // Does this scope access "this". |
| - bool uses_this() const { return scope_uses_this_; } |
| + bool uses_this() const { return receiver_->is_used(); } |
| // Does any inner scope access "this". |
| - bool inner_uses_this() const { return inner_scope_uses_this_; } |
| // --------------------------------------------------------------------------- |
| // Accessors. |
| @@ -342,7 +339,14 @@ class Scope: public ZoneObject { |
| StrictMode strict_mode() const { return strict_mode_; } |
| // The variable corresponding the 'this' value. |
| - Variable* receiver() { return receiver_; } |
| + Variable* receiver() { |
| + DCHECK(has_this_declaration()); |
|
wingo
2015/02/04 10:02:13
DCHECK(receiver_) also perhaps?
aperez
2015/02/04 21:00:42
Acknowledged.
|
| + return receiver_; |
| + } |
| + |
| + bool has_this_declaration() const { |
| + return !is_arrow_scope() && is_declaration_scope(); |
| + } |
| // The variable holding the function literal for named function |
| // literals, or NULL. Only valid for function scopes. |
| @@ -516,8 +520,6 @@ class Scope: public ZoneObject { |
| bool scope_uses_super_property_; |
| // This scope uses "super" constructor ('super(..)'). |
| bool scope_uses_super_constructor_call_; |
| - // 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. |
| @@ -534,7 +536,6 @@ class Scope: public ZoneObject { |
| bool inner_scope_uses_arguments_; |
| bool inner_scope_uses_super_property_; |
| bool inner_scope_uses_super_constructor_call_; |
| - bool inner_scope_uses_this_; |
| bool force_eager_compilation_; |
| bool force_context_allocation_; |
| @@ -634,6 +635,8 @@ class Scope: public ZoneObject { |
| void AllocateStackSlot(Variable* var); |
| void AllocateHeapSlot(Variable* var); |
| void AllocateParameterLocals(); |
| + void AllocateParameter(Variable* var, int index); |
| + void AllocateReceiver(); |
| void AllocateNonParameterLocal(Variable* var); |
| void AllocateNonParameterLocals(); |
| void AllocateVariablesRecursively(); |