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

Side by Side Diff: src/parsing/parser.cc

Issue 1667503004: Fix embarrassing bug in last-minute-change to yield* CL. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 5791 matching lines...) Expand 10 before | Expand all | Expand 10 after
5802 // 5802 //
5803 // while (true) { 5803 // while (true) {
5804 // // From the generator to the iterator: 5804 // // From the generator to the iterator:
5805 // // Forward input according to resume mode and obtain output. 5805 // // Forward input according to resume mode and obtain output.
5806 // switch (mode) { 5806 // switch (mode) {
5807 // case kNext: 5807 // case kNext:
5808 // output = iterator.next(input); 5808 // output = iterator.next(input);
5809 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); 5809 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
5810 // break; 5810 // break;
5811 // case kReturn: 5811 // case kReturn:
5812 // IteratorClose(iterator, input); // See below. 5812 // IteratorClose(iterator, input, output); // See below.
5813 // break; 5813 // break;
5814 // case kThrow: 5814 // case kThrow:
5815 // let iteratorThrow = iterator.throw; 5815 // let iteratorThrow = iterator.throw;
5816 // if (IS_NULL_OR_UNDEFINED(iteratorThrow)) { 5816 // if (IS_NULL_OR_UNDEFINED(iteratorThrow)) {
5817 // IteratorClose(iterator); // See below. 5817 // IteratorClose(iterator); // See below.
5818 // throw MakeTypeError(kThrowMethodMissing); 5818 // throw MakeTypeError(kThrowMethodMissing);
5819 // } 5819 // }
5820 // output = %_Call(iteratorThrow, iterator, input); 5820 // output = %_Call(iteratorThrow, iterator, input);
5821 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output); 5821 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
5822 // break; 5822 // break;
(...skipping 16 matching lines...) Expand all
5839 // } 5839 // }
5840 // } 5840 // }
5841 // 5841 //
5842 // output.value; 5842 // output.value;
5843 // } 5843 // }
5844 // 5844 //
5845 // IteratorClose(iterator) expands to the following: 5845 // IteratorClose(iterator) expands to the following:
5846 // 5846 //
5847 // let iteratorReturn = iterator.return; 5847 // let iteratorReturn = iterator.return;
5848 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return; 5848 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return;
5849 // let result = %_Call(iteratorReturn, iterator); 5849 // let output = %_Call(iteratorReturn, iterator);
5850 // if (!IS_RECEIVER(result)) %ThrowIterResultNotAnObject(result); 5850 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
5851 // 5851 //
5852 // IteratorClose(iterator, input) expands to the following: 5852 // IteratorClose(iterator, input, output) expands to the following:
5853 // 5853 //
5854 // let iteratorReturn = iterator.return; 5854 // let iteratorReturn = iterator.return;
5855 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input; 5855 // if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input;
5856 // let result = %_Call(iteratorReturn, iterator, input); 5856 // output = %_Call(iteratorReturn, iterator, input);
5857 // if (!IS_RECEIVER(result)) %ThrowIterResultNotAnObject(result); 5857 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
5858 5858
5859 5859
5860 Expression* ParserTraits::RewriteYieldStar( 5860 Expression* ParserTraits::RewriteYieldStar(
5861 Expression* generator, Expression* iterable, int pos) { 5861 Expression* generator, Expression* iterable, int pos) {
5862 5862
5863 const int nopos = RelocInfo::kNoPosition; 5863 const int nopos = RelocInfo::kNoPosition;
5864 5864
5865 auto factory = parser_->factory(); 5865 auto factory = parser_->factory();
5866 auto avfactory = parser_->ast_value_factory(); 5866 auto avfactory = parser_->ast_value_factory();
5867 auto scope = parser_->scope_; 5867 auto scope = parser_->scope_;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
6016 Expression* condition = factory->NewCompareOperation( 6016 Expression* condition = factory->NewCompareOperation(
6017 Token::EQ, factory->NewVariableProxy(var_throw), 6017 Token::EQ, factory->NewVariableProxy(var_throw),
6018 factory->NewNullLiteral(nopos), nopos); 6018 factory->NewNullLiteral(nopos), nopos);
6019 6019
6020 Expression* call = NewThrowTypeError( 6020 Expression* call = NewThrowTypeError(
6021 MessageTemplate::kThrowMethodMissing, 6021 MessageTemplate::kThrowMethodMissing,
6022 avfactory->empty_string(), nopos); 6022 avfactory->empty_string(), nopos);
6023 Statement* throw_call = factory->NewExpressionStatement(call, nopos); 6023 Statement* throw_call = factory->NewExpressionStatement(call, nopos);
6024 6024
6025 Block* then = factory->NewBlock(nullptr, 4+1, false, nopos); 6025 Block* then = factory->NewBlock(nullptr, 4+1, false, nopos);
6026 BuildIteratorClose(then->statements(), var_iterator, Nothing<Variable*>()); 6026 BuildIteratorClose(then->statements(), var_iterator, Nothing<Variable*>(),
6027 Nothing<Variable*>());
6027 then->statements()->Add(throw_call, zone); 6028 then->statements()->Add(throw_call, zone);
6028 check_throw = 6029 check_throw =
6029 factory->NewIfStatement(condition, then, skip, nopos); 6030 factory->NewIfStatement(condition, then, skip, nopos);
6030 } 6031 }
6031 6032
6032 6033
6033 // output = %_Call(iteratorThrow, iterator, input); 6034 // output = %_Call(iteratorThrow, iterator, input);
6034 Statement* call_throw; 6035 Statement* call_throw;
6035 { 6036 {
6036 auto args = new (zone) ZoneList<Expression*>(3, zone); 6037 auto args = new (zone) ZoneList<Expression*>(3, zone);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
6188 6189
6189 // switch (mode) { ... } 6190 // switch (mode) { ... }
6190 SwitchStatement* switch_mode = factory->NewSwitchStatement(nullptr, nopos); 6191 SwitchStatement* switch_mode = factory->NewSwitchStatement(nullptr, nopos);
6191 { 6192 {
6192 auto case_next = new (zone) ZoneList<Statement*>(3, zone); 6193 auto case_next = new (zone) ZoneList<Statement*>(3, zone);
6193 case_next->Add(call_next, zone); 6194 case_next->Add(call_next, zone);
6194 case_next->Add(validate_next_output, zone); 6195 case_next->Add(validate_next_output, zone);
6195 case_next->Add(factory->NewBreakStatement(switch_mode, nopos), zone); 6196 case_next->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
6196 6197
6197 auto case_return = new (zone) ZoneList<Statement*>(5, zone); 6198 auto case_return = new (zone) ZoneList<Statement*>(5, zone);
6198 BuildIteratorClose(case_return, var_iterator, Just(var_input)); 6199 BuildIteratorClose(
6200 case_return, var_iterator, Just(var_input), Just(var_output));
6199 case_return->Add(factory->NewBreakStatement(switch_mode, nopos), zone); 6201 case_return->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
6200 6202
6201 auto case_throw = new (zone) ZoneList<Statement*>(5, zone); 6203 auto case_throw = new (zone) ZoneList<Statement*>(5, zone);
6202 case_throw->Add(get_throw, zone); 6204 case_throw->Add(get_throw, zone);
6203 case_throw->Add(check_throw, zone); 6205 case_throw->Add(check_throw, zone);
6204 case_throw->Add(call_throw, zone); 6206 case_throw->Add(call_throw, zone);
6205 case_throw->Add(validate_throw_output, zone); 6207 case_throw->Add(validate_throw_output, zone);
6206 case_throw->Add(factory->NewBreakStatement(switch_mode, nopos), zone); 6208 case_throw->Add(factory->NewBreakStatement(switch_mode, nopos), zone);
6207 6209
6208 auto cases = new (zone) ZoneList<CaseClause*>(3, zone); 6210 auto cases = new (zone) ZoneList<CaseClause*>(3, zone);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
6252 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); 6254 yield_star = factory->NewDoExpression(do_block, dot_result, nopos);
6253 Rewriter::Rewrite(parser_, yield_star, avfactory); 6255 Rewriter::Rewrite(parser_, yield_star, avfactory);
6254 } 6256 }
6255 6257
6256 return yield_star; 6258 return yield_star;
6257 } 6259 }
6258 6260
6259 6261
6260 void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements, 6262 void ParserTraits::BuildIteratorClose(ZoneList<Statement*>* statements,
6261 Variable* iterator, 6263 Variable* iterator,
6262 Maybe<Variable*> input) { 6264 Maybe<Variable*> input,
6265 Maybe<Variable*> output) {
6263 const int nopos = RelocInfo::kNoPosition; 6266 const int nopos = RelocInfo::kNoPosition;
6264 auto factory = parser_->factory(); 6267 auto factory = parser_->factory();
6265 auto avfactory = parser_->ast_value_factory(); 6268 auto avfactory = parser_->ast_value_factory();
6266 auto scope = parser_->scope_; 6269 auto scope = parser_->scope_;
6267 auto zone = parser_->zone(); 6270 auto zone = parser_->zone();
6268 Statement* skip = factory->NewEmptyStatement(nopos); 6271 Statement* skip = factory->NewEmptyStatement(nopos);
6269 6272
6270 // let iteratorReturn = iterator.return; 6273 // let iteratorReturn = iterator.return;
6271 Variable* var = scope->NewTemporary(avfactory->empty_string()); 6274 Variable* var = scope->NewTemporary(avfactory->empty_string());
6272 Statement* get_return; 6275 Statement* get_return;
(...skipping 20 matching lines...) Expand all
6293 Expression* value = input.IsJust() ? 6296 Expression* value = input.IsJust() ?
6294 static_cast<Expression*>(factory->NewVariableProxy(input.FromJust())) : 6297 static_cast<Expression*>(factory->NewVariableProxy(input.FromJust())) :
6295 factory->NewUndefinedLiteral(nopos); 6298 factory->NewUndefinedLiteral(nopos);
6296 6299
6297 Statement* return_undefined = factory->NewReturnStatement(value, nopos); 6300 Statement* return_undefined = factory->NewReturnStatement(value, nopos);
6298 6301
6299 check_return = 6302 check_return =
6300 factory->NewIfStatement(condition, return_undefined, skip, nopos); 6303 factory->NewIfStatement(condition, return_undefined, skip, nopos);
6301 } 6304 }
6302 6305
6303 // let result = %_Call(iteratorReturn, iterator); OR 6306 // let output = %_Call(iteratorReturn, iterator); OR
6304 // let result = %_Call(iteratorReturn, iterator, input); 6307 // output = %_Call(iteratorReturn, iterator, input);
6305 Statement* call_return; 6308 Statement* call_return;
6306 { 6309 {
6307 auto args = new (zone) ZoneList<Expression*>(3, zone); 6310 auto args = new (zone) ZoneList<Expression*>(3, zone);
6308 args->Add(factory->NewVariableProxy(var), zone); 6311 args->Add(factory->NewVariableProxy(var), zone);
6309 args->Add(factory->NewVariableProxy(iterator), zone); 6312 args->Add(factory->NewVariableProxy(iterator), zone);
6310 if (input.IsJust()) { 6313 if (input.IsJust()) {
6311 args->Add(factory->NewVariableProxy(input.FromJust()), zone); 6314 args->Add(factory->NewVariableProxy(input.FromJust()), zone);
6312 } 6315 }
6313 6316
6314 Expression* call = 6317 Expression* call =
6315 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos); 6318 factory->NewCallRuntime(Runtime::kInlineCall, args, nopos);
6319 Expression* output_proxy = factory->NewVariableProxy(
6320 output.IsJust() ? output.FromJust() : var);
6316 Expression* assignment = factory->NewAssignment( 6321 Expression* assignment = factory->NewAssignment(
6317 Token::ASSIGN, factory->NewVariableProxy(var), call, nopos); 6322 Token::ASSIGN, output_proxy, call, nopos);
6318 call_return = factory->NewExpressionStatement(assignment, nopos); 6323 call_return = factory->NewExpressionStatement(assignment, nopos);
6319 } 6324 }
6320 6325
6321 // if (!IS_RECEIVER(result)) %ThrowIterResultNotAnObject(result); 6326 // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
6322 Statement* validate_result; 6327 Statement* validate_output;
6323 { 6328 {
6324 Expression* is_receiver_call; 6329 Expression* is_receiver_call;
6325 { 6330 {
6326 auto args = new (zone) ZoneList<Expression*>(1, zone); 6331 auto args = new (zone) ZoneList<Expression*>(1, zone);
6327 args->Add(factory->NewVariableProxy(var), zone); 6332 args->Add(factory->NewVariableProxy(var), zone);
6328 is_receiver_call = 6333 is_receiver_call =
6329 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos); 6334 factory->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
6330 } 6335 }
6331 6336
6332 Statement* throw_call; 6337 Statement* throw_call;
6333 { 6338 {
6334 auto args = new (zone) ZoneList<Expression*>(1, zone); 6339 auto args = new (zone) ZoneList<Expression*>(1, zone);
6335 args->Add(factory->NewVariableProxy(var), zone); 6340 args->Add(factory->NewVariableProxy(var), zone);
6336 Expression* call = factory->NewCallRuntime( 6341 Expression* call = factory->NewCallRuntime(
6337 Runtime::kThrowIteratorResultNotAnObject, args, nopos); 6342 Runtime::kThrowIteratorResultNotAnObject, args, nopos);
6338 throw_call = factory->NewExpressionStatement(call, nopos); 6343 throw_call = factory->NewExpressionStatement(call, nopos);
6339 } 6344 }
6340 6345
6341 validate_result = 6346 validate_output =
6342 factory->NewIfStatement(is_receiver_call, skip, throw_call, nopos); 6347 factory->NewIfStatement(is_receiver_call, skip, throw_call, nopos);
6343 } 6348 }
6344 6349
6345 statements->Add(get_return, zone); 6350 statements->Add(get_return, zone);
6346 statements->Add(check_return, zone); 6351 statements->Add(check_return, zone);
6347 statements->Add(call_return, zone); 6352 statements->Add(call_return, zone);
6348 statements->Add(validate_result, zone); 6353 statements->Add(validate_output, zone);
6349 } 6354 }
6350 6355
6351 6356
6352 } // namespace internal 6357 } // namespace internal
6353 } // namespace v8 6358 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698