From 5020630808043615f2f6fbbfba1ea73342bebd69 Mon Sep 17 00:00:00 2001 From: Daniel Clifford Date: Wed, 28 Mar 2018 13:30:16 +0200 Subject: [PATCH] Remove legacy C++ implementation of Array#slice Change-Id: Ifdeda00ad55aa937a6a414e7e566e6640ccd83c0 Reviewed-on: https://chromium-review.googlesource.com/980936 Reviewed-by: Yang Guo Commit-Queue: Daniel Clifford Cr-Commit-Position: refs/heads/master@{#52278} --- src/bootstrapper.cc | 8 ++--- src/builtins/builtins-array.cc | 69 ------------------------------------- src/builtins/builtins-definitions.h | 1 - src/contexts.h | 1 - src/debug/debug-evaluate.cc | 1 - src/flag-definitions.h | 2 +- src/js/array.js | 43 +++-------------------- 7 files changed, 8 insertions(+), 117 deletions(-) diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index 95d98078f3..626251202d 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -1658,12 +1658,8 @@ void Genesis::InitializeGlobal(Handle global_object, SimpleInstallFunction(proto, "shift", Builtins::kArrayPrototypeShift, 0, false); SimpleInstallFunction(proto, "unshift", Builtins::kArrayUnshift, 1, false); - if (FLAG_enable_experimental_builtins) { - SimpleInstallFunction(proto, "slice", Builtins::kArrayPrototypeSlice, 2, - false); - } else { - SimpleInstallFunction(proto, "slice", Builtins::kArraySlice, 2, false); - } + SimpleInstallFunction(proto, "slice", Builtins::kArrayPrototypeSlice, 2, + false); SimpleInstallFunction(proto, "splice", Builtins::kArraySplice, 2, false); SimpleInstallFunction(proto, "includes", Builtins::kArrayIncludes, 1, false); diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc index f400e824f0..7e3f948cbe 100644 --- a/src/builtins/builtins-array.cc +++ b/src/builtins/builtins-array.cc @@ -240,75 +240,6 @@ BUILTIN(ArrayUnshift) { return Smi::FromInt(new_length); } -BUILTIN(ArraySlice) { - HandleScope scope(isolate); - Handle receiver = args.receiver(); - int len = -1; - int relative_start = 0; - int relative_end = 0; - - if (receiver->IsJSArray()) { - DisallowHeapAllocation no_gc; - JSArray* array = JSArray::cast(*receiver); - if (V8_UNLIKELY(!array->HasFastElements() || - !IsJSArrayFastElementMovingAllowed(isolate, array) || - !isolate->IsSpeciesLookupChainIntact() || - // If this is a subclass of Array, then call out to JS - !array->HasArrayPrototype(isolate))) { - AllowHeapAllocation allow_allocation; - return CallJsIntrinsic(isolate, isolate->array_slice(), args); - } - len = Smi::ToInt(array->length()); - } else if (receiver->IsJSObject() && - JSSloppyArgumentsObject::GetSloppyArgumentsLength( - isolate, Handle::cast(receiver), &len)) { - // Array.prototype.slice.call(arguments, ...) is quite a common idiom - // (notably more than 50% of invocations in Web apps). - // Treat it in C++ as well. - DCHECK(JSObject::cast(*receiver)->HasFastElements() || - JSObject::cast(*receiver)->HasFastArgumentsElements()); - } else { - AllowHeapAllocation allow_allocation; - return CallJsIntrinsic(isolate, isolate->array_slice(), args); - } - DCHECK_LE(0, len); - int argument_count = args.length() - 1; - // Note carefully chosen defaults---if argument is missing, - // it's undefined which gets converted to 0 for relative_start - // and to len for relative_end. - relative_start = 0; - relative_end = len; - if (argument_count > 0) { - DisallowHeapAllocation no_gc; - if (!ClampedToInteger(isolate, args[1], &relative_start)) { - AllowHeapAllocation allow_allocation; - return CallJsIntrinsic(isolate, isolate->array_slice(), args); - } - if (argument_count > 1) { - Object* end_arg = args[2]; - // slice handles the end_arg specially - if (end_arg->IsUndefined(isolate)) { - relative_end = len; - } else if (!ClampedToInteger(isolate, end_arg, &relative_end)) { - AllowHeapAllocation allow_allocation; - return CallJsIntrinsic(isolate, isolate->array_slice(), args); - } - } - } - - // ECMAScript 232, 3rd Edition, Section 15.4.4.10, step 6. - uint32_t actual_start = (relative_start < 0) ? Max(len + relative_start, 0) - : Min(relative_start, len); - - // ECMAScript 232, 3rd Edition, Section 15.4.4.10, step 8. - uint32_t actual_end = - (relative_end < 0) ? Max(len + relative_end, 0) : Min(relative_end, len); - - Handle object = Handle::cast(receiver); - ElementsAccessor* accessor = object->GetElementsAccessor(); - return *accessor->Slice(object, actual_start, actual_end); -} - BUILTIN(ArraySplice) { HandleScope scope(isolate); Handle receiver = args.receiver(); diff --git a/src/builtins/builtins-definitions.h b/src/builtins/builtins-definitions.h index f31cf707cb..5d2b160f78 100644 --- a/src/builtins/builtins-definitions.h +++ b/src/builtins/builtins-definitions.h @@ -269,7 +269,6 @@ namespace internal { CPP(ArrayShift) \ TFJ(ArrayPrototypeShift, SharedFunctionInfo::kDontAdaptArgumentsSentinel) \ /* ES6 #sec-array.prototype.slice */ \ - CPP(ArraySlice) \ TFJ(ArrayPrototypeSlice, SharedFunctionInfo::kDontAdaptArgumentsSentinel) \ /* ES6 #sec-array.prototype.splice */ \ CPP(ArraySplice) \ diff --git a/src/contexts.h b/src/contexts.h index 03b32ab586..bb55d91c9c 100644 --- a/src/contexts.h +++ b/src/contexts.h @@ -69,7 +69,6 @@ enum ContextLookupFlags { V(ARRAY_PUSH_INDEX, JSFunction, array_push) \ V(ARRAY_SHIFT_INDEX, JSFunction, array_shift) \ V(ARRAY_SPLICE_INDEX, JSFunction, array_splice) \ - V(ARRAY_SLICE_INDEX, JSFunction, array_slice) \ V(ARRAY_UNSHIFT_INDEX, JSFunction, array_unshift) \ V(ARRAY_ENTRIES_ITERATOR_INDEX, JSFunction, array_entries_iterator) \ V(ARRAY_FOR_EACH_ITERATOR_INDEX, JSFunction, array_for_each_iterator) \ diff --git a/src/debug/debug-evaluate.cc b/src/debug/debug-evaluate.cc index c937be4fe0..d9defc778c 100644 --- a/src/debug/debug-evaluate.cc +++ b/src/debug/debug-evaluate.cc @@ -616,7 +616,6 @@ bool BuiltinHasNoSideEffect(Builtins::Name id) { case Builtins::kArrayEvery: case Builtins::kArraySome: case Builtins::kArrayConcat: - case Builtins::kArraySlice: case Builtins::kArrayFilter: case Builtins::kArrayMap: case Builtins::kArrayReduce: diff --git a/src/flag-definitions.h b/src/flag-definitions.h index 21cd9b2d3c..a05571700f 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -832,7 +832,7 @@ DEFINE_BOOL(expose_trigger_failure, false, "expose trigger-failure extension") DEFINE_INT(stack_trace_limit, 10, "number of stack frames to capture") DEFINE_BOOL(builtins_in_stack_traces, false, "show built-in functions in stack traces") -DEFINE_BOOL(enable_experimental_builtins, true, +DEFINE_BOOL(enable_experimental_builtins, false, "enable new csa-based experimental builtins") DEFINE_BOOL(disallow_code_generation_from_strings, false, "disallow eval and friends") diff --git a/src/js/array.js b/src/js/array.js index c293f8e8c8..5b393263da 100644 --- a/src/js/array.js +++ b/src/js/array.js @@ -578,46 +578,14 @@ function ArrayUnshiftFallback(arg1) { // length == 1 } +// Oh the humanity... don't remove the following function because js2c for some +// reason gets symbol minifiation wrong if it's not there. Instead of spending +// the time fixing js2c (which will go away when all of the internal .js runtime +// files are gone), just keep this work-around. function ArraySliceFallback(start, end) { - var array = TO_OBJECT(this); - var len = TO_LENGTH(array.length); - var start_i = TO_INTEGER(start); - var end_i = len; - - if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); - - if (start_i < 0) { - start_i += len; - if (start_i < 0) start_i = 0; - } else { - if (start_i > len) start_i = len; - } - - if (end_i < 0) { - end_i += len; - if (end_i < 0) end_i = 0; - } else { - if (end_i > len) end_i = len; - } - - var result = ArraySpeciesCreate(array, MathMax(end_i - start_i, 0)); - - if (end_i < start_i) return result; - - if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { - %NormalizeElements(array); - if (IS_ARRAY(result)) %NormalizeElements(result); - SparseSlice(array, start_i, end_i - start_i, len, result); - } else { - SimpleSlice(array, start_i, end_i - start_i, len, result); - } - - result.length = end_i - start_i; - - return result; + return null; } - function ComputeSpliceStartIndex(start_i, len) { if (start_i < 0) { start_i += len; @@ -1229,7 +1197,6 @@ utils.Export(function(to) { "array_push", ArrayPushFallback, "array_shift", ArrayShiftFallback, "array_splice", ArraySpliceFallback, - "array_slice", ArraySliceFallback, "array_unshift", ArrayUnshiftFallback, ]); -- 2.11.0 (Apple Git-81)