| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 796283e2c97009b1b5ee72976b83ba660600fa8a..a0f3b7147f20eda1457d4f41276c550d70b2b612 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -39,7 +39,6 @@
|
| #include "preparser.h"
|
| #include "runtime.h"
|
| #include "scopeinfo.h"
|
| -#include "scopes.h"
|
| #include "string-stream.h"
|
|
|
| #include "ast-inl.h"
|
| @@ -324,144 +323,37 @@ TemporaryScope::~TemporaryScope() {
|
| }
|
|
|
|
|
| -// A zone list wrapper lets code either access a access a zone list
|
| -// or appear to do so while actually ignoring all operations.
|
| -template <typename T>
|
| -class ZoneListWrapper {
|
| - public:
|
| - ZoneListWrapper() : list_(NULL) { }
|
| - explicit ZoneListWrapper(int size) : list_(new ZoneList<T*>(size)) { }
|
| - void Add(T* that) { if (list_) list_->Add(that); }
|
| - int length() { return list_->length(); }
|
| - ZoneList<T*>* elements() { return list_; }
|
| - T* at(int index) { return list_->at(index); }
|
| - private:
|
| - ZoneList<T*>* list_;
|
| -};
|
| -
|
| -
|
| -// Allocation macro that should be used to allocate objects that must
|
| -// only be allocated in real parsing mode. Note that in preparse mode
|
| -// not only is the syntax tree not created but the constructor
|
| -// arguments are not evaluated.
|
| -#define NEW(expr) (is_pre_parsing_ ? NULL : new expr)
|
| -
|
| -
|
| -class ParserFactory BASE_EMBEDDED {
|
| - public:
|
| - explicit ParserFactory(bool is_pre_parsing) :
|
| - is_pre_parsing_(is_pre_parsing) { }
|
| -
|
| - virtual ~ParserFactory() { }
|
| -
|
| - virtual Scope* NewScope(Scope* parent, Scope::Type type, bool inside_with);
|
| -
|
| - virtual Handle<String> LookupSymbol(int index, Vector<const char> string) {
|
| - return Handle<String>();
|
| - }
|
| -
|
| - virtual Handle<String> EmptySymbol() {
|
| - return Handle<String>();
|
| - }
|
| -
|
| - virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) {
|
| - if (obj == VariableProxySentinel::this_proxy()) {
|
| - return Property::this_property();
|
| - } else {
|
| - return ValidLeftHandSideSentinel::instance();
|
| - }
|
| - }
|
| -
|
| - virtual Expression* NewCall(Expression* expression,
|
| - ZoneList<Expression*>* arguments,
|
| - int pos) {
|
| - return Call::sentinel();
|
| - }
|
| -
|
| - virtual Statement* EmptyStatement() {
|
| - return NULL;
|
| - }
|
| -
|
| - template <typename T> ZoneListWrapper<T> NewList(int size) {
|
| - return is_pre_parsing_ ? ZoneListWrapper<T>() : ZoneListWrapper<T>(size);
|
| - }
|
| -
|
| - private:
|
| - bool is_pre_parsing_;
|
| -};
|
| -
|
| -
|
| -class ConditionalLogPauseScope {
|
| - public:
|
| - ConditionalLogPauseScope(bool pause, ParserLog* log)
|
| - : log_(log), pause_(pause) {
|
| - if (pause) log->PauseRecording();
|
| - }
|
| - ~ConditionalLogPauseScope() {
|
| - if (pause_) log_->ResumeRecording();
|
| - }
|
| - private:
|
| - ParserLog* log_;
|
| - bool pause_;
|
| -};
|
| -
|
| -
|
| -class AstBuildingParserFactory : public ParserFactory {
|
| - public:
|
| - explicit AstBuildingParserFactory(int expected_symbols)
|
| - : ParserFactory(false), symbol_cache_(expected_symbols) { }
|
| -
|
| - virtual Scope* NewScope(Scope* parent, Scope::Type type, bool inside_with);
|
| -
|
| - virtual Handle<String> LookupSymbol(int symbol_id,
|
| - Vector<const char> string) {
|
| - // Length of symbol cache is the number of identified symbols.
|
| - // If we are larger than that, or negative, it's not a cached symbol.
|
| - // This might also happen if there is no preparser symbol data, even
|
| - // if there is some preparser data.
|
| - if (static_cast<unsigned>(symbol_id)
|
| - >= static_cast<unsigned>(symbol_cache_.length())) {
|
| - return Factory::LookupSymbol(string);
|
| - }
|
| - return LookupCachedSymbol(symbol_id, string);
|
| - }
|
| -
|
| - Handle<String> LookupCachedSymbol(int symbol_id,
|
| +Handle<String> Parser::LookupSymbol(int symbol_id,
|
| Vector<const char> string) {
|
| - // Make sure the cache is large enough to hold the symbol identifier.
|
| - if (symbol_cache_.length() <= symbol_id) {
|
| - // Increase length to index + 1.
|
| - symbol_cache_.AddBlock(Handle<String>::null(),
|
| - symbol_id + 1 - symbol_cache_.length());
|
| - }
|
| - Handle<String> result = symbol_cache_.at(symbol_id);
|
| - if (result.is_null()) {
|
| - result = Factory::LookupSymbol(string);
|
| - symbol_cache_.at(symbol_id) = result;
|
| - return result;
|
| - }
|
| - Counters::total_preparse_symbols_skipped.Increment();
|
| + // Length of symbol cache is the number of identified symbols.
|
| + // If we are larger than that, or negative, it's not a cached symbol.
|
| + // This might also happen if there is no preparser symbol data, even
|
| + // if there is some preparser data.
|
| + if (static_cast<unsigned>(symbol_id)
|
| + >= static_cast<unsigned>(symbol_cache_.length())) {
|
| + return Factory::LookupSymbol(string);
|
| + }
|
| + return LookupCachedSymbol(symbol_id, string);
|
| +}
|
| +
|
| +
|
| +Handle<String> Parser::LookupCachedSymbol(int symbol_id,
|
| + Vector<const char> string) {
|
| + // Make sure the cache is large enough to hold the symbol identifier.
|
| + if (symbol_cache_.length() <= symbol_id) {
|
| + // Increase length to index + 1.
|
| + symbol_cache_.AddBlock(Handle<String>::null(),
|
| + symbol_id + 1 - symbol_cache_.length());
|
| + }
|
| + Handle<String> result = symbol_cache_.at(symbol_id);
|
| + if (result.is_null()) {
|
| + result = Factory::LookupSymbol(string);
|
| + symbol_cache_.at(symbol_id) = result;
|
| return result;
|
| }
|
| -
|
| - virtual Handle<String> EmptySymbol() {
|
| - return Factory::empty_symbol();
|
| - }
|
| -
|
| - virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) {
|
| - return new Property(obj, key, pos);
|
| - }
|
| -
|
| - virtual Expression* NewCall(Expression* expression,
|
| - ZoneList<Expression*>* arguments,
|
| - int pos) {
|
| - return new Call(expression, arguments, pos);
|
| - }
|
| -
|
| - virtual Statement* EmptyStatement();
|
| - private:
|
| - List<Handle<String> > symbol_cache_;
|
| -};
|
| + Counters::total_preparse_symbols_skipped.Increment();
|
| + return result;
|
| +}
|
|
|
|
|
| Vector<unsigned> PartialParserRecorder::ExtractData() {
|
| @@ -523,8 +415,6 @@ Vector<unsigned> CompleteParserRecorder::ExtractData() {
|
| }
|
|
|
|
|
| -
|
| -
|
| FunctionEntry ScriptDataImpl::GetFunctionEntry(int start) {
|
| // The current pre-data entry must be a FunctionEntry with the given
|
| // start position.
|
| @@ -704,108 +594,12 @@ unsigned* ScriptDataImpl::ReadAddress(int position) {
|
| }
|
|
|
|
|
| -class AstBuildingParser : public Parser {
|
| - public:
|
| - AstBuildingParser(Handle<Script> script, bool allow_natives_syntax,
|
| - v8::Extension* extension, ScriptDataImpl* pre_data)
|
| - : Parser(script,
|
| - allow_natives_syntax,
|
| - extension,
|
| - PARSE,
|
| - factory(),
|
| - log(),
|
| - pre_data),
|
| - factory_(pre_data ? pre_data->symbol_count() : 0) { }
|
| - virtual void ReportMessageAt(Scanner::Location loc, const char* message,
|
| - Vector<const char*> args);
|
| - virtual VariableProxy* Declare(Handle<String> name, Variable::Mode mode,
|
| - FunctionLiteral* fun, bool resolve, bool* ok);
|
| - AstBuildingParserFactory* factory() { return &factory_; }
|
| - ParserLog* log() { return &log_; }
|
| -
|
| - private:
|
| - ParserLog log_;
|
| - AstBuildingParserFactory factory_;
|
| -};
|
| -
|
| -
|
| -class PreParser : public Parser {
|
| - public:
|
| - PreParser(Handle<Script> script, bool allow_natives_syntax,
|
| - v8::Extension* extension, ParserLog* recorder)
|
| - : Parser(script, allow_natives_syntax, extension, PREPARSE,
|
| - factory(), recorder, NULL),
|
| - factory_(true) { }
|
| - virtual void ReportMessageAt(Scanner::Location loc, const char* message,
|
| - Vector<const char*> args);
|
| - virtual VariableProxy* Declare(Handle<String> name, Variable::Mode mode,
|
| - FunctionLiteral* fun, bool resolve, bool* ok);
|
| - ParserFactory* factory() { return &factory_; }
|
| - virtual PartialParserRecorder* recorder() = 0;
|
| -
|
| - private:
|
| - ParserFactory factory_;
|
| -};
|
| -
|
| -
|
| -class CompletePreParser : public PreParser {
|
| - public:
|
| - CompletePreParser(Handle<Script> script, bool allow_natives_syntax,
|
| - v8::Extension* extension)
|
| - : PreParser(script, allow_natives_syntax, extension, &recorder_),
|
| - recorder_() { }
|
| - virtual PartialParserRecorder* recorder() { return &recorder_; }
|
| - private:
|
| - CompleteParserRecorder recorder_;
|
| -};
|
| -
|
| -
|
| -class PartialPreParser : public PreParser {
|
| - public:
|
| - PartialPreParser(Handle<Script> script, bool allow_natives_syntax,
|
| - v8::Extension* extension)
|
| - : PreParser(script, allow_natives_syntax, extension, &recorder_),
|
| - recorder_() { }
|
| - virtual PartialParserRecorder* recorder() { return &recorder_; }
|
| - private:
|
| - PartialParserRecorder recorder_;
|
| -};
|
| -
|
| -
|
| -Scope* AstBuildingParserFactory::NewScope(Scope* parent, Scope::Type type,
|
| - bool inside_with) {
|
| +Scope* Parser::NewScope(Scope* parent, Scope::Type type, bool inside_with) {
|
| Scope* result = new Scope(parent, type);
|
| result->Initialize(inside_with);
|
| return result;
|
| }
|
|
|
| -
|
| -Statement* AstBuildingParserFactory::EmptyStatement() {
|
| - // Use a statically allocated empty statement singleton to avoid
|
| - // allocating lots and lots of empty statements.
|
| - static v8::internal::EmptyStatement empty;
|
| - return ∅
|
| -}
|
| -
|
| -
|
| -Scope* ParserFactory::NewScope(Scope* parent, Scope::Type type,
|
| - bool inside_with) {
|
| - ASSERT(parent != NULL);
|
| - parent->type_ = type;
|
| - // Initialize function is hijacked by DummyScope to increment scope depth.
|
| - parent->Initialize(inside_with);
|
| - return parent;
|
| -}
|
| -
|
| -
|
| -VariableProxy* PreParser::Declare(Handle<String> name, Variable::Mode mode,
|
| - FunctionLiteral* fun, bool resolve,
|
| - bool* ok) {
|
| - return NULL;
|
| -}
|
| -
|
| -
|
| -
|
| // ----------------------------------------------------------------------------
|
| // Target is a support class to facilitate manipulation of the
|
| // Parser's target_stack_ (the stack of potential 'break' and
|
| @@ -908,11 +702,9 @@ class LexicalScope BASE_EMBEDDED {
|
| Parser::Parser(Handle<Script> script,
|
| bool allow_natives_syntax,
|
| v8::Extension* extension,
|
| - ParserMode is_pre_parsing,
|
| - ParserFactory* factory,
|
| - ParserLog* log,
|
| ScriptDataImpl* pre_data)
|
| - : script_(script),
|
| + : symbol_cache_(pre_data ? pre_data->symbol_count() : 0),
|
| + script_(script),
|
| scanner_(),
|
| top_scope_(NULL),
|
| with_nesting_level_(0),
|
| @@ -920,9 +712,6 @@ Parser::Parser(Handle<Script> script,
|
| target_stack_(NULL),
|
| allow_natives_syntax_(allow_natives_syntax),
|
| extension_(extension),
|
| - factory_(factory),
|
| - log_(log),
|
| - is_pre_parsing_(is_pre_parsing == PREPARSE),
|
| pre_data_(pre_data),
|
| fni_(NULL) {
|
| }
|
| @@ -950,21 +739,21 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source,
|
| in_global_context
|
| ? Scope::GLOBAL_SCOPE
|
| : Scope::EVAL_SCOPE;
|
| - Handle<String> no_name = factory()->EmptySymbol();
|
| + Handle<String> no_name = Factory::empty_symbol();
|
|
|
| FunctionLiteral* result = NULL;
|
| - { Scope* scope = factory()->NewScope(top_scope_, type, inside_with());
|
| + { Scope* scope = NewScope(top_scope_, type, inside_with());
|
| LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
|
| scope);
|
| TemporaryScope temp_scope(&this->temp_scope_);
|
| - ZoneListWrapper<Statement> body(16);
|
| + ZoneList<Statement*>* body = new ZoneList<Statement*>(16);
|
| bool ok = true;
|
| - ParseSourceElements(&body, Token::EOS, &ok);
|
| + ParseSourceElements(body, Token::EOS, &ok);
|
| if (ok) {
|
| - result = NEW(FunctionLiteral(
|
| + result = new FunctionLiteral(
|
| no_name,
|
| top_scope_,
|
| - body.elements(),
|
| + body,
|
| temp_scope.materialized_literal_count(),
|
| temp_scope.expected_property_count(),
|
| temp_scope.only_simple_this_property_assignments(),
|
| @@ -973,7 +762,7 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source,
|
| 0,
|
| source->length(),
|
| false,
|
| - temp_scope.ContainsLoops()));
|
| + temp_scope.ContainsLoops());
|
| } else if (scanner().stack_overflow()) {
|
| Top::StackOverflow();
|
| }
|
| @@ -1011,9 +800,9 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info) {
|
|
|
| {
|
| // Parse the function literal.
|
| - Handle<String> no_name = factory()->EmptySymbol();
|
| + Handle<String> no_name = Factory::empty_symbol();
|
| Scope* scope =
|
| - factory()->NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with());
|
| + NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with());
|
| LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
|
| scope);
|
| TemporaryScope temp_scope(&this->temp_scope_);
|
| @@ -1041,28 +830,24 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info) {
|
| }
|
|
|
|
|
| -void Parser::ReportMessage(const char* type, Vector<const char*> args) {
|
| - Scanner::Location source_location = scanner_.location();
|
| - ReportMessageAt(source_location, type, args);
|
| -}
|
| -
|
| -
|
| Handle<String> Parser::GetSymbol(bool* ok) {
|
| - if (is_pre_parsing_) {
|
| - log()->LogSymbol(scanner_.location().beg_pos, scanner_.literal());
|
| - return Handle<String>::null();
|
| - }
|
| int symbol_id = -1;
|
| if (pre_data() != NULL) {
|
| symbol_id = pre_data()->GetSymbolIdentifier();
|
| }
|
| - return factory()->LookupSymbol(symbol_id, scanner_.literal());
|
| + return LookupSymbol(symbol_id, scanner_.literal());
|
| +}
|
| +
|
| +
|
| +void Parser::ReportMessage(const char* type, Vector<const char*> args) {
|
| + Scanner::Location source_location = scanner_.location();
|
| + ReportMessageAt(source_location, type, args);
|
| }
|
|
|
|
|
| -void AstBuildingParser::ReportMessageAt(Scanner::Location source_location,
|
| - const char* type,
|
| - Vector<const char*> args) {
|
| +void Parser::ReportMessageAt(Scanner::Location source_location,
|
| + const char* type,
|
| + Vector<const char*> args) {
|
| MessageLocation location(script_,
|
| source_location.beg_pos, source_location.end_pos);
|
| Handle<JSArray> array = Factory::NewJSArray(args.length());
|
| @@ -1074,13 +859,6 @@ void AstBuildingParser::ReportMessageAt(Scanner::Location source_location,
|
| }
|
|
|
|
|
| -void PreParser::ReportMessageAt(Scanner::Location source_location,
|
| - const char* type,
|
| - Vector<const char*> args) {
|
| - recorder()->LogMessage(source_location, type, args);
|
| -}
|
| -
|
| -
|
| // Base class containing common code for the different finder classes used by
|
| // the parser.
|
| class ParserFinder {
|
| @@ -1122,6 +900,11 @@ class InitializationBlockFinder : public ParserFinder {
|
| }
|
|
|
| private:
|
| + // The minimum number of contiguous assignment that will
|
| + // be treated as an initialization block. Benchmarks show that
|
| + // the overhead exceeds the savings below this limit.
|
| + static const int kMinInitializationBlock = 3;
|
| +
|
| // Returns true if the expressions appear to denote the same object.
|
| // In the context of initialization blocks, we only consider expressions
|
| // of the form 'expr.x' or expr["x"].
|
| @@ -1174,7 +957,7 @@ class InitializationBlockFinder : public ParserFinder {
|
| }
|
|
|
| void EndBlock() {
|
| - if (block_size_ >= Parser::kMinInitializationBlock) {
|
| + if (block_size_ >= kMinInitializationBlock) {
|
| first_in_block_->mark_block_start();
|
| last_in_block_->mark_block_end();
|
| }
|
| @@ -1332,7 +1115,7 @@ class ThisNamedPropertyAssigmentFinder : public ParserFinder {
|
| };
|
|
|
|
|
| -void* Parser::ParseSourceElements(ZoneListWrapper<Statement>* processor,
|
| +void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
|
| int end_token,
|
| bool* ok) {
|
| // SourceElements ::
|
| @@ -1364,7 +1147,7 @@ void* Parser::ParseSourceElements(ZoneListWrapper<Statement>* processor,
|
| }
|
|
|
| // Propagate the collected information on this property assignments.
|
| - if (!is_pre_parsing_ && top_scope_->is_function_scope()) {
|
| + if (top_scope_->is_function_scope()) {
|
| bool only_simple_this_property_assignments =
|
| this_property_assignment_finder.only_simple_this_property_assignments()
|
| && top_scope_->declarations()->length() == 0;
|
| @@ -1417,7 +1200,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
|
|
|
| case Token::SEMICOLON:
|
| Next();
|
| - return factory()->EmptyStatement();
|
| + return EmptyStatement();
|
|
|
| case Token::IF:
|
| stmt = ParseIfStatement(labels, ok);
|
| @@ -1465,7 +1248,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
|
| // one must take great care not to treat it as a
|
| // fall-through. It is much easier just to wrap the entire
|
| // try-statement in a statement block and put the labels there
|
| - Block* result = NEW(Block(labels, 1, false));
|
| + Block* result = new Block(labels, 1, false);
|
| Target target(&this->target_stack_, result);
|
| TryStatement* statement = ParseTryStatement(CHECK_OK);
|
| if (statement) {
|
| @@ -1495,11 +1278,11 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
|
| }
|
|
|
|
|
| -VariableProxy* AstBuildingParser::Declare(Handle<String> name,
|
| - Variable::Mode mode,
|
| - FunctionLiteral* fun,
|
| - bool resolve,
|
| - bool* ok) {
|
| +VariableProxy* Parser::Declare(Handle<String> name,
|
| + Variable::Mode mode,
|
| + FunctionLiteral* fun,
|
| + bool resolve,
|
| + bool* ok) {
|
| Variable* var = NULL;
|
| // If we are inside a function, a declaration of a variable
|
| // is a truly local variable, and the scope of the variable
|
| @@ -1554,13 +1337,13 @@ VariableProxy* AstBuildingParser::Declare(Handle<String> name,
|
| // a performance issue since it may lead to repeated
|
| // Runtime::DeclareContextSlot() calls.
|
| VariableProxy* proxy = top_scope_->NewUnresolved(name, inside_with());
|
| - top_scope_->AddDeclaration(NEW(Declaration(proxy, mode, fun)));
|
| + top_scope_->AddDeclaration(new Declaration(proxy, mode, fun));
|
|
|
| // For global const variables we bind the proxy to a variable.
|
| if (mode == Variable::CONST && top_scope_->is_global_scope()) {
|
| ASSERT(resolve); // should be set by all callers
|
| Variable::Kind kind = Variable::NORMAL;
|
| - var = NEW(Variable(top_scope_, name, Variable::CONST, true, kind));
|
| + var = new Variable(top_scope_, name, Variable::CONST, true, kind);
|
| }
|
|
|
| // If requested and we have a local variable, bind the proxy to the variable
|
| @@ -1619,8 +1402,6 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) {
|
| Expect(Token::RPAREN, CHECK_OK);
|
| Expect(Token::SEMICOLON, CHECK_OK);
|
|
|
| - if (is_pre_parsing_) return NULL;
|
| -
|
| // Make sure that the function containing the native declaration
|
| // isn't lazily compiled. The extension structures are only
|
| // accessible while parsing the first time not when reparsing
|
| @@ -1650,10 +1431,10 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) {
|
| // TODO(1240846): It's weird that native function declarations are
|
| // introduced dynamically when we meet their declarations, whereas
|
| // other functions are setup when entering the surrounding scope.
|
| - SharedFunctionInfoLiteral* lit = NEW(SharedFunctionInfoLiteral(shared));
|
| + SharedFunctionInfoLiteral* lit = new SharedFunctionInfoLiteral(shared);
|
| VariableProxy* var = Declare(name, Variable::VAR, NULL, true, CHECK_OK);
|
| - return NEW(ExpressionStatement(
|
| - new Assignment(Token::INIT_VAR, var, lit, RelocInfo::kNoPosition)));
|
| + return new ExpressionStatement(
|
| + new Assignment(Token::INIT_VAR, var, lit, RelocInfo::kNoPosition));
|
| }
|
|
|
|
|
| @@ -1671,7 +1452,7 @@ Statement* Parser::ParseFunctionDeclaration(bool* ok) {
|
| // scope, we treat is as such and introduce the function with it's
|
| // initial value upon entering the corresponding scope.
|
| Declare(name, Variable::VAR, fun, true, CHECK_OK);
|
| - return factory()->EmptyStatement();
|
| + return EmptyStatement();
|
| }
|
|
|
|
|
| @@ -1683,7 +1464,7 @@ Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) {
|
| // (ECMA-262, 3rd, 12.2)
|
| //
|
| // Construct block expecting 16 statements.
|
| - Block* result = NEW(Block(labels, 16, false));
|
| + Block* result = new Block(labels, 16, false);
|
| Target target(&this->target_stack_, result);
|
| Expect(Token::LBRACE, CHECK_OK);
|
| while (peek() != Token::RBRACE) {
|
| @@ -1742,7 +1523,7 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN,
|
| // is inside an initializer block, it is ignored.
|
| //
|
| // Create new block with one expected declaration.
|
| - Block* block = NEW(Block(NULL, 1, true));
|
| + Block* block = new Block(NULL, 1, true);
|
| VariableProxy* last_var = NULL; // the last variable declared
|
| int nvars = 0; // the number of variables declared
|
| do {
|
| @@ -1833,14 +1614,14 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN,
|
| // browsers where the global object (window) has lots of
|
| // properties defined in prototype objects.
|
|
|
| - if (!is_pre_parsing_ && top_scope_->is_global_scope()) {
|
| + if (top_scope_->is_global_scope()) {
|
| // Compute the arguments for the runtime call.
|
| ZoneList<Expression*>* arguments = new ZoneList<Expression*>(2);
|
| // Be careful not to assign a value to the global variable if
|
| // we're in a with. The initialization value should not
|
| // necessarily be stored in the global object in that case,
|
| // which is why we need to generate a separate assignment node.
|
| - arguments->Add(NEW(Literal(name))); // we have at least 1 parameter
|
| + arguments->Add(new Literal(name)); // we have at least 1 parameter
|
| if (is_const || (value != NULL && !inside_with())) {
|
| arguments->Add(value);
|
| value = NULL; // zap the value to avoid the unnecessary assignment
|
| @@ -1852,18 +1633,18 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN,
|
| CallRuntime* initialize;
|
| if (is_const) {
|
| initialize =
|
| - NEW(CallRuntime(
|
| + new CallRuntime(
|
| Factory::InitializeConstGlobal_symbol(),
|
| Runtime::FunctionForId(Runtime::kInitializeConstGlobal),
|
| - arguments));
|
| + arguments);
|
| } else {
|
| initialize =
|
| - NEW(CallRuntime(
|
| + new CallRuntime(
|
| Factory::InitializeVarGlobal_symbol(),
|
| Runtime::FunctionForId(Runtime::kInitializeVarGlobal),
|
| - arguments));
|
| + arguments);
|
| }
|
| - block->AddStatement(NEW(ExpressionStatement(initialize)));
|
| + block->AddStatement(new ExpressionStatement(initialize));
|
| }
|
|
|
| // Add an assignment node to the initialization statement block if
|
| @@ -1878,8 +1659,8 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN,
|
| // the top context for variables). Sigh...
|
| if (value != NULL) {
|
| Token::Value op = (is_const ? Token::INIT_CONST : Token::INIT_VAR);
|
| - Assignment* assignment = NEW(Assignment(op, last_var, value, position));
|
| - if (block) block->AddStatement(NEW(ExpressionStatement(assignment)));
|
| + Assignment* assignment = new Assignment(op, last_var, value, position);
|
| + if (block) block->AddStatement(new ExpressionStatement(assignment));
|
| }
|
|
|
| if (fni_ != NULL) fni_->Leave();
|
| @@ -1887,14 +1668,8 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN,
|
|
|
| if (!is_const && nvars == 1) {
|
| // We have a single, non-const variable.
|
| - if (is_pre_parsing_) {
|
| - // If we're preparsing then we need to set the var to something
|
| - // in order for for-in loops to parse correctly.
|
| - *var = ValidLeftHandSideSentinel::instance();
|
| - } else {
|
| - ASSERT(last_var != NULL);
|
| - *var = last_var;
|
| - }
|
| + ASSERT(last_var != NULL);
|
| + *var = last_var;
|
| }
|
|
|
| return block;
|
| @@ -1929,29 +1704,27 @@ Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels,
|
| // labels requires nontrivial changes to the way scopes are
|
| // structured. However, these are probably changes we want to
|
| // make later anyway so we should go back and fix this then.
|
| - if (!is_pre_parsing_) {
|
| - if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
|
| - SmartPointer<char> c_string = label->ToCString(DISALLOW_NULLS);
|
| - const char* elms[2] = { "Label", *c_string };
|
| - Vector<const char*> args(elms, 2);
|
| - ReportMessage("redeclaration", args);
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| - if (labels == NULL) labels = new ZoneStringList(4);
|
| - labels->Add(label);
|
| - // Remove the "ghost" variable that turned out to be a label
|
| - // from the top scope. This way, we don't try to resolve it
|
| - // during the scope processing.
|
| - top_scope_->RemoveUnresolved(var);
|
| + if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
|
| + SmartPointer<char> c_string = label->ToCString(DISALLOW_NULLS);
|
| + const char* elms[2] = { "Label", *c_string };
|
| + Vector<const char*> args(elms, 2);
|
| + ReportMessage("redeclaration", args);
|
| + *ok = false;
|
| + return NULL;
|
| }
|
| + if (labels == NULL) labels = new ZoneStringList(4);
|
| + labels->Add(label);
|
| + // Remove the "ghost" variable that turned out to be a label
|
| + // from the top scope. This way, we don't try to resolve it
|
| + // during the scope processing.
|
| + top_scope_->RemoveUnresolved(var);
|
| Expect(Token::COLON, CHECK_OK);
|
| return ParseStatement(labels, ok);
|
| }
|
|
|
| // Parsed expression statement.
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(ExpressionStatement(expr));
|
| + return new ExpressionStatement(expr);
|
| }
|
|
|
|
|
| @@ -1968,10 +1741,10 @@ IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) {
|
| if (peek() == Token::ELSE) {
|
| Next();
|
| else_statement = ParseStatement(labels, CHECK_OK);
|
| - } else if (!is_pre_parsing_) {
|
| - else_statement = factory()->EmptyStatement();
|
| + } else {
|
| + else_statement = EmptyStatement();
|
| }
|
| - return NEW(IfStatement(condition, then_statement, else_statement));
|
| + return new IfStatement(condition, then_statement, else_statement);
|
| }
|
|
|
|
|
| @@ -1987,19 +1760,17 @@ Statement* Parser::ParseContinueStatement(bool* ok) {
|
| label = ParseIdentifier(CHECK_OK);
|
| }
|
| IterationStatement* target = NULL;
|
| - if (!is_pre_parsing_) {
|
| - target = LookupContinueTarget(label, CHECK_OK);
|
| - if (target == NULL) {
|
| - // Illegal continue statement. To be consistent with KJS we delay
|
| - // reporting of the syntax error until runtime.
|
| - Handle<String> error_type = Factory::illegal_continue_symbol();
|
| - if (!label.is_null()) error_type = Factory::unknown_label_symbol();
|
| - Expression* throw_error = NewThrowSyntaxError(error_type, label);
|
| - return NEW(ExpressionStatement(throw_error));
|
| - }
|
| + target = LookupContinueTarget(label, CHECK_OK);
|
| + if (target == NULL) {
|
| + // Illegal continue statement. To be consistent with KJS we delay
|
| + // reporting of the syntax error until runtime.
|
| + Handle<String> error_type = Factory::illegal_continue_symbol();
|
| + if (!label.is_null()) error_type = Factory::unknown_label_symbol();
|
| + Expression* throw_error = NewThrowSyntaxError(error_type, label);
|
| + return new ExpressionStatement(throw_error);
|
| }
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(ContinueStatement(target));
|
| + return new ContinueStatement(target);
|
| }
|
|
|
|
|
| @@ -2017,22 +1788,20 @@ Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) {
|
| // Parse labeled break statements that target themselves into
|
| // empty statements, e.g. 'l1: l2: l3: break l2;'
|
| if (!label.is_null() && ContainsLabel(labels, label)) {
|
| - return factory()->EmptyStatement();
|
| + return EmptyStatement();
|
| }
|
| BreakableStatement* target = NULL;
|
| - if (!is_pre_parsing_) {
|
| - target = LookupBreakTarget(label, CHECK_OK);
|
| - if (target == NULL) {
|
| - // Illegal break statement. To be consistent with KJS we delay
|
| - // reporting of the syntax error until runtime.
|
| - Handle<String> error_type = Factory::illegal_break_symbol();
|
| - if (!label.is_null()) error_type = Factory::unknown_label_symbol();
|
| - Expression* throw_error = NewThrowSyntaxError(error_type, label);
|
| - return NEW(ExpressionStatement(throw_error));
|
| - }
|
| + target = LookupBreakTarget(label, CHECK_OK);
|
| + if (target == NULL) {
|
| + // Illegal break statement. To be consistent with KJS we delay
|
| + // reporting of the syntax error until runtime.
|
| + Handle<String> error_type = Factory::illegal_break_symbol();
|
| + if (!label.is_null()) error_type = Factory::unknown_label_symbol();
|
| + Expression* throw_error = NewThrowSyntaxError(error_type, label);
|
| + return new ExpressionStatement(throw_error);
|
| }
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(BreakStatement(target));
|
| + return new BreakStatement(target);
|
| }
|
|
|
|
|
| @@ -2050,10 +1819,10 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| // function. See ECMA-262, section 12.9, page 67.
|
| //
|
| // To be consistent with KJS we report the syntax error at runtime.
|
| - if (!is_pre_parsing_ && !top_scope_->is_function_scope()) {
|
| + if (!top_scope_->is_function_scope()) {
|
| Handle<String> type = Factory::illegal_return_symbol();
|
| Expression* throw_error = NewThrowSyntaxError(type, Handle<Object>::null());
|
| - return NEW(ExpressionStatement(throw_error));
|
| + return new ExpressionStatement(throw_error);
|
| }
|
|
|
| Token::Value tok = peek();
|
| @@ -2062,12 +1831,12 @@ Statement* Parser::ParseReturnStatement(bool* ok) {
|
| tok == Token::RBRACE ||
|
| tok == Token::EOS) {
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(ReturnStatement(GetLiteralUndefined()));
|
| + return new ReturnStatement(GetLiteralUndefined());
|
| }
|
|
|
| Expression* expr = ParseExpression(true, CHECK_OK);
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(ReturnStatement(expr));
|
| + return new ReturnStatement(expr);
|
| }
|
|
|
|
|
| @@ -2076,7 +1845,7 @@ Block* Parser::WithHelper(Expression* obj,
|
| bool is_catch_block,
|
| bool* ok) {
|
| // Parse the statement and collect escaping labels.
|
| - ZoneList<BreakTarget*>* target_list = NEW(ZoneList<BreakTarget*>(0));
|
| + ZoneList<BreakTarget*>* target_list = new ZoneList<BreakTarget*>(0);
|
| TargetCollector collector(target_list);
|
| Statement* stat;
|
| { Target target(&this->target_stack_, &collector);
|
| @@ -2088,21 +1857,21 @@ Block* Parser::WithHelper(Expression* obj,
|
| // Create resulting block with two statements.
|
| // 1: Evaluate the with expression.
|
| // 2: The try-finally block evaluating the body.
|
| - Block* result = NEW(Block(NULL, 2, false));
|
| + Block* result = new Block(NULL, 2, false);
|
|
|
| if (result != NULL) {
|
| - result->AddStatement(NEW(WithEnterStatement(obj, is_catch_block)));
|
| + result->AddStatement(new WithEnterStatement(obj, is_catch_block));
|
|
|
| // Create body block.
|
| - Block* body = NEW(Block(NULL, 1, false));
|
| + Block* body = new Block(NULL, 1, false);
|
| body->AddStatement(stat);
|
|
|
| // Create exit block.
|
| - Block* exit = NEW(Block(NULL, 1, false));
|
| - exit->AddStatement(NEW(WithExitStatement()));
|
| + Block* exit = new Block(NULL, 1, false);
|
| + exit->AddStatement(new WithExitStatement());
|
|
|
| // Return a try-finally statement.
|
| - TryFinallyStatement* wrapper = NEW(TryFinallyStatement(body, exit));
|
| + TryFinallyStatement* wrapper = new TryFinallyStatement(body, exit);
|
| wrapper->set_escaping_targets(collector.targets());
|
| result->AddStatement(wrapper);
|
| }
|
| @@ -2144,15 +1913,15 @@ CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) {
|
| }
|
| Expect(Token::COLON, CHECK_OK);
|
|
|
| - ZoneListWrapper<Statement> statements = factory()->NewList<Statement>(5);
|
| + ZoneList<Statement*>* statements = new ZoneList<Statement*>(5);
|
| while (peek() != Token::CASE &&
|
| peek() != Token::DEFAULT &&
|
| peek() != Token::RBRACE) {
|
| Statement* stat = ParseStatement(NULL, CHECK_OK);
|
| - statements.Add(stat);
|
| + statements->Add(stat);
|
| }
|
|
|
| - return NEW(CaseClause(label, statements.elements()));
|
| + return new CaseClause(label, statements);
|
| }
|
|
|
|
|
| @@ -2161,7 +1930,7 @@ SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels,
|
| // SwitchStatement ::
|
| // 'switch' '(' Expression ')' '{' CaseClause* '}'
|
|
|
| - SwitchStatement* statement = NEW(SwitchStatement(labels));
|
| + SwitchStatement* statement = new SwitchStatement(labels);
|
| Target target(&this->target_stack_, statement);
|
|
|
| Expect(Token::SWITCH, CHECK_OK);
|
| @@ -2170,15 +1939,15 @@ SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels,
|
| Expect(Token::RPAREN, CHECK_OK);
|
|
|
| bool default_seen = false;
|
| - ZoneListWrapper<CaseClause> cases = factory()->NewList<CaseClause>(4);
|
| + ZoneList<CaseClause*>* cases = new ZoneList<CaseClause*>(4);
|
| Expect(Token::LBRACE, CHECK_OK);
|
| while (peek() != Token::RBRACE) {
|
| CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK);
|
| - cases.Add(clause);
|
| + cases->Add(clause);
|
| }
|
| Expect(Token::RBRACE, CHECK_OK);
|
|
|
| - if (statement) statement->Initialize(tag, cases.elements());
|
| + if (statement) statement->Initialize(tag, cases);
|
| return statement;
|
| }
|
|
|
| @@ -2197,7 +1966,7 @@ Statement* Parser::ParseThrowStatement(bool* ok) {
|
| Expression* exception = ParseExpression(true, CHECK_OK);
|
| ExpectSemicolon(CHECK_OK);
|
|
|
| - return NEW(ExpressionStatement(new Throw(exception, pos)));
|
| + return new ExpressionStatement(new Throw(exception, pos));
|
| }
|
|
|
|
|
| @@ -2215,7 +1984,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
|
|
| Expect(Token::TRY, CHECK_OK);
|
|
|
| - ZoneList<BreakTarget*>* target_list = NEW(ZoneList<BreakTarget*>(0));
|
| + ZoneList<BreakTarget*>* target_list = new ZoneList<BreakTarget*>(0);
|
| TargetCollector collector(target_list);
|
| Block* try_block;
|
|
|
| @@ -2238,7 +2007,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
| // then we will need to collect jump targets from the catch block. Since
|
| // we don't know yet if there will be a finally block, we always collect
|
| // the jump targets.
|
| - ZoneList<BreakTarget*>* catch_target_list = NEW(ZoneList<BreakTarget*>(0));
|
| + ZoneList<BreakTarget*>* catch_target_list = new ZoneList<BreakTarget*>(0);
|
| TargetCollector catch_collector(catch_target_list);
|
| bool has_catch = false;
|
| if (tok == Token::CATCH) {
|
| @@ -2253,8 +2022,8 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
| // Allocate a temporary for holding the finally state while
|
| // executing the finally block.
|
| catch_var = top_scope_->NewTemporary(Factory::catch_var_symbol());
|
| - Literal* name_literal = NEW(Literal(name));
|
| - Expression* obj = NEW(CatchExtensionObject(name_literal, catch_var));
|
| + Literal* name_literal = new Literal(name);
|
| + Expression* obj = new CatchExtensionObject(name_literal, catch_var);
|
| { Target target(&this->target_stack_, &catch_collector);
|
| catch_block = WithHelper(obj, NULL, true, CHECK_OK);
|
| }
|
| @@ -2277,30 +2046,28 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
| // to:
|
| // 'try { try { } catch { } } finally { }'
|
|
|
| - if (!is_pre_parsing_ && catch_block != NULL && finally_block != NULL) {
|
| + if (catch_block != NULL && finally_block != NULL) {
|
| TryCatchStatement* statement =
|
| - NEW(TryCatchStatement(try_block, catch_var, catch_block));
|
| + new TryCatchStatement(try_block, catch_var, catch_block);
|
| statement->set_escaping_targets(collector.targets());
|
| - try_block = NEW(Block(NULL, 1, false));
|
| + try_block = new Block(NULL, 1, false);
|
| try_block->AddStatement(statement);
|
| catch_block = NULL;
|
| }
|
|
|
| TryStatement* result = NULL;
|
| - if (!is_pre_parsing_) {
|
| - if (catch_block != NULL) {
|
| - ASSERT(finally_block == NULL);
|
| - result = NEW(TryCatchStatement(try_block, catch_var, catch_block));
|
| - result->set_escaping_targets(collector.targets());
|
| - } else {
|
| - ASSERT(finally_block != NULL);
|
| - result = NEW(TryFinallyStatement(try_block, finally_block));
|
| - // Add the jump targets of the try block and the catch block.
|
| - for (int i = 0; i < collector.targets()->length(); i++) {
|
| - catch_collector.AddTarget(collector.targets()->at(i));
|
| - }
|
| - result->set_escaping_targets(catch_collector.targets());
|
| + if (catch_block != NULL) {
|
| + ASSERT(finally_block == NULL);
|
| + result = new TryCatchStatement(try_block, catch_var, catch_block);
|
| + result->set_escaping_targets(collector.targets());
|
| + } else {
|
| + ASSERT(finally_block != NULL);
|
| + result = new TryFinallyStatement(try_block, finally_block);
|
| + // Add the jump targets of the try block and the catch block.
|
| + for (int i = 0; i < collector.targets()->length(); i++) {
|
| + catch_collector.AddTarget(collector.targets()->at(i));
|
| }
|
| + result->set_escaping_targets(catch_collector.targets());
|
| }
|
|
|
| return result;
|
| @@ -2313,7 +2080,7 @@ DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels,
|
| // 'do' Statement 'while' '(' Expression ')' ';'
|
|
|
| temp_scope_->AddLoop();
|
| - DoWhileStatement* loop = NEW(DoWhileStatement(labels));
|
| + DoWhileStatement* loop = new DoWhileStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| Expect(Token::DO, CHECK_OK);
|
| @@ -2346,7 +2113,7 @@ WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) {
|
| // 'while' '(' Expression ')' Statement
|
|
|
| temp_scope_->AddLoop();
|
| - WhileStatement* loop = NEW(WhileStatement(labels));
|
| + WhileStatement* loop = new WhileStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| Expect(Token::WHILE, CHECK_OK);
|
| @@ -2376,7 +2143,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| Block* variable_statement =
|
| ParseVariableDeclarations(false, &each, CHECK_OK);
|
| if (peek() == Token::IN && each != NULL) {
|
| - ForInStatement* loop = NEW(ForInStatement(labels));
|
| + ForInStatement* loop = new ForInStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| Expect(Token::IN, CHECK_OK);
|
| @@ -2384,17 +2151,12 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| Expect(Token::RPAREN, CHECK_OK);
|
|
|
| Statement* body = ParseStatement(NULL, CHECK_OK);
|
| - if (is_pre_parsing_) {
|
| - return NULL;
|
| - } else {
|
| - loop->Initialize(each, enumerable, body);
|
| - Block* result = NEW(Block(NULL, 2, false));
|
| - result->AddStatement(variable_statement);
|
| - result->AddStatement(loop);
|
| - // Parsed for-in loop w/ variable/const declaration.
|
| - return result;
|
| - }
|
| -
|
| + loop->Initialize(each, enumerable, body);
|
| + Block* result = new Block(NULL, 2, false);
|
| + result->AddStatement(variable_statement);
|
| + result->AddStatement(loop);
|
| + // Parsed for-in loop w/ variable/const declaration.
|
| + return result;
|
| } else {
|
| init = variable_statement;
|
| }
|
| @@ -2410,7 +2172,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| Handle<String> type = Factory::invalid_lhs_in_for_in_symbol();
|
| expression = NewThrowReferenceError(type);
|
| }
|
| - ForInStatement* loop = NEW(ForInStatement(labels));
|
| + ForInStatement* loop = new ForInStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| Expect(Token::IN, CHECK_OK);
|
| @@ -2423,13 +2185,13 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| return loop;
|
|
|
| } else {
|
| - init = NEW(ExpressionStatement(expression));
|
| + init = new ExpressionStatement(expression);
|
| }
|
| }
|
| }
|
|
|
| // Standard 'for' loop
|
| - ForStatement* loop = NEW(ForStatement(labels));
|
| + ForStatement* loop = new ForStatement(labels);
|
| Target target(&this->target_stack_, loop);
|
|
|
| // Parsed initializer at this point.
|
| @@ -2445,7 +2207,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
|
| Statement* next = NULL;
|
| if (peek() != Token::RPAREN) {
|
| Expression* exp = ParseExpression(true, CHECK_OK);
|
| - next = NEW(ExpressionStatement(exp));
|
| + next = new ExpressionStatement(exp);
|
| }
|
| Expect(Token::RPAREN, CHECK_OK);
|
|
|
| @@ -2466,7 +2228,7 @@ Expression* Parser::ParseExpression(bool accept_IN, bool* ok) {
|
| Expect(Token::COMMA, CHECK_OK);
|
| int position = scanner().location().beg_pos;
|
| Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| - result = NEW(BinaryOperation(Token::COMMA, result, right, position));
|
| + result = new BinaryOperation(Token::COMMA, result, right, position);
|
| }
|
| return result;
|
| }
|
| @@ -2526,7 +2288,7 @@ Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) {
|
| fni_->Leave();
|
| }
|
|
|
| - return NEW(Assignment(op, expression, right, pos));
|
| + return new Assignment(op, expression, right, pos);
|
| }
|
|
|
|
|
| @@ -2548,8 +2310,8 @@ Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) {
|
| Expect(Token::COLON, CHECK_OK);
|
| int right_position = scanner().peek_location().beg_pos;
|
| Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| - return NEW(Conditional(expression, left, right,
|
| - left_position, right_position));
|
| + return new Conditional(expression, left, right,
|
| + left_position, right_position);
|
| }
|
|
|
|
|
| @@ -2656,12 +2418,12 @@ Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) {
|
| x = NewCompareNode(cmp, x, y, position);
|
| if (cmp != op) {
|
| // The comparison was negated - add a NOT.
|
| - x = NEW(UnaryOperation(Token::NOT, x));
|
| + x = new UnaryOperation(Token::NOT, x);
|
| }
|
|
|
| } else {
|
| // We have a "normal" binary operation.
|
| - x = NEW(BinaryOperation(op, x, y, position));
|
| + x = new BinaryOperation(op, x, y, position);
|
| }
|
| }
|
| }
|
| @@ -2674,19 +2436,19 @@ Expression* Parser::NewCompareNode(Token::Value op,
|
| Expression* y,
|
| int position) {
|
| ASSERT(op != Token::NE && op != Token::NE_STRICT);
|
| - if (!is_pre_parsing_ && (op == Token::EQ || op == Token::EQ_STRICT)) {
|
| + if (op == Token::EQ || op == Token::EQ_STRICT) {
|
| bool is_strict = (op == Token::EQ_STRICT);
|
| Literal* x_literal = x->AsLiteral();
|
| if (x_literal != NULL && x_literal->IsNull()) {
|
| - return NEW(CompareToNull(is_strict, y));
|
| + return new CompareToNull(is_strict, y);
|
| }
|
|
|
| Literal* y_literal = y->AsLiteral();
|
| if (y_literal != NULL && y_literal->IsNull()) {
|
| - return NEW(CompareToNull(is_strict, x));
|
| + return new CompareToNull(is_strict, x);
|
| }
|
| }
|
| - return NEW(CompareOperation(op, x, y, position));
|
| + return new CompareOperation(op, x, y, position);
|
| }
|
|
|
|
|
| @@ -2723,7 +2485,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) {
|
| }
|
| }
|
|
|
| - return NEW(UnaryOperation(op, expression));
|
| + return new UnaryOperation(op, expression);
|
|
|
| } else if (Token::IsCountOp(op)) {
|
| op = Next();
|
| @@ -2737,8 +2499,8 @@ Expression* Parser::ParseUnaryExpression(bool* ok) {
|
| expression = NewThrowReferenceError(type);
|
| }
|
| int position = scanner().location().beg_pos;
|
| - IncrementOperation* increment = NEW(IncrementOperation(op, expression));
|
| - return NEW(CountOperation(true /* prefix */, increment, position));
|
| + IncrementOperation* increment = new IncrementOperation(op, expression);
|
| + return new CountOperation(true /* prefix */, increment, position);
|
|
|
| } else {
|
| return ParsePostfixExpression(ok);
|
| @@ -2762,8 +2524,8 @@ Expression* Parser::ParsePostfixExpression(bool* ok) {
|
| }
|
| Token::Value next = Next();
|
| int position = scanner().location().beg_pos;
|
| - IncrementOperation* increment = NEW(IncrementOperation(next, expression));
|
| - expression = NEW(CountOperation(false /* postfix */, increment, position));
|
| + IncrementOperation* increment = new IncrementOperation(next, expression);
|
| + expression = new CountOperation(false /* postfix */, increment, position);
|
| }
|
| return expression;
|
| }
|
| @@ -2786,7 +2548,7 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) {
|
| Consume(Token::LBRACK);
|
| int pos = scanner().location().beg_pos;
|
| Expression* index = ParseExpression(true, CHECK_OK);
|
| - result = factory()->NewProperty(result, index, pos);
|
| + result = new Property(result, index, pos);
|
| Expect(Token::RBRACK, CHECK_OK);
|
| break;
|
| }
|
| @@ -2803,17 +2565,15 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) {
|
| // declared in the current scope chain. These calls are marked as
|
| // potentially direct eval calls. Whether they are actually direct calls
|
| // to eval is determined at run time.
|
| - if (!is_pre_parsing_) {
|
| - VariableProxy* callee = result->AsVariableProxy();
|
| - if (callee != NULL && callee->IsVariable(Factory::eval_symbol())) {
|
| - Handle<String> name = callee->name();
|
| - Variable* var = top_scope_->Lookup(name);
|
| - if (var == NULL) {
|
| - top_scope_->RecordEvalCall();
|
| - }
|
| + VariableProxy* callee = result->AsVariableProxy();
|
| + if (callee != NULL && callee->IsVariable(Factory::eval_symbol())) {
|
| + Handle<String> name = callee->name();
|
| + Variable* var = top_scope_->Lookup(name);
|
| + if (var == NULL) {
|
| + top_scope_->RecordEvalCall();
|
| }
|
| }
|
| - result = factory()->NewCall(result, args, pos);
|
| + result = NewCall(result, args, pos);
|
| break;
|
| }
|
|
|
| @@ -2821,7 +2581,7 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) {
|
| Consume(Token::PERIOD);
|
| int pos = scanner().location().beg_pos;
|
| Handle<String> name = ParseIdentifierName(CHECK_OK);
|
| - result = factory()->NewProperty(result, NEW(Literal(name)), pos);
|
| + result = new Property(result, new Literal(name), pos);
|
| if (fni_ != NULL) fni_->PushLiteralName(name);
|
| break;
|
| }
|
| @@ -2833,7 +2593,6 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) {
|
| }
|
|
|
|
|
| -
|
| Expression* Parser::ParseNewPrefix(PositionStack* stack, bool* ok) {
|
| // NewExpression ::
|
| // ('new')+ MemberExpression
|
| @@ -2858,7 +2617,7 @@ Expression* Parser::ParseNewPrefix(PositionStack* stack, bool* ok) {
|
|
|
| if (!stack->is_empty()) {
|
| int last = stack->pop();
|
| - result = NEW(CallNew(result, new ZoneList<Expression*>(0), last));
|
| + result = new CallNew(result, new ZoneList<Expression*>(0), last);
|
| }
|
| return result;
|
| }
|
| @@ -2900,7 +2659,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| Consume(Token::LBRACK);
|
| int pos = scanner().location().beg_pos;
|
| Expression* index = ParseExpression(true, CHECK_OK);
|
| - result = factory()->NewProperty(result, index, pos);
|
| + result = new Property(result, index, pos);
|
| Expect(Token::RBRACK, CHECK_OK);
|
| break;
|
| }
|
| @@ -2908,7 +2667,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| Consume(Token::PERIOD);
|
| int pos = scanner().location().beg_pos;
|
| Handle<String> name = ParseIdentifierName(CHECK_OK);
|
| - result = factory()->NewProperty(result, NEW(Literal(name)), pos);
|
| + result = new Property(result, new Literal(name), pos);
|
| if (fni_ != NULL) fni_->PushLiteralName(name);
|
| break;
|
| }
|
| @@ -2917,7 +2676,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| // Consume one of the new prefixes (already parsed).
|
| ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
|
| int last = stack->pop();
|
| - result = NEW(CallNew(result, args, last));
|
| + result = new CallNew(result, args, last);
|
| break;
|
| }
|
| default:
|
| @@ -2936,7 +2695,7 @@ DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) {
|
|
|
| Expect(Token::DEBUGGER, CHECK_OK);
|
| ExpectSemicolon(CHECK_OK);
|
| - return NEW(DebuggerStatement());
|
| + return new DebuggerStatement();
|
| }
|
|
|
|
|
| @@ -2994,38 +2753,30 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) {
|
| switch (peek()) {
|
| case Token::THIS: {
|
| Consume(Token::THIS);
|
| - if (is_pre_parsing_) {
|
| - result = VariableProxySentinel::this_proxy();
|
| - } else {
|
| - VariableProxy* recv = top_scope_->receiver();
|
| - result = recv;
|
| - }
|
| + VariableProxy* recv = top_scope_->receiver();
|
| + result = recv;
|
| break;
|
| }
|
|
|
| case Token::NULL_LITERAL:
|
| Consume(Token::NULL_LITERAL);
|
| - result = NEW(Literal(Factory::null_value()));
|
| + result = new Literal(Factory::null_value());
|
| break;
|
|
|
| case Token::TRUE_LITERAL:
|
| Consume(Token::TRUE_LITERAL);
|
| - result = NEW(Literal(Factory::true_value()));
|
| + result = new Literal(Factory::true_value());
|
| break;
|
|
|
| case Token::FALSE_LITERAL:
|
| Consume(Token::FALSE_LITERAL);
|
| - result = NEW(Literal(Factory::false_value()));
|
| + result = new Literal(Factory::false_value());
|
| break;
|
|
|
| case Token::IDENTIFIER: {
|
| Handle<String> name = ParseIdentifier(CHECK_OK);
|
| if (fni_ != NULL) fni_->PushVariableName(name);
|
| - if (is_pre_parsing_) {
|
| - result = VariableProxySentinel::identifier_proxy();
|
| - } else {
|
| - result = top_scope_->NewUnresolved(name, inside_with());
|
| - }
|
| + result = top_scope_->NewUnresolved(name, inside_with());
|
| break;
|
| }
|
|
|
| @@ -3040,7 +2791,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) {
|
| case Token::STRING: {
|
| Consume(Token::STRING);
|
| Handle<String> symbol = GetSymbol(CHECK_OK);
|
| - result = NEW(Literal(symbol));
|
| + result = new Literal(symbol);
|
| if (fni_ != NULL) fni_->PushLiteralName(symbol);
|
| break;
|
| }
|
| @@ -3118,7 +2869,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
|
| // ArrayLiteral ::
|
| // '[' Expression? (',' Expression?)* ']'
|
|
|
| - ZoneListWrapper<Expression> values = factory()->NewList<Expression>(4);
|
| + ZoneList<Expression*>* values = new ZoneList<Expression*>(4);
|
| Expect(Token::LBRACK, CHECK_OK);
|
| while (peek() != Token::RBRACK) {
|
| Expression* elem;
|
| @@ -3127,7 +2878,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
|
| } else {
|
| elem = ParseAssignmentExpression(true, CHECK_OK);
|
| }
|
| - values.Add(elem);
|
| + values->Add(elem);
|
| if (peek() != Token::RBRACK) {
|
| Expect(Token::COMMA, CHECK_OK);
|
| }
|
| @@ -3137,21 +2888,19 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
|
| // Update the scope information before the pre-parsing bailout.
|
| int literal_index = temp_scope_->NextMaterializedLiteralIndex();
|
|
|
| - if (is_pre_parsing_) return NULL;
|
| -
|
| // Allocate a fixed array with all the literals.
|
| Handle<FixedArray> literals =
|
| - Factory::NewFixedArray(values.length(), TENURED);
|
| + Factory::NewFixedArray(values->length(), TENURED);
|
|
|
| // Fill in the literals.
|
| bool is_simple = true;
|
| int depth = 1;
|
| - for (int i = 0; i < values.length(); i++) {
|
| - MaterializedLiteral* m_literal = values.at(i)->AsMaterializedLiteral();
|
| + for (int i = 0, n = values->length(); i < n; i++) {
|
| + MaterializedLiteral* m_literal = values->at(i)->AsMaterializedLiteral();
|
| if (m_literal != NULL && m_literal->depth() + 1 > depth) {
|
| depth = m_literal->depth() + 1;
|
| }
|
| - Handle<Object> boilerplate_value = GetBoilerplateValue(values.at(i));
|
| + Handle<Object> boilerplate_value = GetBoilerplateValue(values->at(i));
|
| if (boilerplate_value->IsUndefined()) {
|
| literals->set_the_hole(i);
|
| is_simple = false;
|
| @@ -3162,12 +2911,12 @@ Expression* Parser::ParseArrayLiteral(bool* ok) {
|
|
|
| // Simple and shallow arrays can be lazily copied, we transform the
|
| // elements array to a copy-on-write array.
|
| - if (is_simple && depth == 1 && values.length() > 0) {
|
| + if (is_simple && depth == 1 && values->length() > 0) {
|
| literals->set_map(Heap::fixed_cow_array_map());
|
| }
|
|
|
| - return NEW(ArrayLiteral(literals, values.elements(),
|
| - literal_index, is_simple, depth));
|
| + return new ArrayLiteral(literals, values,
|
| + literal_index, is_simple, depth);
|
| }
|
|
|
|
|
| @@ -3314,7 +3063,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter,
|
| DECLARATION,
|
| CHECK_OK);
|
| ObjectLiteral::Property* property =
|
| - NEW(ObjectLiteral::Property(is_getter, value));
|
| + new ObjectLiteral::Property(is_getter, value);
|
| return property;
|
| } else {
|
| ReportUnexpectedToken(next);
|
| @@ -3331,8 +3080,8 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
|
| // )*[','] '}'
|
|
|
| - ZoneListWrapper<ObjectLiteral::Property> properties =
|
| - factory()->NewList<ObjectLiteral::Property>(4);
|
| + ZoneList<ObjectLiteral::Property*>* properties =
|
| + new ZoneList<ObjectLiteral::Property*>(4);
|
| int number_of_boilerplate_properties = 0;
|
|
|
| Expect(Token::LBRACE, CHECK_OK);
|
| @@ -3355,7 +3104,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| if (IsBoilerplateProperty(property)) {
|
| number_of_boilerplate_properties++;
|
| }
|
| - properties.Add(property);
|
| + properties->Add(property);
|
| if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
|
|
|
| if (fni_ != NULL) {
|
| @@ -3366,7 +3115,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| }
|
| // Failed to parse as get/set property, so it's just a property
|
| // called "get" or "set".
|
| - key = NEW(Literal(id));
|
| + key = new Literal(id);
|
| break;
|
| }
|
| case Token::STRING: {
|
| @@ -3378,7 +3127,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| key = NewNumberLiteral(index);
|
| break;
|
| }
|
| - key = NEW(Literal(string));
|
| + key = new Literal(string);
|
| break;
|
| }
|
| case Token::NUMBER: {
|
| @@ -3392,7 +3141,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| if (Token::IsKeyword(next)) {
|
| Consume(next);
|
| Handle<String> string = GetSymbol(CHECK_OK);
|
| - key = NEW(Literal(string));
|
| + key = new Literal(string);
|
| } else {
|
| // Unexpected token.
|
| Token::Value next = Next();
|
| @@ -3406,11 +3155,11 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| Expression* value = ParseAssignmentExpression(true, CHECK_OK);
|
|
|
| ObjectLiteral::Property* property =
|
| - NEW(ObjectLiteral::Property(key, value));
|
| + new ObjectLiteral::Property(key, value);
|
|
|
| // Count CONSTANT or COMPUTED properties to maintain the enumeration order.
|
| if (IsBoilerplateProperty(property)) number_of_boilerplate_properties++;
|
| - properties.Add(property);
|
| + properties->Add(property);
|
|
|
| // TODO(1240767): Consider allowing trailing comma.
|
| if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
|
| @@ -3423,7 +3172,6 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| Expect(Token::RBRACE, CHECK_OK);
|
| // Computation of literal_index must happen before pre parse bailout.
|
| int literal_index = temp_scope_->NextMaterializedLiteralIndex();
|
| - if (is_pre_parsing_) return NULL;
|
|
|
| Handle<FixedArray> constant_properties =
|
| Factory::NewFixedArray(number_of_boilerplate_properties * 2, TENURED);
|
| @@ -3431,13 +3179,13 @@ Expression* Parser::ParseObjectLiteral(bool* ok) {
|
| bool is_simple = true;
|
| bool fast_elements = true;
|
| int depth = 1;
|
| - BuildObjectLiteralConstantProperties(properties.elements(),
|
| + BuildObjectLiteralConstantProperties(properties,
|
| constant_properties,
|
| &is_simple,
|
| &fast_elements,
|
| &depth);
|
| return new ObjectLiteral(constant_properties,
|
| - properties.elements(),
|
| + properties,
|
| literal_index,
|
| is_simple,
|
| fast_elements,
|
| @@ -3455,19 +3203,6 @@ Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) {
|
|
|
| int literal_index = temp_scope_->NextMaterializedLiteralIndex();
|
|
|
| - if (is_pre_parsing_) {
|
| - // If we're preparsing we just do all the parsing stuff without
|
| - // building anything.
|
| - if (!scanner_.ScanRegExpFlags()) {
|
| - Next();
|
| - ReportMessage("invalid_regexp_flags", Vector<const char*>::empty());
|
| - *ok = false;
|
| - return NULL;
|
| - }
|
| - Next();
|
| - return NULL;
|
| - }
|
| -
|
| Handle<String> js_pattern =
|
| Factory::NewStringFromUtf8(scanner_.next_literal(), TENURED);
|
| scanner_.ScanRegExpFlags();
|
| @@ -3483,17 +3218,17 @@ ZoneList<Expression*>* Parser::ParseArguments(bool* ok) {
|
| // Arguments ::
|
| // '(' (AssignmentExpression)*[','] ')'
|
|
|
| - ZoneListWrapper<Expression> result = factory()->NewList<Expression>(4);
|
| + ZoneList<Expression*>* result = new ZoneList<Expression*>(4);
|
| Expect(Token::LPAREN, CHECK_OK);
|
| bool done = (peek() == Token::RPAREN);
|
| while (!done) {
|
| Expression* argument = ParseAssignmentExpression(true, CHECK_OK);
|
| - result.Add(argument);
|
| + result->Add(argument);
|
| done = (peek() == Token::RPAREN);
|
| if (!done) Expect(Token::COMMA, CHECK_OK);
|
| }
|
| Expect(Token::RPAREN, CHECK_OK);
|
| - return result.elements();
|
| + return result;
|
| }
|
|
|
|
|
| @@ -3509,9 +3244,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| // this is the actual function name, otherwise this is the name of the
|
| // variable declared and initialized with the function (expression). In
|
| // that case, we don't have a function name (it's empty).
|
| - Handle<String> name = is_named ? var_name : factory()->EmptySymbol();
|
| + Handle<String> name = is_named ? var_name : Factory::empty_symbol();
|
| // The function name, if any.
|
| - Handle<String> function_name = factory()->EmptySymbol();
|
| + Handle<String> function_name = Factory::empty_symbol();
|
| if (is_named && (type == EXPRESSION || type == NESTED)) {
|
| function_name = name;
|
| }
|
| @@ -3519,7 +3254,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| int num_parameters = 0;
|
| // Parse function body.
|
| { Scope* scope =
|
| - factory()->NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with());
|
| + NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with());
|
| LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
|
| scope);
|
| TemporaryScope temp_scope(&this->temp_scope_);
|
| @@ -3532,18 +3267,16 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| bool done = (peek() == Token::RPAREN);
|
| while (!done) {
|
| Handle<String> param_name = ParseIdentifier(CHECK_OK);
|
| - if (!is_pre_parsing_) {
|
| - top_scope_->AddParameter(top_scope_->DeclareLocal(param_name,
|
| - Variable::VAR));
|
| - num_parameters++;
|
| - }
|
| + top_scope_->AddParameter(top_scope_->DeclareLocal(param_name,
|
| + Variable::VAR));
|
| + num_parameters++;
|
| done = (peek() == Token::RPAREN);
|
| if (!done) Expect(Token::COMMA, CHECK_OK);
|
| }
|
| Expect(Token::RPAREN, CHECK_OK);
|
|
|
| Expect(Token::LBRACE, CHECK_OK);
|
| - ZoneListWrapper<Statement> body = factory()->NewList<Statement>(8);
|
| + ZoneList<Statement*>* body = new ZoneList<Statement*>(8);
|
|
|
| // If we have a named function expression, we add a local variable
|
| // declaration to the body of the function with the name of the
|
| @@ -3551,17 +3284,15 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| // NOTE: We create a proxy and resolve it here so that in the
|
| // future we can change the AST to only refer to VariableProxies
|
| // instead of Variables and Proxis as is the case now.
|
| - if (!is_pre_parsing_
|
| - && !function_name.is_null()
|
| - && function_name->length() > 0) {
|
| + if (!function_name.is_null() && function_name->length() > 0) {
|
| Variable* fvar = top_scope_->DeclareFunctionVar(function_name);
|
| VariableProxy* fproxy =
|
| top_scope_->NewUnresolved(function_name, inside_with());
|
| fproxy->BindTo(fvar);
|
| - body.Add(new ExpressionStatement(
|
| - new Assignment(Token::INIT_CONST, fproxy,
|
| - NEW(ThisFunction()),
|
| - RelocInfo::kNoPosition)));
|
| + body->Add(new ExpressionStatement(
|
| + new Assignment(Token::INIT_CONST, fproxy,
|
| + new ThisFunction(),
|
| + RelocInfo::kNoPosition)));
|
| }
|
|
|
| // Determine if the function will be lazily compiled. The mode can
|
| @@ -3593,11 +3324,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| this_property_assignments = Factory::empty_fixed_array();
|
| Expect(Token::RBRACE, CHECK_OK);
|
| } else {
|
| - FunctionEntry entry;
|
| - {
|
| - ConditionalLogPauseScope pause_if(is_lazily_compiled, log());
|
| - ParseSourceElements(&body, Token::RBRACE, CHECK_OK);
|
| - }
|
| + ParseSourceElements(body, Token::RBRACE, CHECK_OK);
|
| +
|
| materialized_literal_count = temp_scope.materialized_literal_count();
|
| expected_property_count = temp_scope.expected_property_count();
|
| only_simple_this_property_assignments =
|
| @@ -3606,18 +3334,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
|
|
| Expect(Token::RBRACE, CHECK_OK);
|
| end_pos = scanner_.location().end_pos;
|
| - if (is_pre_parsing_ && is_lazily_compiled) {
|
| - ASSERT(is_pre_parsing_);
|
| - log()->LogFunction(function_block_pos, end_pos,
|
| - materialized_literal_count,
|
| - expected_property_count);
|
| - }
|
| }
|
|
|
| FunctionLiteral* function_literal =
|
| - NEW(FunctionLiteral(name,
|
| + new FunctionLiteral(name,
|
| top_scope_,
|
| - body.elements(),
|
| + body,
|
| materialized_literal_count,
|
| expected_property_count,
|
| only_simple_this_property_assignments,
|
| @@ -3626,10 +3348,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name,
|
| start_pos,
|
| end_pos,
|
| function_name->length() > 0,
|
| - temp_scope.ContainsLoops()));
|
| - if (!is_pre_parsing_) {
|
| - function_literal->set_function_token_position(function_token_position);
|
| - }
|
| + temp_scope.ContainsLoops());
|
| + function_literal->set_function_token_position(function_token_position);
|
|
|
| if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal);
|
| return function_literal;
|
| @@ -3644,7 +3364,6 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) {
|
| Expect(Token::MOD, CHECK_OK);
|
| Handle<String> name = ParseIdentifier(CHECK_OK);
|
| ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
|
| - if (is_pre_parsing_) return NULL;
|
|
|
| if (extension_ != NULL) {
|
| // The extension structures are only accessible while parsing the
|
| @@ -3680,7 +3399,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) {
|
| }
|
|
|
| // We have a valid intrinsics call or a call to a builtin.
|
| - return NEW(CallRuntime(name, function, args));
|
| + return new CallRuntime(name, function, args);
|
| }
|
|
|
|
|
| @@ -3728,12 +3447,12 @@ void Parser::ExpectSemicolon(bool* ok) {
|
|
|
|
|
| Literal* Parser::GetLiteralUndefined() {
|
| - return NEW(Literal(Factory::undefined_value()));
|
| + return new Literal(Factory::undefined_value());
|
| }
|
|
|
|
|
| Literal* Parser::GetLiteralTheHole() {
|
| - return NEW(Literal(Factory::the_hole_value()));
|
| + return new Literal(Factory::the_hole_value());
|
| }
|
|
|
|
|
| @@ -3836,7 +3555,7 @@ void Parser::RegisterTargetUse(BreakTarget* target, Target* stop) {
|
|
|
|
|
| Literal* Parser::NewNumberLiteral(double number) {
|
| - return NEW(Literal(Factory::NewNumber(number, TENURED)));
|
| + return new Literal(Factory::NewNumber(number, TENURED));
|
| }
|
|
|
|
|
| @@ -3868,8 +3587,6 @@ Expression* Parser::NewThrowTypeError(Handle<String> type,
|
| Expression* Parser::NewThrowError(Handle<String> constructor,
|
| Handle<String> type,
|
| Vector< Handle<Object> > arguments) {
|
| - if (is_pre_parsing_) return NULL;
|
| -
|
| int argc = arguments.length();
|
| Handle<JSArray> array = Factory::NewJSArray(argc, TENURED);
|
| ASSERT(array->IsJSArray() && array->HasFastElements());
|
| @@ -4057,17 +3774,17 @@ Handle<Object> JsonParser::ParseJsonArray() {
|
| RegExpParser::RegExpParser(FlatStringReader* in,
|
| Handle<String>* error,
|
| bool multiline)
|
| - : current_(kEndMarker),
|
| + : error_(error),
|
| + captures_(NULL),
|
| + in_(in),
|
| + current_(kEndMarker),
|
| + next_pos_(0),
|
| + capture_count_(0),
|
| has_more_(true),
|
| multiline_(multiline),
|
| - next_pos_(0),
|
| - in_(in),
|
| - error_(error),
|
| simple_(false),
|
| contains_anchor_(false),
|
| - captures_(NULL),
|
| is_scanned_for_captures_(false),
|
| - capture_count_(0),
|
| failed_(false) {
|
| Advance(1);
|
| }
|
| @@ -4924,10 +4641,15 @@ ScriptDataImpl* ParserApi::PartialPreParse(Handle<String> source,
|
| unibrow::CharacterStream* stream,
|
| v8::Extension* extension) {
|
| Handle<Script> no_script;
|
| + bool allow_lazy = FLAG_lazy && (extension == NULL);
|
| + if (!allow_lazy) {
|
| + // Partial preparsing is only about lazily compiled functions.
|
| + // If we don't allow lazy compilation, the log data will be empty.
|
| + return NULL;
|
| + }
|
| preparser::PreParser<Scanner, PartialParserRecorder> parser;
|
| Scanner scanner;
|
| scanner.Initialize(source, stream, JAVASCRIPT);
|
| - bool allow_lazy = FLAG_lazy && (extension == NULL);
|
| PartialParserRecorder recorder;
|
| if (!parser.PreParseProgram(&scanner, &recorder, allow_lazy)) {
|
| Top::StackOverflow();
|
| @@ -4988,14 +4710,13 @@ bool ParserApi::Parse(CompilationInfo* info) {
|
| FunctionLiteral* result = NULL;
|
| Handle<Script> script = info->script();
|
| if (info->is_lazy()) {
|
| - AstBuildingParser parser(script, true, NULL, NULL);
|
| + Parser parser(script, true, NULL, NULL);
|
| result = parser.ParseLazy(info->shared_info());
|
| } else {
|
| bool allow_natives_syntax =
|
| FLAG_allow_natives_syntax || Bootstrapper::IsActive();
|
| ScriptDataImpl* pre_data = info->pre_parse_data();
|
| - AstBuildingParser parser(script, allow_natives_syntax, info->extension(),
|
| - pre_data);
|
| + Parser parser(script, allow_natives_syntax, info->extension(), pre_data);
|
| if (pre_data != NULL && pre_data->has_error()) {
|
| Scanner::Location loc = pre_data->MessageLocation();
|
| const char* message = pre_data->BuildMessage();
|
| @@ -5017,6 +4738,4 @@ bool ParserApi::Parse(CompilationInfo* info) {
|
| return (result != NULL);
|
| }
|
|
|
| -#undef NEW
|
| -
|
| } } // namespace v8::internal
|
|
|