diff options
Diffstat (limited to 'deps/v8/src/compiler/js-create-lowering.cc')
-rw-r--r-- | deps/v8/src/compiler/js-create-lowering.cc | 66 |
1 files changed, 35 insertions, 31 deletions
diff --git a/deps/v8/src/compiler/js-create-lowering.cc b/deps/v8/src/compiler/js-create-lowering.cc index cb52ccaccb..6ab54d793a 100644 --- a/deps/v8/src/compiler/js-create-lowering.cc +++ b/deps/v8/src/compiler/js-create-lowering.cc @@ -18,6 +18,7 @@ #include "src/compiler/operator-properties.h" #include "src/compiler/simplified-operator.h" #include "src/compiler/state-values-utils.h" +#include "src/execution/protectors.h" #include "src/objects/arguments.h" #include "src/objects/hash-table-inl.h" #include "src/objects/heap-number.h" @@ -26,6 +27,7 @@ #include "src/objects/js-promise.h" #include "src/objects/js-regexp-inl.h" #include "src/objects/objects-inl.h" +#include "src/objects/template-objects.h" namespace v8 { namespace internal { @@ -84,6 +86,8 @@ Reduction JSCreateLowering::Reduce(Node* node) { return ReduceJSCreateLiteralArrayOrObject(node); case IrOpcode::kJSCreateLiteralRegExp: return ReduceJSCreateLiteralRegExp(node); + case IrOpcode::kJSGetTemplateObject: + return ReduceJSGetTemplateObject(node); case IrOpcode::kJSCreateEmptyLiteralArray: return ReduceJSCreateEmptyLiteralArray(node); case IrOpcode::kJSCreateEmptyLiteralObject: @@ -640,10 +644,10 @@ Reduction JSCreateLowering::ReduceJSCreateArray(Node* node) { allocation = dependencies()->DependOnPretenureMode(*site_ref); dependencies()->DependOnElementsKind(*site_ref); } else { - CellRef array_constructor_protector( + PropertyCellRef array_constructor_protector( broker(), factory()->array_constructor_protector()); - can_inline_call = - array_constructor_protector.value().AsSmi() == Isolate::kProtectorValid; + can_inline_call = array_constructor_protector.value().AsSmi() == + Protectors::kProtectorValid; } if (arity == 0) { @@ -1073,15 +1077,10 @@ Reduction JSCreateLowering::ReduceJSCreateLiteralArrayOrObject(Node* node) { CreateLiteralParameters const& p = CreateLiteralParametersOf(node->op()); Node* effect = NodeProperties::GetEffectInput(node); Node* control = NodeProperties::GetControlInput(node); - - FeedbackVectorRef feedback_vector(broker(), p.feedback().vector); - ObjectRef feedback = feedback_vector.get(p.feedback().slot); - // TODO(turbofan): we should consider creating a ProcessedFeedback for - // allocation sites/boiler plates so that we use GetFeedback here. Then - // we can eventually get rid of the additional copy of feedback slots that - // we currently have in FeedbackVectorData. - if (feedback.IsAllocationSite()) { - AllocationSiteRef site = feedback.AsAllocationSite(); + ProcessedFeedback const& feedback = + broker()->GetFeedbackForArrayOrObjectLiteral(p.feedback()); + if (!feedback.IsInsufficient()) { + AllocationSiteRef site = feedback.AsLiteral().value(); if (site.IsFastLiteral()) { AllocationType allocation = AllocationType::kYoung; if (FLAG_allocation_site_pretenuring) { @@ -1095,20 +1094,17 @@ Reduction JSCreateLowering::ReduceJSCreateLiteralArrayOrObject(Node* node) { return Replace(value); } } + return NoChange(); } Reduction JSCreateLowering::ReduceJSCreateEmptyLiteralArray(Node* node) { DCHECK_EQ(IrOpcode::kJSCreateEmptyLiteralArray, node->opcode()); FeedbackParameter const& p = FeedbackParameterOf(node->op()); - FeedbackVectorRef fv(broker(), p.feedback().vector); - ObjectRef feedback = fv.get(p.feedback().slot); - // TODO(turbofan): we should consider creating a ProcessedFeedback for - // allocation sites/boiler plates so that we use GetFeedback here. Then - // we can eventually get rid of the additional copy of feedback slots that - // we currently have in FeedbackVectorData. - if (feedback.IsAllocationSite()) { - AllocationSiteRef site = feedback.AsAllocationSite(); + ProcessedFeedback const& feedback = + broker()->GetFeedbackForArrayOrObjectLiteral(p.feedback()); + if (!feedback.IsInsufficient()) { + AllocationSiteRef site = feedback.AsLiteral().value(); DCHECK(!site.PointsToLiteral()); MapRef initial_map = native_context().GetInitialJSArrayMap(site.GetElementsKind()); @@ -1162,22 +1158,30 @@ Reduction JSCreateLowering::ReduceJSCreateLiteralRegExp(Node* node) { CreateLiteralParameters const& p = CreateLiteralParametersOf(node->op()); Node* effect = NodeProperties::GetEffectInput(node); Node* control = NodeProperties::GetControlInput(node); - - FeedbackVectorRef feedback_vector(broker(), p.feedback().vector); - ObjectRef feedback = feedback_vector.get(p.feedback().slot); - // TODO(turbofan): we should consider creating a ProcessedFeedback for - // allocation sites/boiler plates so that we use GetFeedback here. Then - // we can eventually get rid of the additional copy of feedback slots that - // we currently have in FeedbackVectorData. - if (feedback.IsJSRegExp()) { - JSRegExpRef boilerplate = feedback.AsJSRegExp(); - Node* value = effect = AllocateLiteralRegExp(effect, control, boilerplate); + ProcessedFeedback const& feedback = + broker()->GetFeedbackForRegExpLiteral(p.feedback()); + if (!feedback.IsInsufficient()) { + JSRegExpRef literal = feedback.AsRegExpLiteral().value(); + Node* value = effect = AllocateLiteralRegExp(effect, control, literal); ReplaceWithValue(node, value, effect, control); return Replace(value); } return NoChange(); } +Reduction JSCreateLowering::ReduceJSGetTemplateObject(Node* node) { + DCHECK_EQ(IrOpcode::kJSGetTemplateObject, node->opcode()); + GetTemplateObjectParameters const& parameters = + GetTemplateObjectParametersOf(node->op()); + SharedFunctionInfoRef shared(broker(), parameters.shared()); + JSArrayRef template_object = shared.GetTemplateObject( + TemplateObjectDescriptionRef(broker(), parameters.description()), + parameters.feedback()); + Node* value = jsgraph()->Constant(template_object); + ReplaceWithValue(node, value); + return Replace(value); +} + Reduction JSCreateLowering::ReduceJSCreateFunctionContext(Node* node) { DCHECK_EQ(IrOpcode::kJSCreateFunctionContext, node->opcode()); const CreateFunctionContextParameters& parameters = @@ -1628,7 +1632,7 @@ Node* JSCreateLowering::AllocateFastLiteral(Node* effect, Node* control, ZoneVector<std::pair<FieldAccess, Node*>> inobject_fields(zone()); inobject_fields.reserve(boilerplate_map.GetInObjectProperties()); int const boilerplate_nof = boilerplate_map.NumberOfOwnDescriptors(); - for (int i = 0; i < boilerplate_nof; ++i) { + for (InternalIndex i : InternalIndex::Range(boilerplate_nof)) { PropertyDetails const property_details = boilerplate_map.GetPropertyDetails(i); if (property_details.location() != kField) continue; |