Index: src/scopes.h |
diff --git a/src/scopes.h b/src/scopes.h |
index 72f1e31878efb744ac8d1210f531d1d16b7a0026..58b683b8d3e506f9ac5a54feabefbed35987a212 100644 |
--- a/src/scopes.h |
+++ b/src/scopes.h |
@@ -89,16 +89,7 @@ class Scope: public ZoneObject { |
// --------------------------------------------------------------------------- |
// Construction |
- enum Type { |
- EVAL_SCOPE, // The top-level scope for an eval source. |
- FUNCTION_SCOPE, // The top-level scope for a function. |
- GLOBAL_SCOPE, // The top-level scope for a program or a top-level eval. |
- CATCH_SCOPE, // The scope introduced by catch. |
- BLOCK_SCOPE, // The scope introduced by a new block. |
- WITH_SCOPE // The scope introduced by with. |
- }; |
- |
- Scope(Scope* outer_scope, Type type); |
+ Scope(Scope* outer_scope, ScopeType type); |
// Compute top scope and allocate variables. For lazy compilation the top |
// scope only contains the single lazily compiled function, so this |
@@ -206,6 +197,37 @@ class Scope: public ZoneObject { |
strict_mode_ = FLAG_strict_mode; |
} |
+ // Position in the source where this scope begins and ends. |
+ // |
+ // * For the scope of a with statement |
+ // with (obj) stmt |
+ // start position: start position of first token of 'stmt' |
+ // end position: end position of last token of 'stmt' |
+ // * For the scope of a block |
+ // { stmts } |
+ // start position: start position of '{' |
+ // end position: end position of '}' |
+ // * For the scope of a function literal or decalaration |
+ // function fun(a,b) { stmts } |
+ // start position: start position of '(' |
+ // end position: end position of '}' |
+ // * For the scope of a catch block |
+ // try { stms } catch(e) { stmts } |
+ // start position: start position of '(' |
+ // end position: end position of ')' |
+ // * For the scope of a for-statement |
+ // for (let x ...) stmt |
+ // start position: start position of '(' |
+ // end position: end position of last token of 'stmt' |
+ int start_position() const { return start_position_; } |
+ void set_start_position(int statement_pos) { |
+ start_position_ = statement_pos; |
+ } |
+ int end_position() const { return end_position_; } |
+ void set_end_position(int statement_pos) { |
+ end_position_ = statement_pos; |
+ } |
+ |
// --------------------------------------------------------------------------- |
// Predicates. |
@@ -244,6 +266,9 @@ class Scope: public ZoneObject { |
// --------------------------------------------------------------------------- |
// Accessors. |
+ // The type of this scope. |
+ ScopeType type() const { return type_; } |
+ |
// The variable corresponding the 'this' value. |
Variable* receiver() { return receiver_; } |
@@ -270,6 +295,8 @@ class Scope: public ZoneObject { |
// Declarations list. |
ZoneList<Declaration*>* declarations() { return &decls_; } |
+ // Inner scope list. |
+ ZoneList<Scope*>* inner_scopes() { return &inner_scopes_; } |
// --------------------------------------------------------------------------- |
// Variable allocation. |
@@ -313,6 +340,13 @@ class Scope: public ZoneObject { |
Handle<SerializedScopeInfo> GetSerializedScopeInfo(); |
+ // Get the chain of nested scopes within this scope for the source statement |
+ // position. The scopes will be added to the list from the outermost scope to |
+ // the innermost scope. Only nested block, catch or with scopes are tracked |
+ // and will be returned, but no inner function scopes. |
+ void GetNestedScopeChain(List<Handle<SerializedScopeInfo> >* chain, |
+ int statement_position); |
+ |
// --------------------------------------------------------------------------- |
// Strict mode support. |
bool IsDeclared(Handle<String> name) { |
@@ -336,7 +370,7 @@ class Scope: public ZoneObject { |
protected: |
friend class ParserFactory; |
- explicit Scope(Type type); |
+ explicit Scope(ScopeType type); |
Isolate* const isolate_; |
@@ -345,7 +379,7 @@ class Scope: public ZoneObject { |
ZoneList<Scope*> inner_scopes_; // the immediately enclosed inner scopes |
// The scope type. |
- Type type_; |
+ ScopeType type_; |
// Debugging support. |
Handle<String> scope_name_; |
@@ -387,6 +421,9 @@ class Scope: public ZoneObject { |
bool scope_calls_eval_; |
// This scope is a strict mode scope. |
bool strict_mode_; |
+ // Source positions. |
+ int start_position_; |
+ int end_position_; |
// Computed via PropagateScopeInfo. |
bool outer_scope_calls_non_strict_eval_; |
@@ -489,7 +526,9 @@ class Scope: public ZoneObject { |
private: |
// Construct a scope based on the scope info. |
- Scope(Scope* inner_scope, Type type, Handle<SerializedScopeInfo> scope_info); |
+ Scope(Scope* inner_scope, |
+ ScopeType type, |
+ Handle<SerializedScopeInfo> scope_info); |
// Construct a catch scope with a binding for the name. |
Scope(Scope* inner_scope, Handle<String> catch_variable_name); |
@@ -501,7 +540,7 @@ class Scope: public ZoneObject { |
} |
} |
- void SetDefaults(Type type, |
+ void SetDefaults(ScopeType type, |
Scope* outer_scope, |
Handle<SerializedScopeInfo> scope_info); |
}; |