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

Side by Side Diff: src/parser.cc

Issue 668143003: Move BailoutReason and flags computation to post-pass (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased Created 6 years, 1 month 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 | « src/objects-inl.h ('k') | src/preparser.h » ('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/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 } 271 }
272 272
273 273
274 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope, 274 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope,
275 int pos, int end_pos) { 275 int pos, int end_pos) {
276 int materialized_literal_count = -1; 276 int materialized_literal_count = -1;
277 int expected_property_count = -1; 277 int expected_property_count = -1;
278 int handler_count = 0; 278 int handler_count = 0;
279 int parameter_count = 0; 279 int parameter_count = 0;
280 AstProperties ast_properties; 280 AstProperties ast_properties;
281 BailoutReason dont_optimize_reason = kNoReason;
282 const AstRawString* name = ast_value_factory()->empty_string(); 281 const AstRawString* name = ast_value_factory()->empty_string();
283 FunctionKind kind = call_super ? FunctionKind::kDefaultConstructorCallSuper 282 FunctionKind kind = call_super ? FunctionKind::kDefaultConstructorCallSuper
284 : FunctionKind::kDefaultConstructor; 283 : FunctionKind::kDefaultConstructor;
285 284
286 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE); 285 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE);
287 function_scope->SetStrictMode(STRICT); 286 function_scope->SetStrictMode(STRICT);
288 // Set start and end position to the same value 287 // Set start and end position to the same value
289 function_scope->set_start_position(pos); 288 function_scope->set_start_position(pos);
290 function_scope->set_end_position(pos); 289 function_scope->set_end_position(pos);
291 ZoneList<Statement*>* body = NULL; 290 ZoneList<Statement*>* body = NULL;
(...skipping 13 matching lines...) Expand all
305 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args, 304 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args,
306 pos); 305 pos);
307 body->Add(factory()->NewExpressionStatement(call, pos), zone()); 306 body->Add(factory()->NewExpressionStatement(call, pos), zone());
308 } 307 }
309 308
310 materialized_literal_count = function_state.materialized_literal_count(); 309 materialized_literal_count = function_state.materialized_literal_count();
311 expected_property_count = function_state.expected_property_count(); 310 expected_property_count = function_state.expected_property_count();
312 handler_count = function_state.handler_count(); 311 handler_count = function_state.handler_count();
313 312
314 ast_properties = *factory()->visitor()->ast_properties(); 313 ast_properties = *factory()->visitor()->ast_properties();
315 dont_optimize_reason = factory()->visitor()->dont_optimize_reason();
316 } 314 }
317 315
318 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 316 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
319 name, ast_value_factory(), function_scope, body, 317 name, ast_value_factory(), function_scope, body,
320 materialized_literal_count, expected_property_count, handler_count, 318 materialized_literal_count, expected_property_count, handler_count,
321 parameter_count, FunctionLiteral::kNoDuplicateParameters, 319 parameter_count, FunctionLiteral::kNoDuplicateParameters,
322 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 320 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
323 FunctionLiteral::kNotParenthesized, kind, pos); 321 FunctionLiteral::kNotParenthesized, kind, pos);
324 322
325 function_literal->set_ast_properties(&ast_properties); 323 function_literal->set_ast_properties(&ast_properties);
326 function_literal->set_dont_optimize_reason(dont_optimize_reason);
327 324
328 return function_literal; 325 return function_literal;
329 } 326 }
330 327
331 328
332 // ---------------------------------------------------------------------------- 329 // ----------------------------------------------------------------------------
333 // Target is a support class to facilitate manipulation of the 330 // Target is a support class to facilitate manipulation of the
334 // Parser's target_stack_ (the stack of potential 'break' and 331 // Parser's target_stack_ (the stack of potential 'break' and
335 // 'continue' statement targets). Upon construction, a new target is 332 // 'continue' statement targets). Upon construction, a new target is
336 // added; it is removed upon destruction. 333 // added; it is removed upon destruction.
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 if (ok) { 962 if (ok) {
966 result = factory()->NewFunctionLiteral( 963 result = factory()->NewFunctionLiteral(
967 ast_value_factory()->empty_string(), ast_value_factory(), scope_, 964 ast_value_factory()->empty_string(), ast_value_factory(), scope_,
968 body, function_state.materialized_literal_count(), 965 body, function_state.materialized_literal_count(),
969 function_state.expected_property_count(), 966 function_state.expected_property_count(),
970 function_state.handler_count(), 0, 967 function_state.handler_count(), 0,
971 FunctionLiteral::kNoDuplicateParameters, 968 FunctionLiteral::kNoDuplicateParameters,
972 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval, 969 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kGlobalOrEval,
973 FunctionLiteral::kNotParenthesized, FunctionKind::kNormalFunction, 0); 970 FunctionLiteral::kNotParenthesized, FunctionKind::kNormalFunction, 0);
974 result->set_ast_properties(factory()->visitor()->ast_properties()); 971 result->set_ast_properties(factory()->visitor()->ast_properties());
975 result->set_dont_optimize_reason(
976 factory()->visitor()->dont_optimize_reason());
977 } 972 }
978 } 973 }
979 974
980 // Make sure the target stack is empty. 975 // Make sure the target stack is empty.
981 DCHECK(target_stack_ == NULL); 976 DCHECK(target_stack_ == NULL);
982 977
983 return result; 978 return result;
984 } 979 }
985 980
986 981
(...skipping 2566 matching lines...) Expand 10 before | Expand all | Expand 10 after
3553 ZoneList<Statement*>* body = NULL; 3548 ZoneList<Statement*>* body = NULL;
3554 int materialized_literal_count = -1; 3549 int materialized_literal_count = -1;
3555 int expected_property_count = -1; 3550 int expected_property_count = -1;
3556 int handler_count = 0; 3551 int handler_count = 0;
3557 FunctionLiteral::ParameterFlag duplicate_parameters = 3552 FunctionLiteral::ParameterFlag duplicate_parameters =
3558 FunctionLiteral::kNoDuplicateParameters; 3553 FunctionLiteral::kNoDuplicateParameters;
3559 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ 3554 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_
3560 ? FunctionLiteral::kIsParenthesized 3555 ? FunctionLiteral::kIsParenthesized
3561 : FunctionLiteral::kNotParenthesized; 3556 : FunctionLiteral::kNotParenthesized;
3562 AstProperties ast_properties; 3557 AstProperties ast_properties;
3563 BailoutReason dont_optimize_reason = kNoReason;
3564 // Parse function body. 3558 // Parse function body.
3565 { 3559 {
3566 AstNodeFactory<AstConstructionVisitor> function_factory( 3560 AstNodeFactory<AstConstructionVisitor> function_factory(
3567 ast_value_factory()); 3561 ast_value_factory());
3568 FunctionState function_state(&function_state_, &scope_, scope, 3562 FunctionState function_state(&function_state_, &scope_, scope,
3569 &function_factory); 3563 &function_factory);
3570 scope_->SetScopeName(function_name); 3564 scope_->SetScopeName(function_name);
3571 3565
3572 if (is_generator) { 3566 if (is_generator) {
3573 // For generators, allocating variables in contexts is currently a win 3567 // For generators, allocating variables in contexts is currently a win
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3722 dupe_error_loc, 3716 dupe_error_loc,
3723 reserved_loc, 3717 reserved_loc,
3724 CHECK_OK); 3718 CHECK_OK);
3725 } 3719 }
3726 if (strict_mode() == STRICT) { 3720 if (strict_mode() == STRICT) {
3727 CheckOctalLiteral(scope->start_position(), 3721 CheckOctalLiteral(scope->start_position(),
3728 scope->end_position(), 3722 scope->end_position(),
3729 CHECK_OK); 3723 CHECK_OK);
3730 } 3724 }
3731 ast_properties = *factory()->visitor()->ast_properties(); 3725 ast_properties = *factory()->visitor()->ast_properties();
3732 dont_optimize_reason = factory()->visitor()->dont_optimize_reason();
3733 3726
3734 if (allow_harmony_scoping() && strict_mode() == STRICT) { 3727 if (allow_harmony_scoping() && strict_mode() == STRICT) {
3735 CheckConflictingVarDeclarations(scope, CHECK_OK); 3728 CheckConflictingVarDeclarations(scope, CHECK_OK);
3736 } 3729 }
3737 } 3730 }
3738 3731
3739 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 3732 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
3740 function_name, ast_value_factory(), scope, body, 3733 function_name, ast_value_factory(), scope, body,
3741 materialized_literal_count, expected_property_count, handler_count, 3734 materialized_literal_count, expected_property_count, handler_count,
3742 num_parameters, duplicate_parameters, function_type, 3735 num_parameters, duplicate_parameters, function_type,
3743 FunctionLiteral::kIsFunction, parenthesized, kind, pos); 3736 FunctionLiteral::kIsFunction, parenthesized, kind, pos);
3744 function_literal->set_function_token_position(function_token_pos); 3737 function_literal->set_function_token_position(function_token_pos);
3745 function_literal->set_ast_properties(&ast_properties); 3738 function_literal->set_ast_properties(&ast_properties);
3746 function_literal->set_dont_optimize_reason(dont_optimize_reason);
3747 3739
3748 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); 3740 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal);
3749 return function_literal; 3741 return function_literal;
3750 } 3742 }
3751 3743
3752 3744
3753 void Parser::SkipLazyFunctionBody(const AstRawString* function_name, 3745 void Parser::SkipLazyFunctionBody(const AstRawString* function_name,
3754 int* materialized_literal_count, 3746 int* materialized_literal_count,
3755 int* expected_property_count, 3747 int* expected_property_count,
3756 bool* ok) { 3748 bool* ok) {
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
5019 5011
5020 // We cannot internalize on a background thread; a foreground task will take 5012 // We cannot internalize on a background thread; a foreground task will take
5021 // care of calling Parser::Internalize just before compilation. 5013 // care of calling Parser::Internalize just before compilation.
5022 5014
5023 if (compile_options() == ScriptCompiler::kProduceParserCache) { 5015 if (compile_options() == ScriptCompiler::kProduceParserCache) {
5024 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); 5016 if (result != NULL) *info_->cached_data() = recorder.GetScriptData();
5025 log_ = NULL; 5017 log_ = NULL;
5026 } 5018 }
5027 } 5019 }
5028 } } // namespace v8::internal 5020 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | src/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698