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

Unified Diff: src/scopes.h

Issue 7904008: Introduce with scope and rework variable resolution. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 3 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
Index: src/scopes.h
diff --git a/src/scopes.h b/src/scopes.h
index 2917a63bba553a3a141acae6875ab83279c0f176..782589b0e6319c1d3eccab49df8a74a12e0db230 100644
--- a/src/scopes.h
+++ b/src/scopes.h
@@ -94,7 +94,8 @@ class Scope: public ZoneObject {
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.
+ BLOCK_SCOPE, // The scope introduced by a new block.
+ WITH_SCOPE // The scope introduced by with.
};
Scope(Scope* outer_scope, Type type);
@@ -210,11 +211,16 @@ class Scope: public ZoneObject {
// Predicates.
// Specific scope types.
+ Type type() const { return type_; }
Kevin Millikin (Chromium) 2011/09/15 09:38:13 Don't introduce this until you have a caller for i
Steven 2011/09/15 19:54:06 Will remove it for for now. But I will need it lat
bool is_eval_scope() const { return type_ == EVAL_SCOPE; }
bool is_function_scope() const { return type_ == FUNCTION_SCOPE; }
bool is_global_scope() const { return type_ == GLOBAL_SCOPE; }
bool is_catch_scope() const { return type_ == CATCH_SCOPE; }
bool is_block_scope() const { return type_ == BLOCK_SCOPE; }
+ bool is_with_scope() const { return type_ == WITH_SCOPE; }
+ bool is_declaration_scope() const {
+ return is_eval_scope() || is_function_scope() || is_global_scope();
+ }
bool is_strict_mode() const { return strict_mode_; }
bool is_strict_mode_eval_scope() const {
return is_eval_scope() && is_strict_mode();
@@ -396,7 +402,7 @@ class Scope: public ZoneObject {
// Computed as variables are declared.
int num_var_or_const_;
- // Computed via AllocateVariables; function scopes only.
+ // Computed via AllocateVariables; function, block and catch scopes only.
int num_stack_slots_;
int num_heap_slots_;
@@ -409,9 +415,35 @@ class Scope: public ZoneObject {
Variable* NonLocal(Handle<String> name, Variable::Mode mode);
// Variable resolution.
- Variable* LookupRecursive(Handle<String> name,
- bool from_inner_function,
- Variable** invalidated_local);
+
+ // Possible results of a variable lookup.
+ enum LookupResult {
+ // The variable could be statically resolved to a non-global outer
+ // scope. There is no 'with' statement in between and no in between
+ // scope calls 'eval'.
+ FOUND,
Kevin Millikin (Chromium) 2011/09/15 09:38:13 Since GLOBAL can also be found, perhaps it's clear
Steven 2011/09/15 19:54:06 Done.
+
+ // The variable could be statically resolved to a non-global outer
+ // scope, but an in between scope calls 'eval' that might possibly
+ // introduce variables shadowing the found one. Thus the found variable
+ // is just a guess.
+ FOUND_EVAL,
+
+ // We may have statically resolved a variable to a non-global outer
+ // scope, but there is a 'with' statement in between. The 'with' object
+ // may have a property with the same name, so if a variable has been
+ // found, it is just a guess.
+ FOUND_WITH,
Kevin Millikin (Chromium) 2011/09/15 09:38:13 On the other hand, this case includes the case of
Steven 2011/09/15 19:54:06 Done.
+
+ // The variable could not be resolved to any local binding and is thus
+ // a global variable unless it is shadowed by an eval-introduced variable.
+ GLOBAL
Kevin Millikin (Chromium) 2011/09/15 09:38:13 This case is also used for when the variable is re
Steven 2011/09/15 19:54:06 Done.
+ };
+
+ // Lookup a variable starting with this scope.
+ LookupResult LookupRecursive(Handle<String> name,
+ bool from_inner_scope,
+ Variable** var);
void ResolveVariable(Scope* global_scope,
Handle<Context> context,
VariableProxy* proxy);

Powered by Google App Engine
This is Rietveld 408576698