 Chromium Code Reviews
 Chromium Code Reviews Issue 2269603002:
  Always immediately propagate flags outwards rather than relying on PropagateScopeInfo  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 2269603002:
  Always immediately propagate flags outwards rather than relying on PropagateScopeInfo  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/ast/scopes.h | 
| diff --git a/src/ast/scopes.h b/src/ast/scopes.h | 
| index 0b84d630b91325343c6f77dd29f3ae31f6e257c3..b125e1795bbc8788cb22d738634495d330c363bc 100644 | 
| --- a/src/ast/scopes.h | 
| +++ b/src/ast/scopes.h | 
| @@ -221,8 +221,14 @@ class Scope: public ZoneObject { | 
| // --------------------------------------------------------------------------- | 
| // Scope-specific info. | 
| - // Inform the scope that the corresponding code contains an eval call. | 
| - void RecordEvalCall() { scope_calls_eval_ = true; } | 
| + // Inform the scope and outer scopes that the corresponding code contains an | 
| + // eval call. | 
| + void RecordEvalCall() { | 
| + scope_calls_eval_ = true; | 
| + for (Scope* scope = this; scope != nullptr; scope = scope->outer_scope()) { | 
| + scope->inner_scope_calls_eval_ = true; | 
| + } | 
| + } | 
| 
neis
2016/08/22 13:21:47
Do I understand correctly that you are setting inn
 
Toon Verwaest
2016/08/22 14:13:28
Yes. All uses of inner_scope_calls_eval_ always di
 | 
| // Inform the scope that the corresponding code uses "super". | 
| void RecordSuperPropertyUsage() { scope_uses_super_property_ = true; } | 
| @@ -367,18 +373,9 @@ class Scope: public ZoneObject { | 
| int ContextLocalCount() const; | 
| int ContextGlobalCount() const; | 
| - // Make sure this scope and all outer scopes are eagerly compiled. | 
| - void ForceEagerCompilation() { force_eager_compilation_ = true; } | 
| - | 
| // Determine if we can parse a function literal in this scope lazily. | 
| bool AllowsLazyParsing() const; | 
| - // Determine if we can use lazy compilation for this scope. | 
| - bool AllowsLazyCompilation() const; | 
| - | 
| - // Determine if we can use lazy compilation for this scope without a context. | 
| - bool AllowsLazyCompilationWithoutContext() const; | 
| - | 
| // The number of contexts between this and scope; zero if this == scope. | 
| int ContextChainLength(Scope* scope) const; | 
| @@ -512,9 +509,7 @@ class Scope: public ZoneObject { | 
| // Temporary workaround that allows masking of 'this' in debug-evalute scopes. | 
| bool is_debug_evaluate_scope_ : 1; | 
| - // Computed via PropagateScopeInfo. | 
| bool inner_scope_calls_eval_ : 1; | 
| - bool force_eager_compilation_ : 1; | 
| bool force_context_allocation_ : 1; | 
| // True if it holds 'var' declarations. | 
| @@ -664,10 +659,9 @@ class DeclarationScope : public Scope { | 
| bool NeedsHomeObject() const { | 
| return scope_uses_super_property_ || | 
| - ((scope_calls_eval_ || inner_scope_calls_eval_) && | 
| - (IsConciseMethod(function_kind()) || | 
| - IsAccessorFunction(function_kind()) || | 
| - IsClassConstructor(function_kind()))); | 
| + (inner_scope_calls_eval_ && (IsConciseMethod(function_kind()) || | 
| + IsAccessorFunction(function_kind()) || | 
| + IsClassConstructor(function_kind()))); | 
| } | 
| bool asm_module() const { return asm_module_; } | 
| @@ -834,6 +828,20 @@ class DeclarationScope : public Scope { | 
| Handle<StringSet> CollectNonLocals(ParseInfo* info, | 
| Handle<StringSet> non_locals); | 
| + // Determine if we can use lazy compilation for this scope. | 
| + bool AllowsLazyCompilation() const; | 
| + | 
| + // Determine if we can use lazy compilation for this scope without a context. | 
| + bool AllowsLazyCompilationWithoutContext() const; | 
| + | 
| + // Make this closure and all outer closures are eagerly compiled. | 
| 
neis
2016/08/22 13:21:47
There's a word missing here.
 
Toon Verwaest
2016/08/22 14:13:28
Done.
 | 
| + void ForceEagerCompilation() { | 
| 
neis
2016/08/22 13:21:47
Can you add something like DCHECK(IsClosureScope)
 
Toon Verwaest
2016/08/22 14:13:29
Done.
 | 
| + for (DeclarationScope* s = this; !s->is_script_scope(); | 
| + s = s->outer_scope()->GetClosureScope()) { | 
| + force_eager_compilation_ = true; | 
| 
neis
2016/08/22 13:21:47
s->force_eager_compilation_
Should this have caus
 | 
| + } | 
| + } | 
| + | 
| #ifdef DEBUG | 
| void PrintParameters(); | 
| #endif | 
| @@ -855,6 +863,7 @@ class DeclarationScope : public Scope { | 
| bool asm_module_ : 1; | 
| // This scope's outer context is an asm module. | 
| bool asm_function_ : 1; | 
| + bool force_eager_compilation_ : 1; | 
| // Info about the parameter list of a function. | 
| int arity_; |