| Index: src/scopes.h
|
| ===================================================================
|
| --- src/scopes.h (revision 8618)
|
| +++ src/scopes.h (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -90,20 +90,14 @@
|
| // 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
|
| + 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.
|
| };
|
|
|
| - enum LocalType {
|
| - PARAMETER,
|
| - VAR_OR_CONST
|
| - };
|
| -
|
| Scope(Scope* outer_scope, Type type);
|
|
|
| - virtual ~Scope() { }
|
| -
|
| // Compute top scope and allocate variables. For lazy compilation the top
|
| // scope only contains the single lazily compiled function, so this
|
| // doesn't re-allocate variables repeatedly.
|
| @@ -115,33 +109,31 @@
|
| // The scope name is only used for printing/debugging.
|
| void SetScopeName(Handle<String> scope_name) { scope_name_ = scope_name; }
|
|
|
| - virtual void Initialize(bool inside_with);
|
| + void Initialize(bool inside_with);
|
|
|
| - // Called just before leaving a scope.
|
| - virtual void Leave() {
|
| - // No cleanup or fixup necessary.
|
| - }
|
| -
|
| // ---------------------------------------------------------------------------
|
| // Declarations
|
|
|
| // Lookup a variable in this scope. Returns the variable or NULL if not found.
|
| - virtual Variable* LocalLookup(Handle<String> name);
|
| + Variable* LocalLookup(Handle<String> name);
|
|
|
| // Lookup a variable in this scope or outer scopes.
|
| // Returns the variable or NULL if not found.
|
| - virtual Variable* Lookup(Handle<String> name);
|
| + Variable* Lookup(Handle<String> name);
|
|
|
| // Declare the function variable for a function literal. This variable
|
| // is in an intermediate scope between this function scope and the the
|
| // outer scope. Only possible for function scopes; at most one variable.
|
| Variable* DeclareFunctionVar(Handle<String> name);
|
|
|
| + // Declare a parameter in this scope. When there are duplicated
|
| + // parameters the rightmost one 'wins'. However, the implementation
|
| + // expects all parameters to be declared and from left to right.
|
| + void DeclareParameter(Handle<String> name);
|
| +
|
| // Declare a local variable in this scope. If the variable has been
|
| // declared before, the previously declared variable is returned.
|
| - virtual Variable* DeclareLocal(Handle<String> name,
|
| - Variable::Mode mode,
|
| - LocalType type);
|
| + Variable* DeclareLocal(Handle<String> name, Variable::Mode mode);
|
|
|
| // Declare an implicit global variable in this scope which must be a
|
| // global scope. The variable was introduced (possibly from an inner
|
| @@ -149,16 +141,10 @@
|
| // with statements or eval calls.
|
| Variable* DeclareGlobal(Handle<String> name);
|
|
|
| - // Add a parameter to the parameter list. The parameter must have been
|
| - // declared via Declare. The same parameter may occur more than once in
|
| - // the parameter list; they must be added in source order, from left to
|
| - // right.
|
| - void AddParameter(Variable* var);
|
| -
|
| // Create a new unresolved variable.
|
| - virtual VariableProxy* NewUnresolved(Handle<String> name,
|
| - bool inside_with,
|
| - int position = RelocInfo::kNoPosition);
|
| + VariableProxy* NewUnresolved(Handle<String> name,
|
| + bool inside_with,
|
| + int position = RelocInfo::kNoPosition);
|
|
|
| // Remove a unresolved variable. During parsing, an unresolved variable
|
| // may have been added optimistically, but then only the variable name
|
| @@ -172,7 +158,7 @@
|
| // for printing and cannot be used to find the variable. In particular,
|
| // the only way to get hold of the temporary is by keeping the Variable*
|
| // around.
|
| - virtual Variable* NewTemporary(Handle<String> name);
|
| + Variable* NewTemporary(Handle<String> name);
|
|
|
| // Adds the specific declaration node to the list of declarations in
|
| // this scope. The declarations are processed as part of entering
|
| @@ -217,6 +203,7 @@
|
| 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_strict_mode() const { return strict_mode_; }
|
| bool is_strict_mode_eval_scope() const {
|
| return is_eval_scope() && is_strict_mode();
|
| @@ -240,13 +227,8 @@
|
| // ---------------------------------------------------------------------------
|
| // Accessors.
|
|
|
| - // A new variable proxy corresponding to the (function) receiver.
|
| - VariableProxy* receiver() const {
|
| - VariableProxy* proxy =
|
| - new VariableProxy(FACTORY->this_symbol(), true, false);
|
| - proxy->BindTo(receiver_);
|
| - return proxy;
|
| - }
|
| + // The variable corresponding the 'this' value.
|
| + Variable* receiver() { return receiver_; }
|
|
|
| // The variable holding the function literal for named function
|
| // literals, or NULL.
|
| @@ -266,18 +248,12 @@
|
| int num_parameters() const { return params_.length(); }
|
|
|
| // The local variable 'arguments' if we need to allocate it; NULL otherwise.
|
| - // If arguments() exist, arguments_shadow() exists, too.
|
| Variable* arguments() const { return arguments_; }
|
|
|
| - // The '.arguments' shadow variable if we need to allocate it; NULL otherwise.
|
| - // If arguments_shadow() exist, arguments() exists, too.
|
| - Variable* arguments_shadow() const { return arguments_shadow_; }
|
| -
|
| // Declarations list.
|
| ZoneList<Declaration*>* declarations() { return &decls_; }
|
|
|
|
|
| -
|
| // ---------------------------------------------------------------------------
|
| // Variable allocation.
|
|
|
| @@ -309,11 +285,15 @@
|
| bool AllowsLazyCompilation() const;
|
|
|
| // True if the outer context of this scope is always the global context.
|
| - virtual bool HasTrivialOuterContext() const;
|
| + bool HasTrivialOuterContext() const;
|
|
|
| // The number of contexts between this and scope; zero if this == scope.
|
| int ContextChainLength(Scope* scope);
|
|
|
| + // Find the first function, global, or eval scope. This is the scope
|
| + // where var declarations will be hoisted to in the implementation.
|
| + Scope* DeclarationScope();
|
| +
|
| // ---------------------------------------------------------------------------
|
| // Strict mode support.
|
| bool IsDeclared(Handle<String> name) {
|
| @@ -371,8 +351,6 @@
|
| Variable* function_;
|
| // Convenience variable; function scopes only.
|
| Variable* arguments_;
|
| - // Convenience variable; function scopes only.
|
| - Variable* arguments_shadow_;
|
|
|
| // Illegal redeclaration.
|
| Expression* illegal_redecl_;
|
| @@ -390,6 +368,10 @@
|
| bool outer_scope_is_eval_scope_;
|
| bool force_eager_compilation_;
|
|
|
| + // True if it doesn't need scope resolution (e.g., if the scope was
|
| + // constructed based on a serialized scope info or a catch context).
|
| + bool already_resolved_;
|
| +
|
| // Computed as variables are declared.
|
| int num_var_or_const_;
|
|
|
| @@ -399,7 +381,7 @@
|
|
|
| // Serialized scopes support.
|
| Handle<SerializedScopeInfo> scope_info_;
|
| - bool resolved() { return !scope_info_.is_null(); }
|
| + bool already_resolved() { return already_resolved_; }
|
|
|
| // Create a non-local variable with a given name.
|
| // These variables are looked up dynamically at runtime.
|
| @@ -435,8 +417,12 @@
|
| void AllocateVariablesRecursively();
|
|
|
| private:
|
| + // Construct a function scope based on the scope info.
|
| Scope(Scope* inner_scope, Handle<SerializedScopeInfo> scope_info);
|
|
|
| + // Construct a catch scope with a binding for the name.
|
| + Scope(Scope* inner_scope, Handle<String> catch_variable_name);
|
| +
|
| void AddInnerScope(Scope* inner_scope) {
|
| if (inner_scope != NULL) {
|
| inner_scopes_.Add(inner_scope);
|
| @@ -449,59 +435,6 @@
|
| Handle<SerializedScopeInfo> scope_info);
|
| };
|
|
|
| -
|
| -// Scope used during pre-parsing.
|
| -class DummyScope : public Scope {
|
| - public:
|
| - DummyScope()
|
| - : Scope(GLOBAL_SCOPE),
|
| - nesting_level_(1), // Allows us to Leave the initial scope.
|
| - inside_with_level_(kNotInsideWith) {
|
| - outer_scope_ = this;
|
| - scope_inside_with_ = false;
|
| - }
|
| -
|
| - virtual void Initialize(bool inside_with) {
|
| - nesting_level_++;
|
| - if (inside_with && inside_with_level_ == kNotInsideWith) {
|
| - inside_with_level_ = nesting_level_;
|
| - }
|
| - ASSERT(inside_with_level_ <= nesting_level_);
|
| - }
|
| -
|
| - virtual void Leave() {
|
| - nesting_level_--;
|
| - ASSERT(nesting_level_ >= 0);
|
| - if (nesting_level_ < inside_with_level_) {
|
| - inside_with_level_ = kNotInsideWith;
|
| - }
|
| - ASSERT(inside_with_level_ <= nesting_level_);
|
| - }
|
| -
|
| - virtual Variable* Lookup(Handle<String> name) { return NULL; }
|
| -
|
| - virtual VariableProxy* NewUnresolved(Handle<String> name,
|
| - bool inside_with,
|
| - int position = RelocInfo::kNoPosition) {
|
| - return NULL;
|
| - }
|
| -
|
| - virtual Variable* NewTemporary(Handle<String> name) { return NULL; }
|
| -
|
| - virtual bool HasTrivialOuterContext() const {
|
| - return (nesting_level_ == 0 || inside_with_level_ <= 0);
|
| - }
|
| -
|
| - private:
|
| - static const int kNotInsideWith = -1;
|
| - // Number of surrounding scopes of the current scope.
|
| - int nesting_level_;
|
| - // Nesting level of outermost scope that is contained in a with statement,
|
| - // or kNotInsideWith if there are no with's around the current scope.
|
| - int inside_with_level_;
|
| -};
|
| -
|
| -
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_SCOPES_H_
|
|
|