OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 5336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5347 HConstant* instr = New<HConstant>(expr->value()); | 5347 HConstant* instr = New<HConstant>(expr->value()); |
5348 return ast_context()->ReturnInstruction(instr, expr->id()); | 5348 return ast_context()->ReturnInstruction(instr, expr->id()); |
5349 } | 5349 } |
5350 | 5350 |
5351 | 5351 |
5352 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { | 5352 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
5353 DCHECK(!HasStackOverflow()); | 5353 DCHECK(!HasStackOverflow()); |
5354 DCHECK(current_block() != NULL); | 5354 DCHECK(current_block() != NULL); |
5355 DCHECK(current_block()->HasPredecessor()); | 5355 DCHECK(current_block()->HasPredecessor()); |
5356 Callable callable = CodeFactory::FastCloneRegExp(isolate()); | 5356 Callable callable = CodeFactory::FastCloneRegExp(isolate()); |
5357 HValue* values[] = {AddThisFunction(), Add<HConstant>(expr->literal_index()), | 5357 int index = TypeFeedbackVector::GetIndex(expr->literal_slot()); |
| 5358 HValue* values[] = {AddThisFunction(), Add<HConstant>(index), |
5358 Add<HConstant>(expr->pattern()), | 5359 Add<HConstant>(expr->pattern()), |
5359 Add<HConstant>(expr->flags())}; | 5360 Add<HConstant>(expr->flags())}; |
5360 HConstant* stub_value = Add<HConstant>(callable.code()); | 5361 HConstant* stub_value = Add<HConstant>(callable.code()); |
5361 HInstruction* instr = New<HCallWithDescriptor>( | 5362 HInstruction* instr = New<HCallWithDescriptor>( |
5362 stub_value, 0, callable.descriptor(), ArrayVector(values)); | 5363 stub_value, 0, callable.descriptor(), ArrayVector(values)); |
5363 return ast_context()->ReturnInstruction(instr, expr->id()); | 5364 return ast_context()->ReturnInstruction(instr, expr->id()); |
5364 } | 5365 } |
5365 | 5366 |
5366 | 5367 |
5367 static bool CanInlinePropertyAccess(Handle<Map> map) { | 5368 static bool CanInlinePropertyAccess(Handle<Map> map) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5448 DCHECK(!HasStackOverflow()); | 5449 DCHECK(!HasStackOverflow()); |
5449 DCHECK(current_block() != NULL); | 5450 DCHECK(current_block() != NULL); |
5450 DCHECK(current_block()->HasPredecessor()); | 5451 DCHECK(current_block()->HasPredecessor()); |
5451 | 5452 |
5452 Handle<JSFunction> closure = function_state()->compilation_info()->closure(); | 5453 Handle<JSFunction> closure = function_state()->compilation_info()->closure(); |
5453 HInstruction* literal; | 5454 HInstruction* literal; |
5454 | 5455 |
5455 // Check whether to use fast or slow deep-copying for boilerplate. | 5456 // Check whether to use fast or slow deep-copying for boilerplate. |
5456 int max_properties = kMaxFastLiteralProperties; | 5457 int max_properties = kMaxFastLiteralProperties; |
5457 Handle<Object> literals_cell( | 5458 Handle<Object> literals_cell( |
5458 closure->literals()->literal(expr->literal_index()), isolate()); | 5459 closure->feedback_vector()->Get(expr->literal_slot()), isolate()); |
5459 Handle<AllocationSite> site; | 5460 Handle<AllocationSite> site; |
5460 Handle<JSObject> boilerplate; | 5461 Handle<JSObject> boilerplate; |
5461 if (!literals_cell->IsUndefined(isolate())) { | 5462 if (!literals_cell->IsUndefined(isolate())) { |
5462 // Retrieve the boilerplate | 5463 // Retrieve the boilerplate |
5463 site = Handle<AllocationSite>::cast(literals_cell); | 5464 site = Handle<AllocationSite>::cast(literals_cell); |
5464 boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info()), | 5465 boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info()), |
5465 isolate()); | 5466 isolate()); |
5466 } | 5467 } |
5467 | 5468 |
5468 if (!boilerplate.is_null() && | 5469 if (!boilerplate.is_null() && |
5469 IsFastLiteral(boilerplate, kMaxFastLiteralDepth, &max_properties)) { | 5470 IsFastLiteral(boilerplate, kMaxFastLiteralDepth, &max_properties)) { |
5470 AllocationSiteUsageContext site_context(isolate(), site, false); | 5471 AllocationSiteUsageContext site_context(isolate(), site, false); |
5471 site_context.EnterNewScope(); | 5472 site_context.EnterNewScope(); |
5472 literal = BuildFastLiteral(boilerplate, &site_context); | 5473 literal = BuildFastLiteral(boilerplate, &site_context); |
5473 site_context.ExitScope(site, boilerplate); | 5474 site_context.ExitScope(site, boilerplate); |
5474 } else { | 5475 } else { |
5475 NoObservableSideEffectsScope no_effects(this); | 5476 NoObservableSideEffectsScope no_effects(this); |
5476 Handle<BoilerplateDescription> constant_properties = | 5477 Handle<BoilerplateDescription> constant_properties = |
5477 expr->GetOrBuildConstantProperties(isolate()); | 5478 expr->GetOrBuildConstantProperties(isolate()); |
5478 int literal_index = expr->literal_index(); | 5479 int literal_index = TypeFeedbackVector::GetIndex(expr->literal_slot()); |
5479 int flags = expr->ComputeFlags(true); | 5480 int flags = expr->ComputeFlags(true); |
5480 | 5481 |
5481 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index), | 5482 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index), |
5482 Add<HConstant>(constant_properties), | 5483 Add<HConstant>(constant_properties), |
5483 Add<HConstant>(flags)); | 5484 Add<HConstant>(flags)); |
5484 | 5485 |
5485 Runtime::FunctionId function_id = Runtime::kCreateObjectLiteral; | 5486 Runtime::FunctionId function_id = Runtime::kCreateObjectLiteral; |
5486 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); | 5487 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); |
5487 } | 5488 } |
5488 | 5489 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5567 | 5568 |
5568 void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { | 5569 void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
5569 DCHECK(!HasStackOverflow()); | 5570 DCHECK(!HasStackOverflow()); |
5570 DCHECK(current_block() != NULL); | 5571 DCHECK(current_block() != NULL); |
5571 DCHECK(current_block()->HasPredecessor()); | 5572 DCHECK(current_block()->HasPredecessor()); |
5572 ZoneList<Expression*>* subexprs = expr->values(); | 5573 ZoneList<Expression*>* subexprs = expr->values(); |
5573 int length = subexprs->length(); | 5574 int length = subexprs->length(); |
5574 HInstruction* literal; | 5575 HInstruction* literal; |
5575 | 5576 |
5576 Handle<AllocationSite> site; | 5577 Handle<AllocationSite> site; |
5577 Handle<LiteralsArray> literals(environment()->closure()->literals(), | 5578 Handle<TypeFeedbackVector> vector(environment()->closure()->feedback_vector(), |
5578 isolate()); | 5579 isolate()); |
5579 Handle<Object> literals_cell(literals->literal(expr->literal_index()), | 5580 Handle<Object> literals_cell(vector->Get(expr->literal_slot()), isolate()); |
5580 isolate()); | |
5581 Handle<JSObject> boilerplate_object; | 5581 Handle<JSObject> boilerplate_object; |
5582 if (!literals_cell->IsUndefined(isolate())) { | 5582 if (!literals_cell->IsUndefined(isolate())) { |
5583 DCHECK(literals_cell->IsAllocationSite()); | 5583 DCHECK(literals_cell->IsAllocationSite()); |
5584 site = Handle<AllocationSite>::cast(literals_cell); | 5584 site = Handle<AllocationSite>::cast(literals_cell); |
5585 boilerplate_object = Handle<JSObject>( | 5585 boilerplate_object = Handle<JSObject>( |
5586 JSObject::cast(site->transition_info()), isolate()); | 5586 JSObject::cast(site->transition_info()), isolate()); |
5587 } | 5587 } |
5588 | 5588 |
5589 // Check whether to use fast or slow deep-copying for boilerplate. | 5589 // Check whether to use fast or slow deep-copying for boilerplate. |
5590 int max_properties = kMaxFastLiteralProperties; | 5590 int max_properties = kMaxFastLiteralProperties; |
5591 if (!boilerplate_object.is_null() && | 5591 if (!boilerplate_object.is_null() && |
5592 IsFastLiteral(boilerplate_object, kMaxFastLiteralDepth, | 5592 IsFastLiteral(boilerplate_object, kMaxFastLiteralDepth, |
5593 &max_properties)) { | 5593 &max_properties)) { |
5594 DCHECK(site->SitePointsToLiteral()); | 5594 DCHECK(site->SitePointsToLiteral()); |
5595 AllocationSiteUsageContext site_context(isolate(), site, false); | 5595 AllocationSiteUsageContext site_context(isolate(), site, false); |
5596 site_context.EnterNewScope(); | 5596 site_context.EnterNewScope(); |
5597 literal = BuildFastLiteral(boilerplate_object, &site_context); | 5597 literal = BuildFastLiteral(boilerplate_object, &site_context); |
5598 site_context.ExitScope(site, boilerplate_object); | 5598 site_context.ExitScope(site, boilerplate_object); |
5599 } else { | 5599 } else { |
5600 NoObservableSideEffectsScope no_effects(this); | 5600 NoObservableSideEffectsScope no_effects(this); |
5601 Handle<ConstantElementsPair> constants = | 5601 Handle<ConstantElementsPair> constants = |
5602 expr->GetOrBuildConstantElements(isolate()); | 5602 expr->GetOrBuildConstantElements(isolate()); |
5603 int literal_index = expr->literal_index(); | 5603 int literal_index = TypeFeedbackVector::GetIndex(expr->literal_slot()); |
5604 int flags = expr->ComputeFlags(true); | 5604 int flags = expr->ComputeFlags(true); |
5605 | 5605 |
5606 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index), | 5606 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index), |
5607 Add<HConstant>(constants), Add<HConstant>(flags)); | 5607 Add<HConstant>(constants), Add<HConstant>(flags)); |
5608 | 5608 |
5609 Runtime::FunctionId function_id = Runtime::kCreateArrayLiteral; | 5609 Runtime::FunctionId function_id = Runtime::kCreateArrayLiteral; |
5610 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); | 5610 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); |
5611 | 5611 |
5612 // Register to deopt if the boilerplate ElementsKind changes. | 5612 // Register to deopt if the boilerplate ElementsKind changes. |
5613 if (!site.is_null()) { | 5613 if (!site.is_null()) { |
(...skipping 7408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13022 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13022 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13023 } | 13023 } |
13024 | 13024 |
13025 #ifdef DEBUG | 13025 #ifdef DEBUG |
13026 graph_->Verify(false); // No full verify. | 13026 graph_->Verify(false); // No full verify. |
13027 #endif | 13027 #endif |
13028 } | 13028 } |
13029 | 13029 |
13030 } // namespace internal | 13030 } // namespace internal |
13031 } // namespace v8 | 13031 } // namespace v8 |
OLD | NEW |