Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 5f1714b5c3217bb30d7395ed2ff9b623ed344cd1..c4c75ecbb19eb502934a7b444306819e5732fd40 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -182,26 +182,22 @@ class ParserBase : public Traits { |
// used to hold the parser's per-function and per-block state. |
class BlockState BASE_EMBEDDED { |
public: |
- BlockState(typename Traits::Type::Scope** scope_stack, |
- typename Traits::Type::Scope* scope) |
- : scope_stack_(scope_stack), |
- outer_scope_(*scope_stack), |
- scope_(scope) { |
+ BlockState(Scope** scope_stack, Scope* scope) |
+ : scope_stack_(scope_stack), outer_scope_(*scope_stack), scope_(scope) { |
*scope_stack_ = scope_; |
} |
~BlockState() { *scope_stack_ = outer_scope_; } |
private: |
- typename Traits::Type::Scope** scope_stack_; |
- typename Traits::Type::Scope* outer_scope_; |
- typename Traits::Type::Scope* scope_; |
+ Scope** scope_stack_; |
+ Scope* outer_scope_; |
+ Scope* scope_; |
}; |
class FunctionState BASE_EMBEDDED { |
public: |
- FunctionState(FunctionState** function_state_stack, |
- typename Traits::Type::Scope** scope_stack, |
- typename Traits::Type::Scope* scope, FunctionKind kind, |
+ FunctionState(FunctionState** function_state_stack, Scope** scope_stack, |
+ Scope* scope, FunctionKind kind, |
typename Traits::Type::Factory* factory); |
~FunctionState(); |
@@ -256,8 +252,8 @@ class ParserBase : public Traits { |
FunctionState** function_state_stack_; |
FunctionState* outer_function_state_; |
- typename Traits::Type::Scope** scope_stack_; |
- typename Traits::Type::Scope* outer_scope_; |
+ Scope** scope_stack_; |
+ Scope* outer_scope_; |
typename Traits::Type::Factory* factory_; |
friend class ParserTraits; |
@@ -308,6 +304,20 @@ class ParserBase : public Traits { |
Mode old_mode_; |
}; |
+ Scope* NewScope(Scope* parent, ScopeType scope_type, |
+ FunctionKind kind = kNormalFunction) { |
+ DCHECK(ast_value_factory()); |
+ DCHECK(scope_type != MODULE_SCOPE || allow_harmony_modules()); |
+ DCHECK((scope_type == FUNCTION_SCOPE && IsValidFunctionKind(kind)) || |
+ kind == kNormalFunction); |
+ Scope* result = new (zone()) |
+ Scope(isolate(), zone(), parent, scope_type, ast_value_factory()); |
+ bool uninitialized_this = |
+ FLAG_experimental_classes && IsSubclassConstructor(kind); |
+ result->Initialize(uninitialized_this); |
+ return result; |
+ } |
+ |
Isolate* isolate() const { return isolate_; } |
Scanner* scanner() const { return scanner_; } |
AstValueFactory* ast_value_factory() const { return ast_value_factory_; } |
@@ -617,7 +627,7 @@ class ParserBase : public Traits { |
// so never lazily compile it. |
bool parenthesized_function_; |
- typename Traits::Type::Scope* scope_; // Scope stack. |
+ Scope* scope_; // Scope stack. |
FunctionState* function_state_; // Function state stack. |
v8::Extension* extension_; |
FuncNameInferrer* fni_; |
@@ -727,7 +737,6 @@ class PreParserIdentifier { |
Type type_; |
friend class PreParserExpression; |
- friend class PreParserScope; |
}; |
@@ -1029,44 +1038,6 @@ class PreParserStatementList { |
}; |
-class PreParserScope { |
- public: |
- explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type, |
- void* = NULL) |
- : scope_type_(scope_type) { |
- language_mode_ = outer_scope ? outer_scope->language_mode() : SLOPPY; |
- } |
- |
- ScopeType type() { return scope_type_; } |
- LanguageMode language_mode() const { return language_mode_; } |
- void SetLanguageMode(LanguageMode language_mode) { |
- language_mode_ = language_mode; |
- } |
- void SetScopeName(PreParserIdentifier name) {} |
- |
- // When PreParser is in use, lazy compilation is already being done, |
- // things cannot get lazier than that. |
- bool AllowsLazyCompilation() const { return false; } |
- |
- void set_start_position(int position) {} |
- void set_end_position(int position) {} |
- |
- bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } |
- void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} |
- void RecordArgumentsUsage() {} |
- void RecordSuperPropertyUsage() {} |
- void RecordSuperConstructorCallUsage() {} |
- void RecordThisUsage() {} |
- |
- // Allow scope->Foo() to work. |
- PreParserScope* operator->() { return this; } |
- |
- private: |
- ScopeType scope_type_; |
- LanguageMode language_mode_; |
-}; |
- |
- |
class PreParserFactory { |
public: |
explicit PreParserFactory(void* unused_value_factory) {} |
@@ -1175,9 +1146,8 @@ class PreParserFactory { |
} |
PreParserExpression NewFunctionLiteral( |
PreParserIdentifier name, AstValueFactory* ast_value_factory, |
- const PreParserScope& scope, PreParserStatementList body, |
- int materialized_literal_count, int expected_property_count, |
- int handler_count, int parameter_count, |
+ Scope* scope, PreParserStatementList body, int materialized_literal_count, |
+ int expected_property_count, int handler_count, int parameter_count, |
FunctionLiteral::ParameterFlag has_duplicate_parameters, |
FunctionLiteral::FunctionType function_type, |
FunctionLiteral::IsFunctionFlag is_function, |
@@ -1205,11 +1175,6 @@ class PreParserTraits { |
// it needs. |
typedef PreParser* Parser; |
- // Used by FunctionState and BlockState. |
- typedef PreParserScope Scope; |
- typedef PreParserScope ScopePtr; |
- inline static Scope* ptr_to_scope(ScopePtr& scope) { return &scope; } |
- |
// PreParser doesn't need to store generator variables. |
typedef void GeneratorVariable; |
@@ -1297,15 +1262,14 @@ class PreParserTraits { |
} |
static void CheckFunctionLiteralInsideTopLevelObjectLiteral( |
- PreParserScope* scope, PreParserExpression property, bool* has_function) { |
- } |
+ Scope* scope, PreParserExpression property, bool* has_function) {} |
static void CheckAssigningFunctionLiteralToProperty( |
PreParserExpression left, PreParserExpression right) {} |
// PreParser doesn't need to keep track of eval calls. |
static void CheckPossibleEvalCall(PreParserExpression expression, |
- PreParserScope* scope) {} |
+ Scope* scope) {} |
static PreParserExpression MarkExpressionAsAssigned( |
PreParserExpression expression) { |
@@ -1339,10 +1303,6 @@ class PreParserTraits { |
const char* type, Handle<Object> arg, int pos) { |
return PreParserExpression::Default(); |
} |
- PreParserScope NewScope(PreParserScope* outer_scope, ScopeType scope_type, |
- FunctionKind kind = kNormalFunction) { |
- return PreParserScope(outer_scope, scope_type); |
- } |
// Reporting errors. |
void ReportMessageAt(Scanner::Location location, |
@@ -1395,19 +1355,18 @@ class PreParserTraits { |
return PreParserIdentifier::Default(); |
} |
- static PreParserExpression ThisExpression(PreParserScope* scope, |
+ static PreParserExpression ThisExpression(Scope* scope, |
PreParserFactory* factory) { |
return PreParserExpression::This(); |
} |
- static PreParserExpression SuperReference(PreParserScope* scope, |
+ static PreParserExpression SuperReference(Scope* scope, |
PreParserFactory* factory) { |
return PreParserExpression::Super(); |
} |
- static PreParserExpression DefaultConstructor(bool call_super, |
- PreParserScope* scope, int pos, |
- int end_pos) { |
+ static PreParserExpression DefaultConstructor(bool call_super, Scope* scope, |
+ int pos, int end_pos) { |
return PreParserExpression::Default(); |
} |
@@ -1418,7 +1377,7 @@ class PreParserTraits { |
} |
static PreParserExpression ExpressionFromIdentifier( |
- PreParserIdentifier name, int pos, PreParserScope* scope, |
+ PreParserIdentifier name, int pos, Scope* scope, |
PreParserFactory* factory) { |
return PreParserExpression::FromIdentifier(name); |
} |
@@ -1457,7 +1416,7 @@ class PreParserTraits { |
// Utility functions |
int DeclareArrowParametersFromExpression(PreParserExpression expression, |
- PreParserScope* scope, |
+ Scope* scope, |
Scanner::Location* dupe_loc, |
bool* ok) { |
// TODO(aperez): Detect duplicated identifiers in paramlists. |
@@ -1489,7 +1448,7 @@ class PreParserTraits { |
return !tag.IsNoTemplateTag(); |
} |
- void CheckConflictingVarDeclarations(PreParserScope scope, bool* ok) {} |
+ void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} |
// Temporary glue; these functions will move to ParserBase. |
PreParserExpression ParseV8Intrinsic(bool* ok); |
@@ -1543,9 +1502,9 @@ class PreParser : public ParserBase<PreParserTraits> { |
// captured the syntax error), and false if a stack-overflow happened |
// during parsing. |
PreParseResult PreParseProgram(int* materialized_literals = 0) { |
- PreParserScope scope(scope_, SCRIPT_SCOPE); |
+ Scope* scope = NewScope(scope_, SCRIPT_SCOPE); |
PreParserFactory factory(NULL); |
- FunctionState top_scope(&function_state_, &scope_, &scope, kNormalFunction, |
+ FunctionState top_scope(&function_state_, &scope_, scope, kNormalFunction, |
&factory); |
bool ok = true; |
int start_position = scanner()->peek_location().beg_pos; |
@@ -1685,10 +1644,8 @@ PreParserStatementList PreParserTraits::ParseEagerFunctionBody( |
template <class Traits> |
ParserBase<Traits>::FunctionState::FunctionState( |
- FunctionState** function_state_stack, |
- typename Traits::Type::Scope** scope_stack, |
- typename Traits::Type::Scope* scope, FunctionKind kind, |
- typename Traits::Type::Factory* factory) |
+ FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, |
+ FunctionKind kind, typename Traits::Type::Factory* factory) |
: next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), |
next_handler_index_(0), |
expected_property_count_(0), |
@@ -2825,7 +2782,7 @@ typename ParserBase<Traits>::ExpressionT |
ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, |
ExpressionT params_ast, |
bool* ok) { |
- typename Traits::Type::ScopePtr scope = this->NewScope(scope_, ARROW_SCOPE); |
+ Scope* scope = this->NewScope(scope_, ARROW_SCOPE); |
typename Traits::Type::StatementList body; |
int num_parameters = -1; |
int materialized_literal_count = -1; |
@@ -2834,8 +2791,7 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, |
{ |
typename Traits::Type::Factory function_factory(ast_value_factory()); |
- FunctionState function_state(&function_state_, &scope_, |
- Traits::Type::ptr_to_scope(scope), |
+ FunctionState function_state(&function_state_, &scope_, scope, |
kArrowFunction, &function_factory); |
Scanner::Location dupe_error_loc = Scanner::Location::invalid(); |
num_parameters = Traits::DeclareArrowParametersFromExpression( |