| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index 6fe2d2413fc94890f58ab2e0830ccb4cf4b135b8..0c32f36b0cb3c1a6b9673b69c65cd1c5b057f000 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -175,9 +175,9 @@ BUILTIN(EmptyFunction) {
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
| +namespace {
|
|
|
| -// TODO(cbruni): check if this is a suitable method on Object
|
| -bool ClampedToInteger(Object* object, int* out) {
|
| +bool ObjectToClampedInteger(Object* object, int* out) {
|
| // This is an extended version of ECMA-262 9.4, but additionally
|
| // clamps values to [kMinInt, kMaxInt]
|
| if (object->IsSmi()) {
|
| @@ -331,6 +331,7 @@ MUST_USE_RESULT static Object* CallJsBuiltin(
|
| return *result;
|
| }
|
|
|
| +} // namespace
|
|
|
| BUILTIN(ArrayPush) {
|
| HandleScope scope(isolate);
|
| @@ -432,7 +433,6 @@ BUILTIN(ArrayShift) {
|
| }
|
| }
|
|
|
| - // Set the length.
|
| array->set_length(Smi::FromInt(len - 1));
|
|
|
| return *first;
|
| @@ -450,51 +450,15 @@ BUILTIN(ArrayUnshift) {
|
| }
|
| Handle<JSArray> array = Handle<JSArray>::cast(receiver);
|
| DCHECK(!array->map()->is_observed());
|
| - if (!array->HasFastSmiOrObjectElements()) {
|
| - return CallJsBuiltin(isolate, "$arrayUnshift", args);
|
| - }
|
| int len = Smi::cast(array->length())->value();
|
| int to_add = args.length() - 1;
|
| - int new_length = len + to_add;
|
| - // Currently fixed arrays cannot grow too big, so
|
| - // we should never hit this case.
|
| - DCHECK(to_add <= (Smi::kMaxValue - len));
|
|
|
| if (to_add > 0 && JSArray::WouldChangeReadOnlyLength(array, len + to_add)) {
|
| return CallJsBuiltin(isolate, "$arrayUnshift", args);
|
| }
|
|
|
| - Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj);
|
| -
|
| - if (new_length > elms->length()) {
|
| - // New backing storage is needed.
|
| - int capacity = new_length + (new_length >> 1) + 16;
|
| - Handle<FixedArray> new_elms =
|
| - isolate->factory()->NewUninitializedFixedArray(capacity);
|
| -
|
| - ElementsKind kind = array->GetElementsKind();
|
| - ElementsAccessor* accessor = array->GetElementsAccessor();
|
| - accessor->CopyElements(
|
| - elms, 0, kind, new_elms, to_add,
|
| - ElementsAccessor::kCopyToEndAndInitializeToHole);
|
| -
|
| - elms = new_elms;
|
| - array->set_elements(*elms);
|
| - } else {
|
| - DisallowHeapAllocation no_gc;
|
| - Heap* heap = isolate->heap();
|
| - heap->MoveElements(*elms, to_add, 0, len);
|
| - }
|
| -
|
| - // Add the provided values.
|
| - DisallowHeapAllocation no_gc;
|
| - WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
|
| - for (int i = 0; i < to_add; i++) {
|
| - elms->set(i, args[i + 1], mode);
|
| - }
|
| -
|
| - // Set the length.
|
| - array->set_length(Smi::FromInt(new_length));
|
| + ElementsAccessor* accessor = array->GetElementsAccessor();
|
| + int new_length = accessor->Unshift(array, elms_obj, args, to_add);
|
| return Smi::FromInt(new_length);
|
| }
|
|
|
| @@ -656,7 +620,7 @@ BUILTIN(ArraySplice) {
|
| int relative_start = 0;
|
| if (argument_count > 0) {
|
| DisallowHeapAllocation no_gc;
|
| - if (!ClampedToInteger(args[1], &relative_start)) {
|
| + if (!ObjectToClampedInteger(args[1], &relative_start)) {
|
| AllowHeapAllocation allow_allocation;
|
| return CallJsBuiltin(isolate, "$arraySplice", args);
|
| }
|
| @@ -678,7 +642,7 @@ BUILTIN(ArraySplice) {
|
| int delete_count = 0;
|
| DisallowHeapAllocation no_gc;
|
| if (argument_count > 1) {
|
| - if (!ClampedToInteger(args[2], &delete_count)) {
|
| + if (!ObjectToClampedInteger(args[2], &delete_count)) {
|
| AllowHeapAllocation allow_allocation;
|
| return CallJsBuiltin(isolate, "$arraySplice", args);
|
| }
|
|
|