Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 2965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2976 result_done, | 2976 result_done, |
| 2977 assign_each); | 2977 assign_each); |
| 2978 } else { | 2978 } else { |
| 2979 stmt->Initialize(each, subject, body); | 2979 stmt->Initialize(each, subject, body); |
| 2980 } | 2980 } |
| 2981 } | 2981 } |
| 2982 | 2982 |
| 2983 | 2983 |
| 2984 Statement* Parser::DesugarLetBindingsInForStatement( | 2984 Statement* Parser::DesugarLetBindingsInForStatement( |
| 2985 Scope* inner_scope, ZoneList<const AstRawString*>* names, | 2985 Scope* inner_scope, ZoneList<const AstRawString*>* names, |
| 2986 ForStatement* loop, Statement* init, Expression* cond, Statement* next, | 2986 ForStatement* loop, Statement* init, Expression* cond, Expression* next, |
| 2987 Statement* body, bool* ok) { | 2987 Statement* body, bool* ok) { |
| 2988 // ES6 13.6.3.4 specifies that on each loop iteration the let variables are | 2988 // ES6 13.6.3.4 specifies that on each loop iteration the let variables are |
| 2989 // copied into a new environment. After copying, the "next" statement of the | 2989 // copied into a new environment. After copying, the "next" statement of the |
| 2990 // loop is executed to update the loop variables. The loop condition is | 2990 // loop is executed to update the loop variables. The loop condition is |
| 2991 // checked and the loop body is executed. | 2991 // checked and the loop body is executed. |
| 2992 // | 2992 // |
| 2993 // We rewrite a for statement of the form | 2993 // We rewrite a for statement of the form |
| 2994 // | 2994 // |
| 2995 // for (let x = i; cond; next) body | 2995 // labels: for (let x = i; cond; next) body |
| 2996 // | 2996 // |
| 2997 // into | 2997 // into |
| 2998 // | 2998 // |
| 2999 // { | 2999 // { |
| 3000 // let x = i; | 3000 // let x = i; |
| 3001 // temp_x = x; | 3001 // temp_x = x; |
| 3002 // flag = 1; | 3002 // first = 1; |
| 3003 // for (;;) { | 3003 // outer: for (;;) { |
| 3004 // let x = temp_x; | 3004 // let x = temp_x; |
| 3005 // if (flag == 1) { | 3005 // if (first == 1) { |
| 3006 // flag = 0; | 3006 // first = 0; |
| 3007 // } else { | |
| 3008 // next; | |
| 3009 // } | |
| 3010 // flag = 1; | |
| 3011 // labels: for (; flag == 1; temp_x = x, flag = 0) { | |
| 3012 // if (cond) { | |
| 3013 // body | |
| 3007 // } else { | 3014 // } else { |
| 3008 // next; | 3015 // break outer; |
| 3009 // } | 3016 // } |
| 3010 // if (cond) { | 3017 // } |
| 3011 // <empty> | 3018 // if (flag == 1) { |
| 3012 // } else { | 3019 // break; |
| 3013 // break; | 3020 // } |
| 3014 // } | 3021 // } |
| 3015 // b | |
| 3016 // temp_x = x; | |
| 3017 // } | |
| 3018 // } | 3022 // } |
| 3019 | 3023 |
| 3020 DCHECK(names->length() > 0); | 3024 DCHECK(names->length() > 0); |
| 3021 Scope* for_scope = scope_; | 3025 Scope* for_scope = scope_; |
| 3022 ZoneList<Variable*> temps(names->length(), zone()); | 3026 ZoneList<Variable*> temps(names->length(), zone()); |
| 3023 | 3027 |
| 3024 Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false, | 3028 Block* outer_block = factory()->NewBlock(NULL, names->length() + 2, false, |
| 3025 RelocInfo::kNoPosition); | 3029 RelocInfo::kNoPosition); |
| 3030 | |
| 3026 outer_block->AddStatement(init, zone()); | 3031 outer_block->AddStatement(init, zone()); |
| 3027 | 3032 |
| 3028 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); | 3033 const AstRawString* temp_name = ast_value_factory()->dot_for_string(); |
| 3029 | 3034 |
| 3030 // For each let variable x: | 3035 // For each let variable x: |
| 3031 // make statement: temp_x = x. | 3036 // make statement: temp_x = x. |
| 3032 for (int i = 0; i < names->length(); i++) { | 3037 for (int i = 0; i < names->length(); i++) { |
| 3033 VariableProxy* proxy = | 3038 VariableProxy* proxy = |
| 3034 NewUnresolved(names->at(i), LET, Interface::NewValue()); | 3039 NewUnresolved(names->at(i), LET, Interface::NewValue()); |
| 3035 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); | 3040 Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name); |
| 3036 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); | 3041 VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
| 3037 Assignment* assignment = factory()->NewAssignment( | 3042 Assignment* assignment = factory()->NewAssignment( |
| 3038 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); | 3043 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); |
| 3039 Statement* assignment_statement = factory()->NewExpressionStatement( | 3044 Statement* assignment_statement = factory()->NewExpressionStatement( |
| 3040 assignment, RelocInfo::kNoPosition); | 3045 assignment, RelocInfo::kNoPosition); |
| 3041 outer_block->AddStatement(assignment_statement, zone()); | 3046 outer_block->AddStatement(assignment_statement, zone()); |
| 3042 temps.Add(temp, zone()); | 3047 temps.Add(temp, zone()); |
| 3043 } | 3048 } |
| 3044 | 3049 |
| 3045 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); | 3050 // Make statement: outer: for (;;) |
| 3046 // Make statement: flag = 1. | 3051 // Note that we don't actually create the label, or set this loop up as an |
| 3047 { | 3052 // explicit break target, instead handing it directly to those nodes that |
| 3048 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 3053 // need to know about it. This should be safe because we don't run any code |
| 3049 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | 3054 // in this function that looks up break targets. |
| 3050 Assignment* assignment = factory()->NewAssignment( | 3055 ForStatement* outer_loop = |
| 3051 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); | 3056 factory()->NewForStatement(NULL, RelocInfo::kNoPosition); |
| 3052 Statement* assignment_statement = factory()->NewExpressionStatement( | 3057 outer_block->AddStatement(outer_loop, zone()); |
| 3053 assignment, RelocInfo::kNoPosition); | |
| 3054 outer_block->AddStatement(assignment_statement, zone()); | |
| 3055 } | |
| 3056 | 3058 |
| 3057 outer_block->AddStatement(loop, zone()); | |
| 3058 outer_block->set_scope(for_scope); | 3059 outer_block->set_scope(for_scope); |
| 3059 scope_ = inner_scope; | 3060 scope_ = inner_scope; |
| 3060 | 3061 |
| 3061 Block* inner_block = factory()->NewBlock(NULL, 2 * names->length() + 3, | 3062 Block* inner_block = factory()->NewBlock(NULL, names->length() + 3, false, |
| 3062 false, RelocInfo::kNoPosition); | 3063 RelocInfo::kNoPosition); |
| 3063 int pos = scanner()->location().beg_pos; | 3064 int pos = scanner()->location().beg_pos; |
| 3064 ZoneList<Variable*> inner_vars(names->length(), zone()); | 3065 ZoneList<Variable*> inner_vars(names->length(), zone()); |
| 3065 | 3066 |
| 3066 // For each let variable x: | 3067 // For each let variable x: |
| 3067 // make statement: let x = temp_x. | 3068 // make statement: let x = temp_x. |
| 3068 for (int i = 0; i < names->length(); i++) { | 3069 for (int i = 0; i < names->length(); i++) { |
| 3069 VariableProxy* proxy = | 3070 VariableProxy* proxy = |
| 3070 NewUnresolved(names->at(i), LET, Interface::NewValue()); | 3071 NewUnresolved(names->at(i), LET, Interface::NewValue()); |
| 3071 Declaration* declaration = | 3072 Declaration* declaration = |
| 3072 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); | 3073 factory()->NewVariableDeclaration(proxy, LET, scope_, pos); |
| 3073 Declare(declaration, true, CHECK_OK); | 3074 Declare(declaration, true, CHECK_OK); |
| 3074 inner_vars.Add(declaration->proxy()->var(), zone()); | 3075 inner_vars.Add(declaration->proxy()->var(), zone()); |
| 3075 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); | 3076 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); |
| 3076 Assignment* assignment = factory()->NewAssignment( | 3077 Assignment* assignment = factory()->NewAssignment( |
| 3077 Token::INIT_LET, proxy, temp_proxy, pos); | 3078 Token::INIT_LET, proxy, temp_proxy, pos); |
| 3078 Statement* assignment_statement = factory()->NewExpressionStatement( | 3079 Statement* assignment_statement = factory()->NewExpressionStatement( |
| 3079 assignment, pos); | 3080 assignment, pos); |
| 3080 proxy->var()->set_initializer_position(pos); | 3081 proxy->var()->set_initializer_position(pos); |
| 3081 inner_block->AddStatement(assignment_statement, zone()); | 3082 inner_block->AddStatement(assignment_statement, zone()); |
| 3082 } | 3083 } |
| 3083 | 3084 |
| 3084 // Make statement: if (flag == 1) { flag = 0; } else { next; }. | 3085 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); |
| 3085 if (next) { | 3086 // Make statement: flag = 1. |
| 3087 { | |
| 3088 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | |
| 3089 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | |
|
arv (Not doing code reviews)
2014/11/13 16:15:43
Maybe we should make these default to RelocInfo::k
| |
| 3090 Assignment* assignment = factory()->NewAssignment( | |
| 3091 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); | |
| 3092 Statement* assignment_statement = | |
| 3093 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); | |
| 3094 inner_block->AddStatement(assignment_statement, zone()); | |
| 3095 } | |
| 3096 | |
| 3097 // Make cond expression for main loop: flag == 1. | |
| 3098 Expression* flag_cond = NULL; | |
| 3099 { | |
| 3100 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | |
| 3101 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | |
| 3102 flag_cond = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1, | |
| 3103 RelocInfo::kNoPosition); | |
| 3104 } | |
| 3105 | |
| 3106 // Create chain of expressions "next, temp_x = x, ..., flag = 0" | |
| 3107 Statement* compound_next_statement = NULL; | |
| 3108 { | |
| 3109 Expression* compound_next = next; | |
| 3110 | |
| 3111 // Make the comma-separated list of temp_x = x assignments. | |
| 3112 for (int i = 0; i < names->length(); i++) { | |
| 3113 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); | |
| 3114 VariableProxy* proxy = | |
| 3115 factory()->NewVariableProxy(inner_vars.at(i), RelocInfo::kNoPosition); | |
| 3116 Assignment* assignment = factory()->NewAssignment( | |
| 3117 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); | |
| 3118 if (compound_next) { | |
| 3119 compound_next = factory()->NewBinaryOperation( | |
| 3120 Token::COMMA, compound_next, assignment, RelocInfo::kNoPosition); | |
| 3121 } else { | |
| 3122 compound_next = assignment; | |
| 3123 } | |
| 3124 } | |
| 3125 | |
| 3126 // Make expression: flag = 0. | |
| 3127 { | |
| 3128 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | |
| 3129 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition); | |
| 3130 Assignment* assignment = factory()->NewAssignment( | |
| 3131 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); | |
| 3132 compound_next = factory()->NewBinaryOperation( | |
| 3133 Token::COMMA, compound_next, assignment, RelocInfo::kNoPosition); | |
| 3134 } | |
| 3135 | |
| 3136 compound_next_statement = factory()->NewExpressionStatement( | |
| 3137 compound_next, next ? next->position() : RelocInfo::kNoPosition); | |
| 3138 } | |
| 3139 | |
| 3140 // Make statement: if (cond) { body; } else { break aux; } | |
| 3141 Statement* if_cond_body_else_stop = NULL; | |
| 3142 { | |
| 3143 Statement* stop = | |
| 3144 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition); | |
| 3145 if_cond_body_else_stop = | |
| 3146 factory()->NewIfStatement(cond, body, stop, cond->position()); | |
| 3147 } | |
| 3148 | |
| 3149 // TODO(adamk): Does the order matter? | |
| 3150 loop->Initialize(NULL, flag_cond, compound_next_statement, | |
| 3151 if_cond_body_else_stop); | |
| 3152 inner_block->AddStatement(loop, zone()); | |
| 3153 | |
| 3154 // Make statement: if (flag == 1) { break; } | |
| 3155 { | |
| 3156 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); | |
| 3086 Expression* compare = NULL; | 3157 Expression* compare = NULL; |
| 3087 // Make compare expresion: flag == 1. | 3158 // Make compare expresion: flag == 1. |
| 3088 { | 3159 { |
| 3089 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); | 3160 Expression* const1 = factory()->NewSmiLiteral(1, RelocInfo::kNoPosition); |
| 3090 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 3161 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 3091 compare = factory()->NewCompareOperation( | 3162 compare = |
| 3092 Token::EQ, flag_proxy, const1, pos); | 3163 factory()->NewCompareOperation(Token::EQ, flag_proxy, const1, pos); |
| 3093 } | 3164 } |
| 3094 Statement* clear_flag = NULL; | 3165 Statement* stop = |
| 3095 // Make statement: flag = 0. | 3166 factory()->NewBreakStatement(outer_loop, RelocInfo::kNoPosition); |
| 3096 { | 3167 Statement* if_flag_break = |
| 3097 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 3168 factory()->NewIfStatement(compare, stop, empty, RelocInfo::kNoPosition); |
| 3098 Expression* const0 = factory()->NewSmiLiteral(0, RelocInfo::kNoPosition); | 3169 inner_block->AddStatement(if_flag_break, zone()); |
| 3099 Assignment* assignment = factory()->NewAssignment( | |
| 3100 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); | |
| 3101 clear_flag = factory()->NewExpressionStatement(assignment, pos); | |
| 3102 } | |
| 3103 Statement* clear_flag_or_next = factory()->NewIfStatement( | |
| 3104 compare, clear_flag, next, RelocInfo::kNoPosition); | |
| 3105 inner_block->AddStatement(clear_flag_or_next, zone()); | |
| 3106 } | |
| 3107 | |
| 3108 | |
| 3109 // Make statement: if (cond) { } else { break; }. | |
| 3110 if (cond) { | |
| 3111 Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition); | |
| 3112 BreakableStatement* t = LookupBreakTarget(NULL, CHECK_OK); | |
| 3113 Statement* stop = factory()->NewBreakStatement(t, RelocInfo::kNoPosition); | |
| 3114 Statement* if_not_cond_break = factory()->NewIfStatement( | |
| 3115 cond, empty, stop, cond->position()); | |
| 3116 inner_block->AddStatement(if_not_cond_break, zone()); | |
| 3117 } | |
| 3118 | |
| 3119 inner_block->AddStatement(body, zone()); | |
| 3120 | |
| 3121 // For each let variable x: | |
| 3122 // make statement: temp_x = x; | |
| 3123 for (int i = 0; i < names->length(); i++) { | |
| 3124 VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i)); | |
| 3125 int pos = scanner()->location().end_pos; | |
| 3126 VariableProxy* proxy = factory()->NewVariableProxy(inner_vars.at(i), pos); | |
| 3127 Assignment* assignment = factory()->NewAssignment( | |
| 3128 Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition); | |
| 3129 Statement* assignment_statement = factory()->NewExpressionStatement( | |
| 3130 assignment, RelocInfo::kNoPosition); | |
| 3131 inner_block->AddStatement(assignment_statement, zone()); | |
| 3132 } | 3170 } |
| 3133 | 3171 |
| 3134 inner_scope->set_end_position(scanner()->location().end_pos); | 3172 inner_scope->set_end_position(scanner()->location().end_pos); |
| 3135 inner_block->set_scope(inner_scope); | 3173 inner_block->set_scope(inner_scope); |
| 3136 scope_ = for_scope; | 3174 scope_ = for_scope; |
| 3137 | 3175 |
| 3138 loop->Initialize(NULL, NULL, NULL, inner_block); | 3176 outer_loop->Initialize(NULL, NULL, NULL, inner_block); |
| 3139 return outer_block; | 3177 return outer_block; |
| 3140 } | 3178 } |
| 3141 | 3179 |
| 3142 | 3180 |
| 3143 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, | 3181 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
| 3144 bool* ok) { | 3182 bool* ok) { |
| 3145 // ForStatement :: | 3183 // ForStatement :: |
| 3146 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement | 3184 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
| 3147 | 3185 |
| 3148 int stmt_pos = peek_position(); | 3186 int stmt_pos = peek_position(); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3310 inner_scope->set_start_position(scanner()->location().beg_pos); | 3348 inner_scope->set_start_position(scanner()->location().beg_pos); |
| 3311 scope_ = inner_scope; | 3349 scope_ = inner_scope; |
| 3312 } | 3350 } |
| 3313 | 3351 |
| 3314 Expression* cond = NULL; | 3352 Expression* cond = NULL; |
| 3315 if (peek() != Token::SEMICOLON) { | 3353 if (peek() != Token::SEMICOLON) { |
| 3316 cond = ParseExpression(true, CHECK_OK); | 3354 cond = ParseExpression(true, CHECK_OK); |
| 3317 } | 3355 } |
| 3318 Expect(Token::SEMICOLON, CHECK_OK); | 3356 Expect(Token::SEMICOLON, CHECK_OK); |
| 3319 | 3357 |
| 3320 Statement* next = NULL; | 3358 Expression* next = NULL; |
| 3321 if (peek() != Token::RPAREN) { | 3359 if (peek() != Token::RPAREN) { |
| 3322 int next_pos = position(); | 3360 next = ParseExpression(true, CHECK_OK); |
| 3323 Expression* exp = ParseExpression(true, CHECK_OK); | |
| 3324 next = factory()->NewExpressionStatement(exp, next_pos); | |
| 3325 } | 3361 } |
| 3326 Expect(Token::RPAREN, CHECK_OK); | 3362 Expect(Token::RPAREN, CHECK_OK); |
| 3327 | 3363 |
| 3328 Statement* body = ParseStatement(NULL, CHECK_OK); | 3364 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 3329 | 3365 |
| 3330 Statement* result = NULL; | 3366 Statement* result = NULL; |
| 3331 if (let_bindings.length() > 0) { | 3367 if (let_bindings.length() > 0) { |
| 3332 scope_ = for_scope; | 3368 scope_ = for_scope; |
| 3333 result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop, | 3369 result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop, |
| 3334 init, cond, next, body, CHECK_OK); | 3370 init, cond, next, body, CHECK_OK); |
| 3335 scope_ = saved_scope; | 3371 scope_ = saved_scope; |
| 3336 for_scope->set_end_position(scanner()->location().end_pos); | 3372 for_scope->set_end_position(scanner()->location().end_pos); |
| 3337 } else { | 3373 } else { |
| 3374 Statement* next_stmt = NULL; | |
| 3375 if (next) { | |
| 3376 next_stmt = factory()->NewExpressionStatement(next, next->position()); | |
| 3377 } | |
| 3338 scope_ = saved_scope; | 3378 scope_ = saved_scope; |
| 3339 for_scope->set_end_position(scanner()->location().end_pos); | 3379 for_scope->set_end_position(scanner()->location().end_pos); |
| 3340 for_scope = for_scope->FinalizeBlockScope(); | 3380 for_scope = for_scope->FinalizeBlockScope(); |
| 3341 if (for_scope) { | 3381 if (for_scope) { |
| 3342 // Rewrite a for statement of the form | 3382 // Rewrite a for statement of the form |
| 3343 // for (const x = i; c; n) b | 3383 // for (const x = i; c; n) b |
| 3344 // | 3384 // |
| 3345 // into | 3385 // into |
| 3346 // | 3386 // |
| 3347 // { | 3387 // { |
| 3348 // const x = i; | 3388 // const x = i; |
| 3349 // for (; c; n) b | 3389 // for (; c; n) b |
| 3350 // } | 3390 // } |
| 3351 DCHECK(init != NULL); | 3391 DCHECK(init != NULL); |
| 3352 Block* block = | 3392 Block* block = |
| 3353 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); | 3393 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); |
| 3354 block->AddStatement(init, zone()); | 3394 block->AddStatement(init, zone()); |
| 3355 block->AddStatement(loop, zone()); | 3395 block->AddStatement(loop, zone()); |
| 3356 block->set_scope(for_scope); | 3396 block->set_scope(for_scope); |
| 3357 loop->Initialize(NULL, cond, next, body); | 3397 loop->Initialize(NULL, cond, next_stmt, body); |
| 3358 result = block; | 3398 result = block; |
| 3359 } else { | 3399 } else { |
| 3360 loop->Initialize(init, cond, next, body); | 3400 loop->Initialize(init, cond, next_stmt, body); |
| 3361 result = loop; | 3401 result = loop; |
| 3362 } | 3402 } |
| 3363 } | 3403 } |
| 3364 return result; | 3404 return result; |
| 3365 } | 3405 } |
| 3366 | 3406 |
| 3367 | 3407 |
| 3368 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { | 3408 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { |
| 3369 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser | 3409 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser |
| 3370 // contexts this is used as a statement which invokes the debugger as i a | 3410 // contexts this is used as a statement which invokes the debugger as i a |
| (...skipping 1648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5019 | 5059 |
| 5020 // We cannot internalize on a background thread; a foreground task will take | 5060 // We cannot internalize on a background thread; a foreground task will take |
| 5021 // care of calling Parser::Internalize just before compilation. | 5061 // care of calling Parser::Internalize just before compilation. |
| 5022 | 5062 |
| 5023 if (compile_options() == ScriptCompiler::kProduceParserCache) { | 5063 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 5024 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); | 5064 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); |
| 5025 log_ = NULL; | 5065 log_ = NULL; |
| 5026 } | 5066 } |
| 5027 } | 5067 } |
| 5028 } } // namespace v8::internal | 5068 } } // namespace v8::internal |
| OLD | NEW |