summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/js-create-lowering.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/js-create-lowering.cc')
-rw-r--r--deps/v8/src/compiler/js-create-lowering.cc66
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;