| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index f60c05896f02cfd6f7590727343765f6034c85e6..9a4cc7425a565b02f99de04c05c55700d8dc0ca3 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -389,12 +389,10 @@ bool ParserTraits::IsEval(const AstRawString* identifier) const {
|
| return identifier == parser_->ast_value_factory()->eval_string();
|
| }
|
|
|
| -
|
| bool ParserTraits::IsArguments(const AstRawString* identifier) const {
|
| return identifier == parser_->ast_value_factory()->arguments_string();
|
| }
|
|
|
| -
|
| bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const {
|
| return IsEval(identifier) || IsArguments(identifier);
|
| }
|
| @@ -591,34 +589,32 @@ Expression* ParserTraits::BuildIteratorResult(Expression* value, bool done) {
|
|
|
| Expression* ParserTraits::NewThrowReferenceError(
|
| MessageTemplate::Template message, int pos) {
|
| - return NewThrowError(Runtime::kNewReferenceError, message,
|
| - parser_->ast_value_factory()->empty_string(), pos);
|
| + return parser_->NewThrowError(Runtime::kNewReferenceError, message,
|
| + parser_->ast_value_factory()->empty_string(),
|
| + pos);
|
| }
|
|
|
|
|
| Expression* ParserTraits::NewThrowSyntaxError(MessageTemplate::Template message,
|
| const AstRawString* arg,
|
| int pos) {
|
| - return NewThrowError(Runtime::kNewSyntaxError, message, arg, pos);
|
| + return parser_->NewThrowError(Runtime::kNewSyntaxError, message, arg, pos);
|
| }
|
|
|
|
|
| Expression* ParserTraits::NewThrowTypeError(MessageTemplate::Template message,
|
| const AstRawString* arg, int pos) {
|
| - return NewThrowError(Runtime::kNewTypeError, message, arg, pos);
|
| + return parser_->NewThrowError(Runtime::kNewTypeError, message, arg, pos);
|
| }
|
|
|
| -
|
| -Expression* ParserTraits::NewThrowError(Runtime::FunctionId id,
|
| - MessageTemplate::Template message,
|
| - const AstRawString* arg, int pos) {
|
| - Zone* zone = parser_->zone();
|
| - ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone);
|
| - args->Add(parser_->factory()->NewSmiLiteral(message, pos), zone);
|
| - args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone);
|
| - CallRuntime* call_constructor =
|
| - parser_->factory()->NewCallRuntime(id, args, pos);
|
| - return parser_->factory()->NewThrow(call_constructor, pos);
|
| +Expression* Parser::NewThrowError(Runtime::FunctionId id,
|
| + MessageTemplate::Template message,
|
| + const AstRawString* arg, int pos) {
|
| + ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
|
| + args->Add(factory()->NewSmiLiteral(message, pos), zone());
|
| + args->Add(factory()->NewStringLiteral(arg, pos), zone());
|
| + CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos);
|
| + return factory()->NewThrow(call_constructor, pos);
|
| }
|
|
|
|
|
| @@ -637,21 +633,6 @@ void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| }
|
|
|
|
|
| -void ParserTraits::ReportMessage(MessageTemplate::Template message,
|
| - const char* arg, ParseErrorType error_type) {
|
| - Scanner::Location source_location = parser_->scanner()->location();
|
| - ReportMessageAt(source_location, message, arg, error_type);
|
| -}
|
| -
|
| -
|
| -void ParserTraits::ReportMessage(MessageTemplate::Template message,
|
| - const AstRawString* arg,
|
| - ParseErrorType error_type) {
|
| - Scanner::Location source_location = parser_->scanner()->location();
|
| - ReportMessageAt(source_location, message, arg, error_type);
|
| -}
|
| -
|
| -
|
| void ParserTraits::ReportMessageAt(Scanner::Location source_location,
|
| MessageTemplate::Template message,
|
| const AstRawString* arg,
|
| @@ -1317,9 +1298,9 @@ void Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
|
| // in the body of a function with non-simple parameter list, on
|
| // 29/7/2015. https://goo.gl/ueA7Ln
|
| const AstRawString* string = literal->raw_value()->AsString();
|
| - ParserTraits::ReportMessageAt(
|
| - token_loc, MessageTemplate::kIllegalLanguageModeDirective,
|
| - string);
|
| + ReportMessageAt(token_loc,
|
| + MessageTemplate::kIllegalLanguageModeDirective,
|
| + string);
|
| *ok = false;
|
| return;
|
| }
|
| @@ -2069,9 +2050,9 @@ Variable* Parser::Declare(Declaration* declaration,
|
| // In harmony we treat re-declarations as early errors. See
|
| // ES5 16 for a definition of early errors.
|
| if (declaration_kind == DeclarationDescriptor::NORMAL) {
|
| - ParserTraits::ReportMessage(MessageTemplate::kVarRedeclaration, name);
|
| + ReportMessage(MessageTemplate::kVarRedeclaration, name);
|
| } else {
|
| - ParserTraits::ReportMessage(MessageTemplate::kParamDupe);
|
| + ReportMessage(MessageTemplate::kParamDupe);
|
| }
|
| *ok = false;
|
| return nullptr;
|
| @@ -2464,7 +2445,7 @@ Block* Parser::ParseVariableDeclarations(
|
| // ES6 'const' and binding patterns require initializers.
|
| if (parsing_result->descriptor.mode == CONST ||
|
| !pattern->IsVariableProxy()) {
|
| - ParserTraits::ReportMessageAt(
|
| + ReportMessageAt(
|
| Scanner::Location(decl_pos, scanner()->location().end_pos),
|
| MessageTemplate::kDeclarationMissingInitializer,
|
| !pattern->IsVariableProxy() ? "destructuring" : "const");
|
| @@ -2527,8 +2508,8 @@ Statement* Parser::ParseFunctionDeclaration(bool* ok) {
|
| if (Check(Token::MUL)) {
|
| flags |= ParseFunctionFlags::kIsGenerator;
|
| if (allow_harmony_restrictive_declarations()) {
|
| - ParserTraits::ReportMessageAt(scanner()->location(),
|
| - MessageTemplate::kGeneratorInLegacyContext);
|
| + ReportMessageAt(scanner()->location(),
|
| + MessageTemplate::kGeneratorInLegacyContext);
|
| *ok = false;
|
| return nullptr;
|
| }
|
| @@ -2576,7 +2557,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
|
| // structured. However, these are probably changes we want to
|
| // make later anyway so we should go back and fix this then.
|
| if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
|
| - ParserTraits::ReportMessage(MessageTemplate::kLabelRedeclaration, label);
|
| + ReportMessage(MessageTemplate::kLabelRedeclaration, label);
|
| *ok = false;
|
| return NULL;
|
| }
|
| @@ -2661,7 +2642,7 @@ Statement* Parser::ParseContinueStatement(bool* ok) {
|
| if (label != NULL) {
|
| message = MessageTemplate::kUnknownLabel;
|
| }
|
| - ParserTraits::ReportMessage(message, label);
|
| + ReportMessage(message, label);
|
| *ok = false;
|
| return NULL;
|
| }
|
| @@ -2698,7 +2679,7 @@ Statement* Parser::ParseBreakStatement(ZoneList<const AstRawString*>* labels,
|
| if (label != NULL) {
|
| message = MessageTemplate::kUnknownLabel;
|
| }
|
| - ParserTraits::ReportMessage(message, label);
|
| + ReportMessage(message, label);
|
| *ok = false;
|
| return NULL;
|
| }
|
| @@ -3081,8 +3062,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
|
| position == kNoSourcePosition
|
| ? Scanner::Location::invalid()
|
| : Scanner::Location(position, position + 1);
|
| - ParserTraits::ReportMessageAt(
|
| - location, MessageTemplate::kVarRedeclaration, name);
|
| + ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name);
|
| *ok = false;
|
| return nullptr;
|
| }
|
| @@ -3392,9 +3372,7 @@ Statement* Parser::InitializeForOfStatement(ForOfStatement* for_of,
|
|
|
| for_of->Initialize(body, iterator, assign_iterator, next_result, result_done,
|
| assign_each);
|
| - return finalize
|
| - ? ParserTraits::FinalizeForOfStatement(for_of, completion, nopos)
|
| - : for_of;
|
| + return finalize ? FinalizeForOfStatement(for_of, completion, nopos) : for_of;
|
| }
|
|
|
| Statement* Parser::DesugarLexicalBindingsInForStatement(
|
| @@ -3686,10 +3664,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| if (CheckInOrOf(&mode, ok)) {
|
| if (!*ok) return nullptr;
|
| if (parsing_result.declarations.length() != 1) {
|
| - ParserTraits::ReportMessageAt(
|
| - parsing_result.bindings_loc,
|
| - MessageTemplate::kForInOfLoopMultiBindings,
|
| - ForEachStatement::VisitModeString(mode));
|
| + ReportMessageAt(parsing_result.bindings_loc,
|
| + MessageTemplate::kForInOfLoopMultiBindings,
|
| + ForEachStatement::VisitModeString(mode));
|
| *ok = false;
|
| return nullptr;
|
| }
|
| @@ -3704,10 +3681,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| if (allow_harmony_for_in()) {
|
| ++use_counts_[v8::Isolate::kForInInitializer];
|
| }
|
| - ParserTraits::ReportMessageAt(
|
| - parsing_result.first_initializer_loc,
|
| - MessageTemplate::kForInOfLoopInitializer,
|
| - ForEachStatement::VisitModeString(mode));
|
| + ReportMessageAt(parsing_result.first_initializer_loc,
|
| + MessageTemplate::kForInOfLoopInitializer,
|
| + ForEachStatement::VisitModeString(mode));
|
| *ok = false;
|
| return nullptr;
|
| }
|
| @@ -3816,9 +3792,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| ast_value_factory()
|
| ->dot_catch_string()) { // i.e. is a simple binding
|
| if (bound_names.Contains(name)) {
|
| - ParserTraits::ReportMessageAt(
|
| - parsing_result.bindings_loc,
|
| - MessageTemplate::kVarRedeclaration, name);
|
| + ReportMessageAt(parsing_result.bindings_loc,
|
| + MessageTemplate::kVarRedeclaration, name);
|
| *ok = false;
|
| return nullptr;
|
| }
|
| @@ -4066,7 +4041,7 @@ Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) {
|
| return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot)));
|
| }
|
|
|
| -void ParserTraits::ParseArrowFunctionFormalParameters(
|
| +void Parser::ParseArrowFunctionFormalParameters(
|
| ParserFormalParameters* parameters, Expression* expr, int end_pos,
|
| bool* ok) {
|
| // ArrowFunctionFormals ::
|
| @@ -4198,8 +4173,8 @@ void ParserTraits::ParseArrowFunctionFormalParameterList(
|
| const Scope::Snapshot& scope_snapshot, bool* ok) {
|
| if (expr->IsEmptyParentheses()) return;
|
|
|
| - ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos,
|
| - CHECK_OK_VOID);
|
| + parser_->ParseArrowFunctionFormalParameters(
|
| + parameters, expr, params_loc.end_pos, CHECK_OK_VOID);
|
|
|
| scope_snapshot.Reparent(parameters->scope);
|
|
|
| @@ -4573,9 +4548,9 @@ void Parser::SkipLazyFunctionBody(int* materialized_literal_count,
|
| return;
|
| }
|
| if (logger.has_error()) {
|
| - ParserTraits::ReportMessageAt(
|
| - Scanner::Location(logger.start(), logger.end()), logger.message(),
|
| - logger.argument_opt(), logger.error_type());
|
| + ReportMessageAt(Scanner::Location(logger.start(), logger.end()),
|
| + logger.message(), logger.argument_opt(),
|
| + logger.error_type());
|
| *ok = false;
|
| return;
|
| }
|
| @@ -5169,7 +5144,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) {
|
|
|
| // Check that the function is defined.
|
| if (context_index == Context::kNotFound) {
|
| - ParserTraits::ReportMessage(MessageTemplate::kNotDefined, name);
|
| + ReportMessage(MessageTemplate::kNotDefined, name);
|
| *ok = false;
|
| return NULL;
|
| }
|
| @@ -5193,8 +5168,7 @@ void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
|
| position == kNoSourcePosition
|
| ? Scanner::Location::invalid()
|
| : Scanner::Location(position, position + 1);
|
| - ParserTraits::ReportMessageAt(location, MessageTemplate::kVarRedeclaration,
|
| - name);
|
| + ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name);
|
| *ok = false;
|
| }
|
| }
|
| @@ -6093,19 +6067,17 @@ void ParserTraits::SetFunctionNameFromPropertyName(
|
|
|
| DCHECK(!value->IsAnonymousFunctionDefinition() ||
|
| property->kind() == ObjectLiteralProperty::COMPUTED);
|
| - SetFunctionName(value, name);
|
| + parser_->SetFunctionName(value, name);
|
| }
|
|
|
|
|
| void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value,
|
| Expression* identifier) {
|
| if (!identifier->IsVariableProxy()) return;
|
| - SetFunctionName(value, identifier->AsVariableProxy()->raw_name());
|
| + parser_->SetFunctionName(value, identifier->AsVariableProxy()->raw_name());
|
| }
|
|
|
| -
|
| -void ParserTraits::SetFunctionName(Expression* value,
|
| - const AstRawString* name) {
|
| +void Parser::SetFunctionName(Expression* value, const AstRawString* name) {
|
| DCHECK_NOT_NULL(name);
|
| if (!value->IsAnonymousFunctionDefinition()) return;
|
| auto function = value->AsFunctionLiteral();
|
| @@ -6198,457 +6170,431 @@ void ParserTraits::SetFunctionName(Expression* value,
|
| // output = %_Call(iteratorReturn, iterator, input);
|
| // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
|
|
| -Expression* ParserTraits::RewriteYieldStar(
|
| - Expression* generator, Expression* iterable, int pos) {
|
| +Expression* Parser::RewriteYieldStar(Expression* generator,
|
| + Expression* iterable, int pos) {
|
| const int nopos = kNoSourcePosition;
|
|
|
| - auto factory = parser_->factory();
|
| - auto avfactory = parser_->ast_value_factory();
|
| - auto zone = parser_->zone();
|
| -
|
| -
|
| // Forward definition for break/continue statements.
|
| - WhileStatement* loop = factory->NewWhileStatement(nullptr, nopos);
|
| -
|
| + WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos);
|
|
|
| // let input = undefined;
|
| - Variable* var_input = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_input = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* initialize_input;
|
| {
|
| - Expression* input_proxy = factory->NewVariableProxy(var_input);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, input_proxy, factory->NewUndefinedLiteral(nopos), nopos);
|
| - initialize_input = factory->NewExpressionStatement(assignment, nopos);
|
| + Expression* input_proxy = factory()->NewVariableProxy(var_input);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, input_proxy,
|
| + factory()->NewUndefinedLiteral(nopos), nopos);
|
| + initialize_input = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // let mode = kNext;
|
| - Variable* var_mode = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_mode = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* initialize_mode;
|
| {
|
| - Expression* mode_proxy = factory->NewVariableProxy(var_mode);
|
| - Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| + Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
|
| + Expression* knext =
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
|
| - initialize_mode = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
|
| + initialize_mode = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // let output = undefined;
|
| - Variable* var_output = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_output = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* initialize_output;
|
| {
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, output_proxy, factory->NewUndefinedLiteral(nopos),
|
| - nopos);
|
| - initialize_output = factory->NewExpressionStatement(assignment, nopos);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, output_proxy,
|
| + factory()->NewUndefinedLiteral(nopos), nopos);
|
| + initialize_output = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // let iterator = iterable[Symbol.iterator];
|
| - Variable* var_iterator = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* get_iterator;
|
| {
|
| - Expression* iterator = GetIterator(iterable, factory, nopos);
|
| - Expression* iterator_proxy = factory->NewVariableProxy(var_iterator);
|
| - Expression* assignment = factory->NewAssignment(
|
| + Expression* iterator = GetIterator(iterable, factory(), nopos);
|
| + Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
|
| + Expression* assignment = factory()->NewAssignment(
|
| Token::ASSIGN, iterator_proxy, iterator, nopos);
|
| - get_iterator = factory->NewExpressionStatement(assignment, nopos);
|
| + get_iterator = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // if (!IS_RECEIVER(iterator)) throw MakeTypeError(kSymbolIteratorInvalid);
|
| Statement* validate_iterator;
|
| {
|
| Expression* is_receiver_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_iterator), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_iterator), zone());
|
| is_receiver_call =
|
| - factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| }
|
|
|
| Statement* throw_call;
|
| {
|
| - Expression* call = NewThrowTypeError(
|
| - MessageTemplate::kSymbolIteratorInvalid, avfactory->empty_string(),
|
| - nopos);
|
| - throw_call = factory->NewExpressionStatement(call, nopos);
|
| + Expression* call =
|
| + NewThrowTypeError(MessageTemplate::kSymbolIteratorInvalid,
|
| + ast_value_factory()->empty_string(), nopos);
|
| + throw_call = factory()->NewExpressionStatement(call, nopos);
|
| }
|
|
|
| - validate_iterator = factory->NewIfStatement(
|
| - is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + validate_iterator = factory()->NewIfStatement(
|
| + is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
|
| + nopos);
|
| }
|
|
|
| -
|
| // output = iterator.next(input);
|
| Statement* call_next;
|
| {
|
| - Expression* iterator_proxy = factory->NewVariableProxy(var_iterator);
|
| + Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
|
| Expression* literal =
|
| - factory->NewStringLiteral(avfactory->next_string(), nopos);
|
| + factory()->NewStringLiteral(ast_value_factory()->next_string(), nopos);
|
| Expression* next_property =
|
| - factory->NewProperty(iterator_proxy, literal, nopos);
|
| - Expression* input_proxy = factory->NewVariableProxy(var_input);
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(input_proxy, zone);
|
| - Expression* call = factory->NewCall(next_property, args, nopos);
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| + factory()->NewProperty(iterator_proxy, literal, nopos);
|
| + Expression* input_proxy = factory()->NewVariableProxy(var_input);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(input_proxy, zone());
|
| + Expression* call = factory()->NewCall(next_property, args, nopos);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
|
| - call_next = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
|
| + call_next = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
| Statement* validate_next_output;
|
| {
|
| Expression* is_receiver_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| is_receiver_call =
|
| - factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| }
|
|
|
| Statement* throw_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| - Expression* call = factory->NewCallRuntime(
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| + Expression* call = factory()->NewCallRuntime(
|
| Runtime::kThrowIteratorResultNotAnObject, args, nopos);
|
| - throw_call = factory->NewExpressionStatement(call, nopos);
|
| + throw_call = factory()->NewExpressionStatement(call, nopos);
|
| }
|
|
|
| - validate_next_output = factory->NewIfStatement(
|
| - is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + validate_next_output = factory()->NewIfStatement(
|
| + is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
|
| + nopos);
|
| }
|
|
|
| -
|
| // let iteratorThrow = iterator.throw;
|
| - Variable* var_throw = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_throw = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* get_throw;
|
| {
|
| - Expression* iterator_proxy = factory->NewVariableProxy(var_iterator);
|
| + Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
|
| Expression* literal =
|
| - factory->NewStringLiteral(avfactory->throw_string(), nopos);
|
| + factory()->NewStringLiteral(ast_value_factory()->throw_string(), nopos);
|
| Expression* property =
|
| - factory->NewProperty(iterator_proxy, literal, nopos);
|
| - Expression* throw_proxy = factory->NewVariableProxy(var_throw);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, throw_proxy, property, nopos);
|
| - get_throw = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewProperty(iterator_proxy, literal, nopos);
|
| + Expression* throw_proxy = factory()->NewVariableProxy(var_throw);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, throw_proxy, property, nopos);
|
| + get_throw = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // if (IS_NULL_OR_UNDEFINED(iteratorThrow) {
|
| // IteratorClose(iterator);
|
| // throw MakeTypeError(kThrowMethodMissing);
|
| // }
|
| Statement* check_throw;
|
| {
|
| - Expression* condition = factory->NewCompareOperation(
|
| - Token::EQ, factory->NewVariableProxy(var_throw),
|
| - factory->NewNullLiteral(nopos), nopos);
|
| -
|
| - Expression* call = NewThrowTypeError(
|
| - MessageTemplate::kThrowMethodMissing,
|
| - avfactory->empty_string(), nopos);
|
| - Statement* throw_call = factory->NewExpressionStatement(call, nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| + Token::EQ, factory()->NewVariableProxy(var_throw),
|
| + factory()->NewNullLiteral(nopos), nopos);
|
| + Expression* call =
|
| + NewThrowTypeError(MessageTemplate::kThrowMethodMissing,
|
| + ast_value_factory()->empty_string(), nopos);
|
| + Statement* throw_call = factory()->NewExpressionStatement(call, nopos);
|
|
|
| - Block* then = factory->NewBlock(nullptr, 4+1, false, nopos);
|
| - parser_->BuildIteratorCloseForCompletion(
|
| + Block* then = factory()->NewBlock(nullptr, 4 + 1, false, nopos);
|
| + BuildIteratorCloseForCompletion(
|
| then->statements(), var_iterator,
|
| - factory->NewSmiLiteral(Parser::kNormalCompletion, nopos));
|
| - then->statements()->Add(throw_call, zone);
|
| - check_throw = factory->NewIfStatement(
|
| - condition, then, factory->NewEmptyStatement(nopos), nopos);
|
| + factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos));
|
| + then->statements()->Add(throw_call, zone());
|
| + check_throw = factory()->NewIfStatement(
|
| + condition, then, factory()->NewEmptyStatement(nopos), nopos);
|
| }
|
|
|
| -
|
| // output = %_Call(iteratorThrow, iterator, input);
|
| Statement* call_throw;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(3, zone);
|
| - args->Add(factory->NewVariableProxy(var_throw), zone);
|
| - args->Add(factory->NewVariableProxy(var_iterator), zone);
|
| - args->Add(factory->NewVariableProxy(var_input), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(3, zone());
|
| + args->Add(factory()->NewVariableProxy(var_throw), zone());
|
| + args->Add(factory()->NewVariableProxy(var_iterator), zone());
|
| + args->Add(factory()->NewVariableProxy(var_input), zone());
|
| Expression* call =
|
| - factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, factory->NewVariableProxy(var_output), call, nopos);
|
| - call_throw = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| + Expression* assignment = factory()->NewAssignment(
|
| + Token::ASSIGN, factory()->NewVariableProxy(var_output), call, nopos);
|
| + call_throw = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
|
| Statement* validate_throw_output;
|
| {
|
| Expression* is_receiver_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| is_receiver_call =
|
| - factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| }
|
|
|
| Statement* throw_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| - Expression* call = factory->NewCallRuntime(
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| + Expression* call = factory()->NewCallRuntime(
|
| Runtime::kThrowIteratorResultNotAnObject, args, nopos);
|
| - throw_call = factory->NewExpressionStatement(call, nopos);
|
| + throw_call = factory()->NewExpressionStatement(call, nopos);
|
| }
|
|
|
| - validate_throw_output = factory->NewIfStatement(
|
| - is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + validate_throw_output = factory()->NewIfStatement(
|
| + is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
|
| + nopos);
|
| }
|
|
|
| -
|
| // if (output.done) break;
|
| Statement* if_done;
|
| {
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| Expression* literal =
|
| - factory->NewStringLiteral(avfactory->done_string(), nopos);
|
| - Expression* property = factory->NewProperty(output_proxy, literal, nopos);
|
| - BreakStatement* break_loop = factory->NewBreakStatement(loop, nopos);
|
| - if_done = factory->NewIfStatement(
|
| - property, break_loop, factory->NewEmptyStatement(nopos), nopos);
|
| + factory()->NewStringLiteral(ast_value_factory()->done_string(), nopos);
|
| + Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
|
| + BreakStatement* break_loop = factory()->NewBreakStatement(loop, nopos);
|
| + if_done = factory()->NewIfStatement(
|
| + property, break_loop, factory()->NewEmptyStatement(nopos), nopos);
|
| }
|
|
|
|
|
| // mode = kReturn;
|
| Statement* set_mode_return;
|
| {
|
| - Expression* mode_proxy = factory->NewVariableProxy(var_mode);
|
| + Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
|
| Expression* kreturn =
|
| - factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, mode_proxy, kreturn, nopos);
|
| - set_mode_return = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, mode_proxy, kreturn, nopos);
|
| + set_mode_return = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| // Yield(output);
|
| Statement* yield_output;
|
| {
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| - Yield* yield = factory->NewYield(generator, output_proxy, nopos,
|
| - Yield::kOnExceptionThrow);
|
| - yield_output = factory->NewExpressionStatement(yield, nopos);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| + Yield* yield = factory()->NewYield(generator, output_proxy, nopos,
|
| + Yield::kOnExceptionThrow);
|
| + yield_output = factory()->NewExpressionStatement(yield, nopos);
|
| }
|
|
|
| -
|
| // mode = kNext;
|
| Statement* set_mode_next;
|
| {
|
| - Expression* mode_proxy = factory->NewVariableProxy(var_mode);
|
| - Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| + Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
|
| + Expression* knext =
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
|
| - set_mode_next = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
|
| + set_mode_next = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // mode = kThrow;
|
| Statement* set_mode_throw;
|
| {
|
| - Expression* mode_proxy = factory->NewVariableProxy(var_mode);
|
| + Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
|
| Expression* kthrow =
|
| - factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos);
|
| - set_mode_throw = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos);
|
| + set_mode_throw = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // input = function.sent;
|
| Statement* get_input;
|
| {
|
| - Expression* function_sent = FunctionSentExpression(factory, nopos);
|
| - Expression* input_proxy = factory->NewVariableProxy(var_input);
|
| - Expression* assignment = factory->NewAssignment(
|
| + Expression* function_sent = FunctionSentExpression(factory(), nopos);
|
| + Expression* input_proxy = factory()->NewVariableProxy(var_input);
|
| + Expression* assignment = factory()->NewAssignment(
|
| Token::ASSIGN, input_proxy, function_sent, nopos);
|
| - get_input = factory->NewExpressionStatement(assignment, nopos);
|
| + get_input = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| -
|
| // if (mode === kReturn) {
|
| // return {value: output.value, done: true};
|
| // }
|
| Statement* maybe_return_value;
|
| {
|
| - Expression* mode_proxy = factory->NewVariableProxy(var_mode);
|
| + Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
|
| Expression* kreturn =
|
| - factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| - Expression* condition = factory->NewCompareOperation(
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| Token::EQ_STRICT, mode_proxy, kreturn, nopos);
|
|
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| Expression* literal =
|
| - factory->NewStringLiteral(avfactory->value_string(), nopos);
|
| - Expression* property = factory->NewProperty(output_proxy, literal, nopos);
|
| - Statement* return_value =
|
| - factory->NewReturnStatement(BuildIteratorResult(property, true), nopos);
|
| + factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos);
|
| + Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
|
| + Statement* return_value = factory()->NewReturnStatement(
|
| + BuildIteratorResult(property, true), nopos);
|
|
|
| - maybe_return_value = factory->NewIfStatement(
|
| - condition, return_value, factory->NewEmptyStatement(nopos), nopos);
|
| + maybe_return_value = factory()->NewIfStatement(
|
| + condition, return_value, factory()->NewEmptyStatement(nopos), nopos);
|
| }
|
|
|
| -
|
| // output.value
|
| Statement* get_value;
|
| {
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| Expression* literal =
|
| - factory->NewStringLiteral(avfactory->value_string(), nopos);
|
| - Expression* property = factory->NewProperty(output_proxy, literal, nopos);
|
| - get_value = factory->NewExpressionStatement(property, nopos);
|
| + factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos);
|
| + Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
|
| + get_value = factory()->NewExpressionStatement(property, nopos);
|
| }
|
|
|
| -
|
| // Now put things together.
|
|
|
| -
|
| // try { ... } catch(e) { ... }
|
| Statement* try_catch;
|
| {
|
| - Block* try_block = factory->NewBlock(nullptr, 2, false, nopos);
|
| - try_block->statements()->Add(yield_output, zone);
|
| - try_block->statements()->Add(set_mode_next, zone);
|
| + Block* try_block = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + try_block->statements()->Add(yield_output, zone());
|
| + try_block->statements()->Add(set_mode_next, zone());
|
|
|
| - Block* catch_block = factory->NewBlock(nullptr, 1, false, nopos);
|
| - catch_block->statements()->Add(set_mode_throw, zone);
|
| + Block* catch_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| + catch_block->statements()->Add(set_mode_throw, zone());
|
|
|
| Scope* catch_scope = NewScope(CATCH_SCOPE);
|
| catch_scope->set_is_hidden();
|
| - const AstRawString* name = avfactory->dot_catch_string();
|
| + const AstRawString* name = ast_value_factory()->dot_catch_string();
|
| Variable* catch_variable =
|
| catch_scope->DeclareLocal(name, VAR, kCreatedInitialized,
|
| Variable::NORMAL);
|
|
|
| - try_catch = factory->NewTryCatchStatementForDesugaring(
|
| + try_catch = factory()->NewTryCatchStatementForDesugaring(
|
| try_block, catch_scope, catch_variable, catch_block, nopos);
|
| }
|
|
|
| -
|
| // try { ... } finally { ... }
|
| Statement* try_finally;
|
| {
|
| - Block* try_block = factory->NewBlock(nullptr, 1, false, nopos);
|
| - try_block->statements()->Add(try_catch, zone);
|
| + Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| + try_block->statements()->Add(try_catch, zone());
|
|
|
| - Block* finally = factory->NewBlock(nullptr, 2, false, nopos);
|
| - finally->statements()->Add(get_input, zone);
|
| - finally->statements()->Add(
|
| - factory->NewContinueStatement(loop, nopos), zone);
|
| + Block* finally = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + finally->statements()->Add(get_input, zone());
|
| + finally->statements()->Add(factory()->NewContinueStatement(loop, nopos),
|
| + zone());
|
|
|
| - try_finally = factory->NewTryFinallyStatement(try_block, finally, nopos);
|
| + try_finally = factory()->NewTryFinallyStatement(try_block, finally, nopos);
|
| }
|
|
|
| -
|
| // switch (mode) { ... }
|
| - SwitchStatement* switch_mode = factory->NewSwitchStatement(nullptr, nopos);
|
| + SwitchStatement* switch_mode = factory()->NewSwitchStatement(nullptr, nopos);
|
| {
|
| - auto case_next = new (zone) ZoneList<Statement*>(3, zone);
|
| - case_next->Add(call_next, zone);
|
| - case_next->Add(validate_next_output, zone);
|
| - case_next->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
|
| + auto case_next = new (zone()) ZoneList<Statement*>(3, zone());
|
| + case_next->Add(call_next, zone());
|
| + case_next->Add(validate_next_output, zone());
|
| + case_next->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
|
|
|
| - auto case_return = new (zone) ZoneList<Statement*>(5, zone);
|
| + auto case_return = new (zone()) ZoneList<Statement*>(5, zone());
|
| BuildIteratorClose(case_return, var_iterator, var_input, var_output);
|
| - case_return->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
|
| -
|
| - auto case_throw = new (zone) ZoneList<Statement*>(5, zone);
|
| - case_throw->Add(get_throw, zone);
|
| - case_throw->Add(check_throw, zone);
|
| - case_throw->Add(call_throw, zone);
|
| - case_throw->Add(validate_throw_output, zone);
|
| - case_throw->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
|
| -
|
| - auto cases = new (zone) ZoneList<CaseClause*>(3, zone);
|
| - Expression* knext = factory->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| + case_return->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
|
| +
|
| + auto case_throw = new (zone()) ZoneList<Statement*>(5, zone());
|
| + case_throw->Add(get_throw, zone());
|
| + case_throw->Add(check_throw, zone());
|
| + case_throw->Add(call_throw, zone());
|
| + case_throw->Add(validate_throw_output, zone());
|
| + case_throw->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
|
| +
|
| + auto cases = new (zone()) ZoneList<CaseClause*>(3, zone());
|
| + Expression* knext =
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
|
| Expression* kreturn =
|
| - factory->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
|
| Expression* kthrow =
|
| - factory->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
|
| - cases->Add(factory->NewCaseClause(knext, case_next, nopos), zone);
|
| - cases->Add(factory->NewCaseClause(kreturn, case_return, nopos), zone);
|
| - cases->Add(factory->NewCaseClause(kthrow, case_throw, nopos), zone);
|
| + factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
|
| + cases->Add(factory()->NewCaseClause(knext, case_next, nopos), zone());
|
| + cases->Add(factory()->NewCaseClause(kreturn, case_return, nopos), zone());
|
| + cases->Add(factory()->NewCaseClause(kthrow, case_throw, nopos), zone());
|
|
|
| - switch_mode->Initialize(factory->NewVariableProxy(var_mode), cases);
|
| + switch_mode->Initialize(factory()->NewVariableProxy(var_mode), cases);
|
| }
|
|
|
| -
|
| // while (true) { ... }
|
| // Already defined earlier: WhileStatement* loop = ...
|
| {
|
| - Block* loop_body = factory->NewBlock(nullptr, 4, false, nopos);
|
| - loop_body->statements()->Add(switch_mode, zone);
|
| - loop_body->statements()->Add(if_done, zone);
|
| - loop_body->statements()->Add(set_mode_return, zone);
|
| - loop_body->statements()->Add(try_finally, zone);
|
| + Block* loop_body = factory()->NewBlock(nullptr, 4, false, nopos);
|
| + loop_body->statements()->Add(switch_mode, zone());
|
| + loop_body->statements()->Add(if_done, zone());
|
| + loop_body->statements()->Add(set_mode_return, zone());
|
| + loop_body->statements()->Add(try_finally, zone());
|
|
|
| - loop->Initialize(factory->NewBooleanLiteral(true, nopos), loop_body);
|
| + loop->Initialize(factory()->NewBooleanLiteral(true, nopos), loop_body);
|
| }
|
|
|
| -
|
| // do { ... }
|
| DoExpression* yield_star;
|
| {
|
| // The rewriter needs to process the get_value statement only, hence we
|
| // put the preceding statements into an init block.
|
|
|
| - Block* do_block_ = factory->NewBlock(nullptr, 7, true, nopos);
|
| - do_block_->statements()->Add(initialize_input, zone);
|
| - do_block_->statements()->Add(initialize_mode, zone);
|
| - do_block_->statements()->Add(initialize_output, zone);
|
| - do_block_->statements()->Add(get_iterator, zone);
|
| - do_block_->statements()->Add(validate_iterator, zone);
|
| - do_block_->statements()->Add(loop, zone);
|
| - do_block_->statements()->Add(maybe_return_value, zone);
|
| + Block* do_block_ = factory()->NewBlock(nullptr, 7, true, nopos);
|
| + do_block_->statements()->Add(initialize_input, zone());
|
| + do_block_->statements()->Add(initialize_mode, zone());
|
| + do_block_->statements()->Add(initialize_output, zone());
|
| + do_block_->statements()->Add(get_iterator, zone());
|
| + do_block_->statements()->Add(validate_iterator, zone());
|
| + do_block_->statements()->Add(loop, zone());
|
| + do_block_->statements()->Add(maybe_return_value, zone());
|
|
|
| - Block* do_block = factory->NewBlock(nullptr, 2, false, nopos);
|
| - do_block->statements()->Add(do_block_, zone);
|
| - do_block->statements()->Add(get_value, zone);
|
| + Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + do_block->statements()->Add(do_block_, zone());
|
| + do_block->statements()->Add(get_value, zone());
|
|
|
| Variable* dot_result =
|
| - parser_->NewTemporary(avfactory->dot_result_string());
|
| - yield_star = factory->NewDoExpression(do_block, dot_result, nopos);
|
| - Rewriter::Rewrite(parser_, parser_->GetClosureScope(), yield_star,
|
| - avfactory);
|
| + NewTemporary(ast_value_factory()->dot_result_string());
|
| + yield_star = factory()->NewDoExpression(do_block, dot_result, nopos);
|
| + Rewriter::Rewrite(this, GetClosureScope(), yield_star, ast_value_factory());
|
| }
|
|
|
| return yield_star;
|
| }
|
|
|
| -Statement* ParserTraits::CheckCallable(Variable* var, Expression* error,
|
| - int pos) {
|
| - auto factory = parser_->factory();
|
| - auto avfactory = parser_->ast_value_factory();
|
| +Statement* Parser::CheckCallable(Variable* var, Expression* error, int pos) {
|
| const int nopos = kNoSourcePosition;
|
| Statement* validate_var;
|
| {
|
| - Expression* type_of = factory->NewUnaryOperation(
|
| - Token::TYPEOF, factory->NewVariableProxy(var), nopos);
|
| - Expression* function_literal =
|
| - factory->NewStringLiteral(avfactory->function_string(), nopos);
|
| - Expression* condition = factory->NewCompareOperation(
|
| + Expression* type_of = factory()->NewUnaryOperation(
|
| + Token::TYPEOF, factory()->NewVariableProxy(var), nopos);
|
| + Expression* function_literal = factory()->NewStringLiteral(
|
| + ast_value_factory()->function_string(), nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| Token::EQ_STRICT, type_of, function_literal, nopos);
|
|
|
| - Statement* throw_call = factory->NewExpressionStatement(error, pos);
|
| + Statement* throw_call = factory()->NewExpressionStatement(error, pos);
|
|
|
| - validate_var = factory->NewIfStatement(
|
| - condition, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + validate_var = factory()->NewIfStatement(
|
| + condition, factory()->NewEmptyStatement(nopos), throw_call, nopos);
|
| }
|
| return validate_var;
|
| }
|
|
|
| -void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| - Variable* iterator, Variable* input,
|
| - Variable* var_output) {
|
| +void Parser::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| + Variable* iterator, Variable* input,
|
| + Variable* var_output) {
|
| //
|
| // This function adds four statements to [statements], corresponding to the
|
| // following code:
|
| @@ -6662,23 +6608,20 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| //
|
|
|
| const int nopos = kNoSourcePosition;
|
| - auto factory = parser_->factory();
|
| - auto avfactory = parser_->ast_value_factory();
|
| - auto zone = parser_->zone();
|
|
|
| // let iteratorReturn = iterator.return;
|
| Variable* var_return = var_output; // Reusing the output variable.
|
| Statement* get_return;
|
| {
|
| - Expression* iterator_proxy = factory->NewVariableProxy(iterator);
|
| - Expression* literal =
|
| - factory->NewStringLiteral(avfactory->return_string(), nopos);
|
| + Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
|
| + Expression* literal = factory()->NewStringLiteral(
|
| + ast_value_factory()->return_string(), nopos);
|
| Expression* property =
|
| - factory->NewProperty(iterator_proxy, literal, nopos);
|
| - Expression* return_proxy = factory->NewVariableProxy(var_return);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, return_proxy, property, nopos);
|
| - get_return = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewProperty(iterator_proxy, literal, nopos);
|
| + Expression* return_proxy = factory()->NewVariableProxy(var_return);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos);
|
| + get_return = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| // if (IS_NULL_OR_UNDEFINED(iteratorReturn) {
|
| @@ -6686,33 +6629,33 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| // }
|
| Statement* check_return;
|
| {
|
| - Expression* condition = factory->NewCompareOperation(
|
| - Token::EQ, factory->NewVariableProxy(var_return),
|
| - factory->NewNullLiteral(nopos), nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| + Token::EQ, factory()->NewVariableProxy(var_return),
|
| + factory()->NewNullLiteral(nopos), nopos);
|
|
|
| - Expression* value = factory->NewVariableProxy(input);
|
| + Expression* value = factory()->NewVariableProxy(input);
|
|
|
| Statement* return_input =
|
| - factory->NewReturnStatement(BuildIteratorResult(value, true), nopos);
|
| + factory()->NewReturnStatement(BuildIteratorResult(value, true), nopos);
|
|
|
| - check_return = factory->NewIfStatement(
|
| - condition, return_input, factory->NewEmptyStatement(nopos), nopos);
|
| + check_return = factory()->NewIfStatement(
|
| + condition, return_input, factory()->NewEmptyStatement(nopos), nopos);
|
| }
|
|
|
| // output = %_Call(iteratorReturn, iterator, input);
|
| Statement* call_return;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(3, zone);
|
| - args->Add(factory->NewVariableProxy(var_return), zone);
|
| - args->Add(factory->NewVariableProxy(iterator), zone);
|
| - args->Add(factory->NewVariableProxy(input), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(3, zone());
|
| + args->Add(factory()->NewVariableProxy(var_return), zone());
|
| + args->Add(factory()->NewVariableProxy(iterator), zone());
|
| + args->Add(factory()->NewVariableProxy(input), zone());
|
|
|
| Expression* call =
|
| - factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, output_proxy, call, nopos);
|
| - call_return = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
|
| + call_return = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| // if (!IS_RECEIVER(output)) %ThrowIteratorResultNotAnObject(output);
|
| @@ -6720,34 +6663,35 @@ void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| {
|
| Expression* is_receiver_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| is_receiver_call =
|
| - factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| }
|
|
|
| Statement* throw_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| - Expression* call = factory->NewCallRuntime(
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| + Expression* call = factory()->NewCallRuntime(
|
| Runtime::kThrowIteratorResultNotAnObject, args, nopos);
|
| - throw_call = factory->NewExpressionStatement(call, nopos);
|
| + throw_call = factory()->NewExpressionStatement(call, nopos);
|
| }
|
|
|
| - validate_output = factory->NewIfStatement(
|
| - is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + validate_output = factory()->NewIfStatement(
|
| + is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
|
| + nopos);
|
| }
|
|
|
| - statements->Add(get_return, zone);
|
| - statements->Add(check_return, zone);
|
| - statements->Add(call_return, zone);
|
| - statements->Add(validate_output, zone);
|
| + statements->Add(get_return, zone());
|
| + statements->Add(check_return, zone());
|
| + statements->Add(call_return, zone());
|
| + statements->Add(validate_output, zone());
|
| }
|
|
|
| -void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| - Expression* condition, Variable* iter,
|
| - Block* iterator_use, Block* target) {
|
| +void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
|
| + Variable* iter, Block* iterator_use,
|
| + Block* target) {
|
| //
|
| // This function adds two statements to [target], corresponding to the
|
| // following code:
|
| @@ -6768,35 +6712,32 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| //
|
|
|
| const int nopos = kNoSourcePosition;
|
| - auto factory = parser_->factory();
|
| - auto avfactory = parser_->ast_value_factory();
|
| - auto scope = parser_->scope();
|
| - auto zone = parser_->zone();
|
|
|
| // completion = kNormalCompletion;
|
| Statement* initialize_completion;
|
| {
|
| - Expression* proxy = factory->NewVariableProxy(completion);
|
| - Expression* assignment = factory->NewAssignment(
|
| + Expression* proxy = factory()->NewVariableProxy(completion);
|
| + Expression* assignment = factory()->NewAssignment(
|
| Token::ASSIGN, proxy,
|
| - factory->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
|
| - initialize_completion = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
|
| + initialize_completion =
|
| + factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| // if (completion === kAbruptCompletion) completion = kThrowCompletion;
|
| Statement* set_completion_throw;
|
| {
|
| - Expression* condition = factory->NewCompareOperation(
|
| - Token::EQ_STRICT, factory->NewVariableProxy(completion),
|
| - factory->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| + Token::EQ_STRICT, factory()->NewVariableProxy(completion),
|
| + factory()->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos);
|
|
|
| - Expression* proxy = factory->NewVariableProxy(completion);
|
| - Expression* assignment = factory->NewAssignment(
|
| + Expression* proxy = factory()->NewVariableProxy(completion);
|
| + Expression* assignment = factory()->NewAssignment(
|
| Token::ASSIGN, proxy,
|
| - factory->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
|
| - Statement* statement = factory->NewExpressionStatement(assignment, nopos);
|
| - set_completion_throw = factory->NewIfStatement(
|
| - condition, statement, factory->NewEmptyStatement(nopos), nopos);
|
| + factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
|
| + Statement* statement = factory()->NewExpressionStatement(assignment, nopos);
|
| + set_completion_throw = factory()->NewIfStatement(
|
| + condition, statement, factory()->NewEmptyStatement(nopos), nopos);
|
| }
|
|
|
| // if (condition) {
|
| @@ -6804,16 +6745,16 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| // }
|
| Block* maybe_close;
|
| {
|
| - Block* block = factory->NewBlock(nullptr, 2, true, nopos);
|
| - Expression* proxy = factory->NewVariableProxy(completion);
|
| - parser_->BuildIteratorCloseForCompletion(block->statements(), iter, proxy);
|
| + Block* block = factory()->NewBlock(nullptr, 2, true, nopos);
|
| + Expression* proxy = factory()->NewVariableProxy(completion);
|
| + BuildIteratorCloseForCompletion(block->statements(), iter, proxy);
|
| DCHECK(block->statements()->length() == 2);
|
|
|
| - maybe_close = factory->NewBlock(nullptr, 1, true, nopos);
|
| + maybe_close = factory()->NewBlock(nullptr, 1, true, nopos);
|
| maybe_close->statements()->Add(
|
| - factory->NewIfStatement(condition, block,
|
| - factory->NewEmptyStatement(nopos), nopos),
|
| - zone);
|
| + factory()->NewIfStatement(condition, block,
|
| + factory()->NewEmptyStatement(nopos), nopos),
|
| + zone());
|
| }
|
|
|
| // try { #try_block }
|
| @@ -6823,9 +6764,9 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| // }
|
| Statement* try_catch;
|
| {
|
| - Scope* catch_scope = parser_->NewScopeWithParent(scope, CATCH_SCOPE);
|
| + Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE);
|
| Variable* catch_variable =
|
| - catch_scope->DeclareLocal(avfactory->dot_catch_string(), VAR,
|
| + catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
|
| kCreatedInitialized, Variable::NORMAL);
|
| catch_scope->set_is_hidden();
|
|
|
| @@ -6835,37 +6776,37 @@ void ParserTraits::FinalizeIteratorUse(Variable* completion,
|
| // TryCatchStatementForReThrow below (which does not clear the pending
|
| // message), rather than a TryCatchStatement.
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(catch_variable), zone);
|
| - rethrow = factory->NewExpressionStatement(
|
| - factory->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(catch_variable), zone());
|
| + rethrow = factory()->NewExpressionStatement(
|
| + factory()->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos);
|
| }
|
|
|
| - Block* catch_block = factory->NewBlock(nullptr, 2, false, nopos);
|
| - catch_block->statements()->Add(set_completion_throw, zone);
|
| - catch_block->statements()->Add(rethrow, zone);
|
| + Block* catch_block = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + catch_block->statements()->Add(set_completion_throw, zone());
|
| + catch_block->statements()->Add(rethrow, zone());
|
|
|
| - try_catch = factory->NewTryCatchStatementForReThrow(
|
| + try_catch = factory()->NewTryCatchStatementForReThrow(
|
| iterator_use, catch_scope, catch_variable, catch_block, nopos);
|
| }
|
|
|
| // try { #try_catch } finally { #maybe_close }
|
| Statement* try_finally;
|
| {
|
| - Block* try_block = factory->NewBlock(nullptr, 1, false, nopos);
|
| - try_block->statements()->Add(try_catch, zone);
|
| + Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| + try_block->statements()->Add(try_catch, zone());
|
|
|
| try_finally =
|
| - factory->NewTryFinallyStatement(try_block, maybe_close, nopos);
|
| + factory()->NewTryFinallyStatement(try_block, maybe_close, nopos);
|
| }
|
|
|
| - target->statements()->Add(initialize_completion, zone);
|
| - target->statements()->Add(try_finally, zone);
|
| + target->statements()->Add(initialize_completion, zone());
|
| + target->statements()->Add(try_finally, zone());
|
| }
|
|
|
| -void ParserTraits::BuildIteratorCloseForCompletion(
|
| - ZoneList<Statement*>* statements, Variable* iterator,
|
| - Expression* completion) {
|
| +void Parser::BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements,
|
| + Variable* iterator,
|
| + Expression* completion) {
|
| //
|
| // This function adds two statements to [statements], corresponding to the
|
| // following code:
|
| @@ -6887,24 +6828,19 @@ void ParserTraits::BuildIteratorCloseForCompletion(
|
| //
|
|
|
| const int nopos = kNoSourcePosition;
|
| - auto factory = parser_->factory();
|
| - auto avfactory = parser_->ast_value_factory();
|
| - auto zone = parser_->zone();
|
| -
|
| -
|
| // let iteratorReturn = iterator.return;
|
| - Variable* var_return = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_return = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* get_return;
|
| {
|
| - Expression* iterator_proxy = factory->NewVariableProxy(iterator);
|
| - Expression* literal =
|
| - factory->NewStringLiteral(avfactory->return_string(), nopos);
|
| + Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
|
| + Expression* literal = factory()->NewStringLiteral(
|
| + ast_value_factory()->return_string(), nopos);
|
| Expression* property =
|
| - factory->NewProperty(iterator_proxy, literal, nopos);
|
| - Expression* return_proxy = factory->NewVariableProxy(var_return);
|
| - Expression* assignment = factory->NewAssignment(
|
| - Token::ASSIGN, return_proxy, property, nopos);
|
| - get_return = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewProperty(iterator_proxy, literal, nopos);
|
| + Expression* return_proxy = factory()->NewVariableProxy(var_return);
|
| + Expression* assignment =
|
| + factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos);
|
| + get_return = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| // if (!IS_CALLABLE(iteratorReturn)) {
|
| @@ -6912,35 +6848,35 @@ void ParserTraits::BuildIteratorCloseForCompletion(
|
| // }
|
| Statement* check_return_callable;
|
| {
|
| - Expression* throw_expr = NewThrowTypeError(
|
| - MessageTemplate::kReturnMethodNotCallable,
|
| - avfactory->empty_string(), nopos);
|
| + Expression* throw_expr =
|
| + NewThrowTypeError(MessageTemplate::kReturnMethodNotCallable,
|
| + ast_value_factory()->empty_string(), nopos);
|
| check_return_callable = CheckCallable(var_return, throw_expr, nopos);
|
| }
|
|
|
| // try { %_Call(iteratorReturn, iterator) } catch (_) { }
|
| Statement* try_call_return;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(2, zone);
|
| - args->Add(factory->NewVariableProxy(var_return), zone);
|
| - args->Add(factory->NewVariableProxy(iterator), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(2, zone());
|
| + args->Add(factory()->NewVariableProxy(var_return), zone());
|
| + args->Add(factory()->NewVariableProxy(iterator), zone());
|
|
|
| Expression* call =
|
| - factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
|
|
| - Block* try_block = factory->NewBlock(nullptr, 1, false, nopos);
|
| - try_block->statements()->Add(factory->NewExpressionStatement(call, nopos),
|
| - zone);
|
| + Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| + try_block->statements()->Add(factory()->NewExpressionStatement(call, nopos),
|
| + zone());
|
|
|
| - Block* catch_block = factory->NewBlock(nullptr, 0, false, nopos);
|
| + Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos);
|
|
|
| Scope* catch_scope = NewScope(CATCH_SCOPE);
|
| - Variable* catch_variable = catch_scope->DeclareLocal(
|
| - avfactory->dot_catch_string(), VAR, kCreatedInitialized,
|
| - Variable::NORMAL);
|
| + Variable* catch_variable =
|
| + catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
|
| + kCreatedInitialized, Variable::NORMAL);
|
| catch_scope->set_is_hidden();
|
|
|
| - try_call_return = factory->NewTryCatchStatement(
|
| + try_call_return = factory()->NewTryCatchStatement(
|
| try_block, catch_scope, catch_variable, catch_block, nopos);
|
| }
|
|
|
| @@ -6950,44 +6886,45 @@ void ParserTraits::BuildIteratorCloseForCompletion(
|
| // }
|
| Block* validate_return;
|
| {
|
| - Variable* var_output = parser_->NewTemporary(avfactory->empty_string());
|
| + Variable* var_output = NewTemporary(ast_value_factory()->empty_string());
|
| Statement* call_return;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(2, zone);
|
| - args->Add(factory->NewVariableProxy(var_return), zone);
|
| - args->Add(factory->NewVariableProxy(iterator), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(2, zone());
|
| + args->Add(factory()->NewVariableProxy(var_return), zone());
|
| + args->Add(factory()->NewVariableProxy(iterator), zone());
|
| Expression* call =
|
| - factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
|
|
|
| - Expression* output_proxy = factory->NewVariableProxy(var_output);
|
| + Expression* output_proxy = factory()->NewVariableProxy(var_output);
|
| Expression* assignment =
|
| - factory->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
|
| - call_return = factory->NewExpressionStatement(assignment, nopos);
|
| + factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
|
| + call_return = factory()->NewExpressionStatement(assignment, nopos);
|
| }
|
|
|
| Expression* is_receiver_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| is_receiver_call =
|
| - factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| + factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
|
| }
|
|
|
| Statement* throw_call;
|
| {
|
| - auto args = new (zone) ZoneList<Expression*>(1, zone);
|
| - args->Add(factory->NewVariableProxy(var_output), zone);
|
| - Expression* call = factory->NewCallRuntime(
|
| + auto args = new (zone()) ZoneList<Expression*>(1, zone());
|
| + args->Add(factory()->NewVariableProxy(var_output), zone());
|
| + Expression* call = factory()->NewCallRuntime(
|
| Runtime::kThrowIteratorResultNotAnObject, args, nopos);
|
| - throw_call = factory->NewExpressionStatement(call, nopos);
|
| + throw_call = factory()->NewExpressionStatement(call, nopos);
|
| }
|
|
|
| - Statement* check_return = factory->NewIfStatement(
|
| - is_receiver_call, factory->NewEmptyStatement(nopos), throw_call, nopos);
|
| + Statement* check_return = factory()->NewIfStatement(
|
| + is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
|
| + nopos);
|
|
|
| - validate_return = factory->NewBlock(nullptr, 2, false, nopos);
|
| - validate_return->statements()->Add(call_return, zone);
|
| - validate_return->statements()->Add(check_return, zone);
|
| + validate_return = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + validate_return->statements()->Add(call_return, zone());
|
| + validate_return->statements()->Add(check_return, zone());
|
| }
|
|
|
| // if (completion === kThrowCompletion) {
|
| @@ -6998,38 +6935,36 @@ void ParserTraits::BuildIteratorCloseForCompletion(
|
| // }
|
| Statement* call_return_carefully;
|
| {
|
| - Expression* condition = factory->NewCompareOperation(
|
| + Expression* condition = factory()->NewCompareOperation(
|
| Token::EQ_STRICT, completion,
|
| - factory->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
|
| + factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
|
|
|
| - Block* then_block = factory->NewBlock(nullptr, 2, false, nopos);
|
| - then_block->statements()->Add(check_return_callable, zone);
|
| - then_block->statements()->Add(try_call_return, zone);
|
| + Block* then_block = factory()->NewBlock(nullptr, 2, false, nopos);
|
| + then_block->statements()->Add(check_return_callable, zone());
|
| + then_block->statements()->Add(try_call_return, zone());
|
|
|
| - call_return_carefully =
|
| - factory->NewIfStatement(condition, then_block, validate_return, nopos);
|
| + call_return_carefully = factory()->NewIfStatement(condition, then_block,
|
| + validate_return, nopos);
|
| }
|
|
|
| // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { ... }
|
| Statement* maybe_call_return;
|
| {
|
| - Expression* condition = factory->NewCompareOperation(
|
| - Token::EQ, factory->NewVariableProxy(var_return),
|
| - factory->NewNullLiteral(nopos), nopos);
|
| + Expression* condition = factory()->NewCompareOperation(
|
| + Token::EQ, factory()->NewVariableProxy(var_return),
|
| + factory()->NewNullLiteral(nopos), nopos);
|
|
|
| - maybe_call_return =
|
| - factory->NewIfStatement(condition, factory->NewEmptyStatement(nopos),
|
| - call_return_carefully, nopos);
|
| + maybe_call_return = factory()->NewIfStatement(
|
| + condition, factory()->NewEmptyStatement(nopos), call_return_carefully,
|
| + nopos);
|
| }
|
|
|
| -
|
| - statements->Add(get_return, zone);
|
| - statements->Add(maybe_call_return, zone);
|
| + statements->Add(get_return, zone());
|
| + statements->Add(maybe_call_return, zone());
|
| }
|
|
|
| -Statement* ParserTraits::FinalizeForOfStatement(ForOfStatement* loop,
|
| - Variable* var_completion,
|
| - int pos) {
|
| +Statement* Parser::FinalizeForOfStatement(ForOfStatement* loop,
|
| + Variable* var_completion, int pos) {
|
| //
|
| // This function replaces the loop with the following wrapping:
|
| //
|
| @@ -7052,27 +6987,25 @@ Statement* ParserTraits::FinalizeForOfStatement(ForOfStatement* loop,
|
| //
|
|
|
| const int nopos = kNoSourcePosition;
|
| - auto factory = parser_->factory();
|
| - auto zone = parser_->zone();
|
|
|
| // !(completion === kNormalCompletion || IS_UNDEFINED(#iterator))
|
| Expression* closing_condition;
|
| {
|
| - Expression* lhs = factory->NewCompareOperation(
|
| - Token::EQ_STRICT, factory->NewVariableProxy(var_completion),
|
| - factory->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
|
| - Expression* rhs = factory->NewCompareOperation(
|
| - Token::EQ_STRICT, factory->NewVariableProxy(loop->iterator()),
|
| - factory->NewUndefinedLiteral(nopos), nopos);
|
| - closing_condition = factory->NewUnaryOperation(
|
| - Token::NOT, factory->NewBinaryOperation(Token::OR, lhs, rhs, nopos),
|
| + Expression* lhs = factory()->NewCompareOperation(
|
| + Token::EQ_STRICT, factory()->NewVariableProxy(var_completion),
|
| + factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
|
| + Expression* rhs = factory()->NewCompareOperation(
|
| + Token::EQ_STRICT, factory()->NewVariableProxy(loop->iterator()),
|
| + factory()->NewUndefinedLiteral(nopos), nopos);
|
| + closing_condition = factory()->NewUnaryOperation(
|
| + Token::NOT, factory()->NewBinaryOperation(Token::OR, lhs, rhs, nopos),
|
| nopos);
|
| }
|
|
|
| - Block* final_loop = factory->NewBlock(nullptr, 2, false, nopos);
|
| + Block* final_loop = factory()->NewBlock(nullptr, 2, false, nopos);
|
| {
|
| - Block* try_block = factory->NewBlock(nullptr, 1, false, nopos);
|
| - try_block->statements()->Add(loop, zone);
|
| + Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| + try_block->statements()->Add(loop, zone());
|
|
|
| FinalizeIteratorUse(var_completion, closing_condition, loop->iterator(),
|
| try_block, final_loop);
|
|
|