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

Side by Side Diff: src/parser.cc

Issue 377833003: Fix for-loop with const/let and empty condition/iteration statements. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/harmony/empty-for.js » ('j') | 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/base/platform/platform.h" 9 #include "src/base/platform/platform.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 2983 matching lines...) Expand 10 before | Expand all | Expand 10 after
2994 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); 2994 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
2995 Assignment* assignment = factory()->NewAssignment( 2995 Assignment* assignment = factory()->NewAssignment(
2996 Token::INIT_LET, proxy, temp_proxy, pos); 2996 Token::INIT_LET, proxy, temp_proxy, pos);
2997 Statement* assignment_statement = factory()->NewExpressionStatement( 2997 Statement* assignment_statement = factory()->NewExpressionStatement(
2998 assignment, pos); 2998 assignment, pos);
2999 proxy->var()->set_initializer_position(pos); 2999 proxy->var()->set_initializer_position(pos);
3000 inner_block->AddStatement(assignment_statement, zone()); 3000 inner_block->AddStatement(assignment_statement, zone());
3001 } 3001 }
3002 3002
3003 // Make statement: if (flag == 1) { flag = 0; } else { next; }. 3003 // Make statement: if (flag == 1) { flag = 0; } else { next; }.
3004 { 3004 if (next) {
3005 Expression* compare = NULL; 3005 Expression* compare = NULL;
3006 // Make compare expresion: flag == 1. 3006 // Make compare expresion: flag == 1.
3007 { 3007 {
3008 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); 3008 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition);
3009 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3009 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
3010 compare = factory()->NewCompareOperation( 3010 compare = factory()->NewCompareOperation(
3011 Token::EQ, flag_proxy, const1, pos); 3011 Token::EQ, flag_proxy, const1, pos);
3012 } 3012 }
3013 Statement* clear_flag = NULL; 3013 Statement* clear_flag = NULL;
3014 // Make statement: flag = 0. 3014 // Make statement: flag = 0.
3015 { 3015 {
3016 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); 3016 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
3017 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition); 3017 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition);
3018 Assignment* assignment = factory()->NewAssignment( 3018 Assignment* assignment = factory()->NewAssignment(
3019 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); 3019 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition);
3020 clear_flag = factory()->NewExpressionStatement(assignment, pos); 3020 clear_flag = factory()->NewExpressionStatement(assignment, pos);
3021 } 3021 }
3022 Statement* clear_flag_or_next = factory()->NewIfStatement( 3022 Statement* clear_flag_or_next = factory()->NewIfStatement(
3023 compare, clear_flag, next, RelocInfo::kNoPosition); 3023 compare, clear_flag, next, RelocInfo::kNoPosition);
3024 inner_block->AddStatement(clear_flag_or_next, zone()); 3024 inner_block->AddStatement(clear_flag_or_next, zone());
3025 } 3025 }
3026 3026
3027 3027
3028 // Make statement: if (cond) { } else { break; }. 3028 // Make statement: if (cond) { } else { break; }.
3029 { 3029 if (cond) {
3030 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); 3030 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
3031 BreakableStatement* t = LookupBreakTarget(NULL, CHECK_OK); 3031 BreakableStatement* t = LookupBreakTarget(NULL, CHECK_OK);
3032 Statement* stop = factory()->NewBreakStatement(t, RelocInfo::kNoPosition); 3032 Statement* stop = factory()->NewBreakStatement(t, RelocInfo::kNoPosition);
3033 Statement* if_not_cond_break = factory()->NewIfStatement( 3033 Statement* if_not_cond_break = factory()->NewIfStatement(
3034 cond, empty, stop, cond->position()); 3034 cond, empty, stop, cond->position());
3035 inner_block->AddStatement(if_not_cond_break, zone()); 3035 inner_block->AddStatement(if_not_cond_break, zone());
3036 } 3036 }
3037 3037
3038 inner_block->AddStatement(body, zone()); 3038 inner_block->AddStatement(body, zone());
3039 3039
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
3241 Statement* body = ParseStatement(NULL, CHECK_OK); 3241 Statement* body = ParseStatement(NULL, CHECK_OK);
3242 3242
3243 Statement* result = NULL; 3243 Statement* result = NULL;
3244 if (let_bindings.length() > 0) { 3244 if (let_bindings.length() > 0) {
3245 scope_ = for_scope; 3245 scope_ = for_scope;
3246 result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop, 3246 result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop,
3247 init, cond, next, body, CHECK_OK); 3247 init, cond, next, body, CHECK_OK);
3248 scope_ = saved_scope; 3248 scope_ = saved_scope;
3249 for_scope->set_end_position(scanner()->location().end_pos); 3249 for_scope->set_end_position(scanner()->location().end_pos);
3250 } else { 3250 } else {
3251 loop->Initialize(init, cond, next, body);
3252 result = loop;
3253 scope_ = saved_scope; 3251 scope_ = saved_scope;
3254 for_scope->set_end_position(scanner()->location().end_pos); 3252 for_scope->set_end_position(scanner()->location().end_pos);
3255 for_scope->FinalizeBlockScope(); 3253 for_scope = for_scope->FinalizeBlockScope();
3254 if (for_scope) {
3255 // Rewrite a for statement of the form
3256 // for (const x = i; c; n) b
3257 //
3258 // into
3259 //
3260 // {
3261 // const x = i;
3262 // for (; c; n) b
3263 // }
3264 ASSERT(init != NULL);
3265 Block* block =
3266 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition);
3267 block->AddStatement(init, zone());
3268 block->AddStatement(loop, zone());
3269 block->set_scope(for_scope);
3270 loop->Initialize(NULL, cond, next, body);
3271 result = block;
3272 } else {
3273 loop->Initialize(init, cond, next, body);
3274 result = loop;
3275 }
3256 } 3276 }
3257 return result; 3277 return result;
3258 } 3278 }
3259 3279
3260 3280
3261 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { 3281 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) {
3262 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser 3282 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
3263 // contexts this is used as a statement which invokes the debugger as i a 3283 // contexts this is used as a statement which invokes the debugger as i a
3264 // break point is present. 3284 // break point is present.
3265 // DebuggerStatement :: 3285 // DebuggerStatement ::
(...skipping 1600 matching lines...) Expand 10 before | Expand all | Expand 10 after
4866 info()->SetAstValueFactory(ast_value_factory_); 4886 info()->SetAstValueFactory(ast_value_factory_);
4867 } 4887 }
4868 ast_value_factory_ = NULL; 4888 ast_value_factory_ = NULL;
4869 4889
4870 InternalizeUseCounts(); 4890 InternalizeUseCounts();
4871 4891
4872 return (result != NULL); 4892 return (result != NULL);
4873 } 4893 }
4874 4894
4875 } } // namespace v8::internal 4895 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/harmony/empty-for.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698