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

Unified Diff: src/elements.cc

Issue 1770793002: Move EnsureFastWritableElements into the elements accessor. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/elements.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/elements.cc
diff --git a/src/elements.cc b/src/elements.cc
index 7109342902bd6d6bbbd64dc1cb98ba1988023769..54988dc081b744a95a96a14488025983ffc8be6b 100644
--- a/src/elements.cc
+++ b/src/elements.cc
@@ -503,12 +503,6 @@ class ElementsAccessorBase : public ElementsAccessor {
ElementsAccessorSubclass::ValidateImpl(holder);
}
- bool IsPacked(Handle<JSObject> holder, Handle<FixedArrayBase> backing_store,
- uint32_t start, uint32_t end) final {
- return ElementsAccessorSubclass::IsPackedImpl(holder, backing_store, start,
- end);
- }
-
static bool IsPackedImpl(Handle<JSObject> holder,
Handle<FixedArrayBase> backing_store, uint32_t start,
uint32_t end) {
@@ -598,81 +592,67 @@ class ElementsAccessorBase : public ElementsAccessor {
UNREACHABLE();
}
- uint32_t Push(Handle<JSArray> receiver, Handle<FixedArrayBase> backing_store,
- Arguments* args, uint32_t push_size) final {
- return ElementsAccessorSubclass::PushImpl(receiver, backing_store, args,
- push_size);
+ uint32_t Push(Handle<JSArray> receiver, Arguments* args,
+ uint32_t push_size) final {
+ return ElementsAccessorSubclass::PushImpl(receiver, args, push_size);
}
- static uint32_t PushImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> elms_obj, Arguments* args,
+ static uint32_t PushImpl(Handle<JSArray> receiver, Arguments* args,
uint32_t push_sized) {
UNREACHABLE();
return 0;
}
- uint32_t Unshift(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store, Arguments* args,
+ uint32_t Unshift(Handle<JSArray> receiver, Arguments* args,
uint32_t unshift_size) final {
- return ElementsAccessorSubclass::UnshiftImpl(receiver, backing_store, args,
- unshift_size);
+ return ElementsAccessorSubclass::UnshiftImpl(receiver, args, unshift_size);
}
- static uint32_t UnshiftImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> elms_obj, Arguments* args,
+ static uint32_t UnshiftImpl(Handle<JSArray> receiver, Arguments* args,
uint32_t unshift_size) {
UNREACHABLE();
return 0;
}
- Handle<JSArray> Slice(Handle<JSObject> receiver,
- Handle<FixedArrayBase> backing_store, uint32_t start,
+ Handle<JSArray> Slice(Handle<JSObject> receiver, uint32_t start,
uint32_t end) final {
- return ElementsAccessorSubclass::SliceImpl(receiver, backing_store, start,
- end);
+ return ElementsAccessorSubclass::SliceImpl(receiver, start, end);
}
static Handle<JSArray> SliceImpl(Handle<JSObject> receiver,
- Handle<FixedArrayBase> backing_store,
uint32_t start, uint32_t end) {
UNREACHABLE();
return Handle<JSArray>();
}
- Handle<JSArray> Splice(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store, uint32_t start,
+ Handle<JSArray> Splice(Handle<JSArray> receiver, uint32_t start,
uint32_t delete_count, Arguments* args,
uint32_t add_count) final {
- return ElementsAccessorSubclass::SpliceImpl(receiver, backing_store, start,
- delete_count, args, add_count);
+ return ElementsAccessorSubclass::SpliceImpl(receiver, start, delete_count,
+ args, add_count);
}
static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store,
uint32_t start, uint32_t delete_count,
Arguments* args, uint32_t add_count) {
UNREACHABLE();
return Handle<JSArray>();
}
- Handle<Object> Pop(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) final {
- return ElementsAccessorSubclass::PopImpl(receiver, backing_store);
+ Handle<Object> Pop(Handle<JSArray> receiver) final {
+ return ElementsAccessorSubclass::PopImpl(receiver);
}
- static Handle<Object> PopImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) {
+ static Handle<Object> PopImpl(Handle<JSArray> receiver) {
UNREACHABLE();
return Handle<Object>();
}
- Handle<Object> Shift(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) final {
- return ElementsAccessorSubclass::ShiftImpl(receiver, backing_store);
+ Handle<Object> Shift(Handle<JSArray> receiver) final {
+ return ElementsAccessorSubclass::ShiftImpl(receiver);
}
- static Handle<Object> ShiftImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) {
+ static Handle<Object> ShiftImpl(Handle<JSArray> receiver) {
UNREACHABLE();
return Handle<Object>();
}
@@ -704,7 +684,7 @@ class ElementsAccessorBase : public ElementsAccessor {
if (length == 0) {
array->initialize_elements();
} else if (length <= capacity) {
- if (array->HasFastSmiOrObjectElements()) {
+ if (IsFastSmiOrObjectElementsKind(kind())) {
JSObject::EnsureWritableFastElements(array);
if (array->elements() != *backing_store) {
backing_store = handle(array->elements(), isolate);
@@ -1358,28 +1338,24 @@ class FastElementsAccessor
#endif
}
- static Handle<Object> PopImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) {
- return FastElementsAccessorSubclass::RemoveElement(receiver, backing_store,
- AT_END);
+ static Handle<Object> PopImpl(Handle<JSArray> receiver) {
+ return FastElementsAccessorSubclass::RemoveElement(receiver, AT_END);
}
- static Handle<Object> ShiftImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store) {
- return FastElementsAccessorSubclass::RemoveElement(receiver, backing_store,
- AT_START);
+ static Handle<Object> ShiftImpl(Handle<JSArray> receiver) {
+ return FastElementsAccessorSubclass::RemoveElement(receiver, AT_START);
}
static uint32_t PushImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store,
Arguments* args, uint32_t push_size) {
+ Handle<FixedArrayBase> backing_store(receiver->elements());
return FastElementsAccessorSubclass::AddArguments(receiver, backing_store,
args, push_size, AT_END);
}
static uint32_t UnshiftImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store,
Arguments* args, uint32_t unshift_size) {
+ Handle<FixedArrayBase> backing_store(receiver->elements());
return FastElementsAccessorSubclass::AddArguments(
receiver, backing_store, args, unshift_size, AT_START);
}
@@ -1392,11 +1368,10 @@ class FastElementsAccessor
}
static Handle<JSArray> SliceImpl(Handle<JSObject> receiver,
- Handle<FixedArrayBase> backing_store,
uint32_t start, uint32_t end) {
- DCHECK(start < end);
Isolate* isolate = receiver->GetIsolate();
- int result_len = end - start;
+ Handle<FixedArrayBase> backing_store(receiver->elements(), isolate);
+ int result_len = end < start ? 0u : end - start;
Handle<JSArray> result_array = isolate->factory()->NewJSArray(
KindTraits::Kind, result_len, result_len);
DisallowHeapAllocation no_gc;
@@ -1409,7 +1384,6 @@ class FastElementsAccessor
}
static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store,
uint32_t start, uint32_t delete_count,
Arguments* args, uint32_t add_count) {
Isolate* isolate = receiver->GetIsolate();
@@ -1417,6 +1391,15 @@ class FastElementsAccessor
uint32_t length = Smi::cast(receiver->length())->value();
uint32_t new_length = length - delete_count + add_count;
+ ElementsKind kind = KindTraits::Kind;
+ if (new_length <= static_cast<uint32_t>(receiver->elements()->length()) &&
+ IsFastSmiOrObjectElementsKind(kind)) {
+ HandleScope scope(isolate);
+ JSObject::EnsureWritableFastElements(receiver);
+ }
+
+ Handle<FixedArrayBase> backing_store(receiver->elements(), isolate);
+
if (new_length == 0) {
receiver->set_elements(heap->empty_fixed_array());
receiver->set_length(Smi::FromInt(0));
@@ -1501,9 +1484,14 @@ class FastElementsAccessor
}
static Handle<Object> RemoveElement(Handle<JSArray> receiver,
- Handle<FixedArrayBase> backing_store,
Where remove_position) {
Isolate* isolate = receiver->GetIsolate();
+ ElementsKind kind = KindTraits::Kind;
+ if (IsFastSmiOrObjectElementsKind(kind)) {
+ HandleScope scope(isolate);
+ JSObject::EnsureWritableFastElements(receiver);
+ }
+ Handle<FixedArrayBase> backing_store(receiver->elements(), isolate);
uint32_t length =
static_cast<uint32_t>(Smi::cast(receiver->length())->value());
DCHECK(length > 0);
@@ -1518,8 +1506,8 @@ class FastElementsAccessor
FastElementsAccessorSubclass::SetLengthImpl(isolate, receiver, new_length,
backing_store);
- if (IsHoleyElementsKind(KindTraits::Kind) && result->IsTheHole()) {
- return receiver->GetIsolate()->factory()->undefined_value();
+ if (IsHoleyElementsKind(kind) && result->IsTheHole()) {
+ return isolate->factory()->undefined_value();
}
return result;
}
@@ -1529,7 +1517,7 @@ class FastElementsAccessor
Arguments* args, uint32_t add_size,
Where remove_position) {
uint32_t length = Smi::cast(receiver->length())->value();
- DCHECK(add_size > 0);
+ DCHECK(0 < add_size);
uint32_t elms_len = backing_store->length();
// Check we do not overflow the new_length.
DCHECK(add_size <= static_cast<uint32_t>(Smi::kMaxValue - length));
@@ -1938,8 +1926,7 @@ class TypedElementsAccessor
static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver,
KeyAccumulator* accumulator,
AddKeyConversion convert) {
- Handle<FixedArrayBase> elements(receiver->elements(),
- receiver->GetIsolate());
+ Handle<FixedArrayBase> elements(receiver->elements());
uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements);
for (uint32_t i = 0; i < length; i++) {
Handle<Object> value = AccessorClass::GetImpl(*elements, i);
« no previous file with comments | « src/elements.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698