Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: src/ast/scopes.h

Issue 2262393004: Let LookupRecursive bind to NonLocals properly. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/ast/scopes.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast/scopes.h
diff --git a/src/ast/scopes.h b/src/ast/scopes.h
index 8c00927421fadb7ee9773ef559ebeb61f085901c..78ad0c4b009abe78c2113454088a17cce798df75 100644
--- a/src/ast/scopes.h
+++ b/src/ast/scopes.h
@@ -530,63 +530,18 @@ class Scope: public ZoneObject {
Variable* NonLocal(const AstRawString* name, VariableMode mode);
// Variable resolution.
- // Possible results of a recursive variable lookup telling if and how a
- // variable is bound. These are returned in the output parameter *binding_kind
- // of the LookupRecursive function.
- enum BindingKind {
- // The variable reference could be statically resolved to a variable binding
- // which is returned. There is no 'with' statement between the reference and
- // the binding and no scope between the reference scope (inclusive) and
- // binding scope (exclusive) makes a sloppy 'eval' call.
- BOUND,
-
- // The variable reference could be statically resolved to a variable binding
- // which is returned. There is no 'with' statement between the reference and
- // the binding, but some scope between the reference scope (inclusive) and
- // binding scope (exclusive) makes a sloppy 'eval' call, that might
- // possibly introduce variable bindings shadowing the found one. Thus the
- // found variable binding is just a guess.
- BOUND_EVAL_SHADOWED,
-
- // The variable reference could not be statically resolved to any binding
- // and thus should be considered referencing a global variable. NULL is
- // returned. The variable reference is not inside any 'with' statement and
- // no scope between the reference scope (inclusive) and script scope
- // (exclusive) makes a sloppy 'eval' call.
- UNBOUND,
-
- // The variable reference could not be statically resolved to any binding
- // NULL is returned. The variable reference is not inside any 'with'
- // statement, but some scope between the reference scope (inclusive) and
- // script scope (exclusive) makes a sloppy 'eval' call, that might
- // possibly introduce a variable binding. Thus the reference should be
- // considered referencing a global variable unless it is shadowed by an
- // 'eval' introduced binding.
- UNBOUND_EVAL_SHADOWED,
-
- // The variable could not be statically resolved and needs to be looked up
- // dynamically. NULL is returned. There are two possible reasons:
- // * A 'with' statement has been encountered and there is no variable
- // binding for the name between the variable reference and the 'with'.
- // The variable potentially references a property of the 'with' object.
- // * The code is being executed as part of a call to 'eval' and the calling
- // context chain contains either a variable binding for the name or it
- // contains a 'with' context.
- DYNAMIC_LOOKUP
- };
-
// Lookup a variable reference given by name recursively starting with this
// scope, and stopping when reaching the outer_scope_end scope. If the code is
// executed because of a call to 'eval', the context parameter should be set
// to the calling context of 'eval'.
- Variable* LookupRecursive(VariableProxy* proxy, BindingKind* binding_kind,
- AstNodeFactory* factory,
- Scope* outer_scope_end = nullptr);
- void ResolveTo(ParseInfo* info, BindingKind binding_kind,
- VariableProxy* proxy, Variable* var);
- void ResolveVariable(ParseInfo* info, VariableProxy* proxy,
- AstNodeFactory* factory);
- void ResolveVariablesRecursively(ParseInfo* info, AstNodeFactory* factory);
+ // {declare_free} indicates whether nullptr should be returned for free
+ // variables when falling off outer_scope_end, or whether they should be
+ // declared automatically as non-locals.
+ Variable* LookupRecursive(VariableProxy* proxy, bool declare_free,
+ Scope* outer_scope_end);
+ void ResolveTo(ParseInfo* info, VariableProxy* proxy, Variable* var);
+ void ResolveVariable(ParseInfo* info, VariableProxy* proxy);
+ void ResolveVariablesRecursively(ParseInfo* info);
// Finds free variables of this scope. This mutates the unresolved variables
// list along the way, so full resolution cannot be done afterwards.
@@ -681,6 +636,12 @@ class DeclarationScope : public Scope {
IsClassConstructor(function_kind())));
}
+ void SetScriptScopeInfo(Handle<ScopeInfo> scope_info) {
+ DCHECK(is_script_scope());
+ DCHECK(scope_info_.is_null());
+ scope_info_ = scope_info;
+ }
+
bool asm_module() const { return asm_module_; }
void set_asm_module() { asm_module_ = true; }
bool asm_function() const { return asm_function_; }
@@ -832,7 +793,7 @@ class DeclarationScope : public Scope {
// In the case of code compiled and run using 'eval', the context
// parameter is the context in which eval was called. In all other
// cases the context parameter is an empty handle.
- void AllocateVariables(ParseInfo* info, AstNodeFactory* factory);
+ void AllocateVariables(ParseInfo* info);
// To be called during parsing. Do just enough scope analysis that we can
// discard the Scope for lazily compiled functions. In particular, this
« no previous file with comments | « no previous file | src/ast/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698