Changeset 207241 in webkit
- Timestamp:
- Oct 12, 2016 2:01:00 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r207239 r207241 1 2016-10-12 Mark Lam <mark.lam@apple.com> 2 3 Rename variables in arrayProtoFuncSplice() to match names in the spec. 4 https://bugs.webkit.org/show_bug.cgi?id=163354 5 6 Reviewed by Saam Barati. 7 8 This will make it easier to see whether the code matches the spec or not. 9 Ref: https://tc39.github.io/ecma262/#sec-array.prototype.splice 10 11 * runtime/ArrayPrototype.cpp: 12 (JSC::arrayProtoFuncSplice): 13 1 14 2016-10-12 Yusuke Suzuki <utatane.tea@gmail.com> 2 15 -
trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp
r207226 r207241 922 922 } 923 923 924 unsigned begin= argumentClampedIndexFromStartOrEnd(exec, 0, length);925 926 unsigned deleteCount = length - begin;924 unsigned actualStart = argumentClampedIndexFromStartOrEnd(exec, 0, length); 925 926 unsigned actualDeleteCount = length - actualStart; 927 927 if (exec->argumentCount() > 1) { 928 double delete Double= exec->uncheckedArgument(1).toInteger(exec);929 if (delete Double< 0)930 deleteCount = 0;931 else if (delete Double > length - begin)932 deleteCount = length - begin;928 double deleteCount = exec->uncheckedArgument(1).toInteger(exec); 929 if (deleteCount < 0) 930 actualDeleteCount = 0; 931 else if (deleteCount > length - actualStart) 932 actualDeleteCount = length - actualStart; 933 933 else 934 deleteCount = static_cast<unsigned>(deleteDouble);935 } 936 937 std::pair<SpeciesConstructResult, JSObject*> speciesResult = speciesConstructArray(exec, thisObj, deleteCount);934 actualDeleteCount = static_cast<unsigned>(deleteCount); 935 } 936 937 std::pair<SpeciesConstructResult, JSObject*> speciesResult = speciesConstructArray(exec, thisObj, actualDeleteCount); 938 938 if (speciesResult.first == SpeciesConstructResult::Exception) 939 939 return JSValue::encode(jsUndefined()); … … 941 941 JSObject* result = nullptr; 942 942 if (speciesResult.first == SpeciesConstructResult::FastPath && isJSArray(thisObj) && length == getLength(exec, thisObj)) 943 result = asArray(thisObj)->fastSlice(*exec, begin, deleteCount);943 result = asArray(thisObj)->fastSlice(*exec, actualStart, actualDeleteCount); 944 944 945 945 if (!result) { … … 947 947 result = speciesResult.second; 948 948 949 for (unsigned k = 0; k < deleteCount; ++k) {950 JSValue v = getProperty(exec, thisObj, k + begin);949 for (unsigned k = 0; k < actualDeleteCount; ++k) { 950 JSValue v = getProperty(exec, thisObj, k + actualStart); 951 951 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 952 952 if (UNLIKELY(!v)) … … 956 956 } 957 957 } else { 958 result = JSArray::tryCreateUninitialized(vm, exec->lexicalGlobalObject()->arrayStructureForIndexingTypeDuringAllocation(ArrayWithUndecided), deleteCount);958 result = JSArray::tryCreateUninitialized(vm, exec->lexicalGlobalObject()->arrayStructureForIndexingTypeDuringAllocation(ArrayWithUndecided), actualDeleteCount); 959 959 if (!result) 960 960 return JSValue::encode(throwOutOfMemoryError(exec, scope)); 961 961 962 for (unsigned k = 0; k < deleteCount; ++k) {963 JSValue v = getProperty(exec, thisObj, k + begin);962 for (unsigned k = 0; k < actualDeleteCount; ++k) { 963 JSValue v = getProperty(exec, thisObj, k + actualStart); 964 964 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 965 965 if (UNLIKELY(!v)) … … 970 970 } 971 971 972 unsigned additionalArgs= std::max<int>(exec->argumentCount() - 2, 0);973 if ( additionalArgs < deleteCount) {974 shift<JSArray::ShiftCountForSplice>(exec, thisObj, begin, deleteCount, additionalArgs, length);975 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 976 } else if ( additionalArgs > deleteCount) {977 unshift<JSArray::ShiftCountForSplice>(exec, thisObj, begin, deleteCount, additionalArgs, length);978 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 979 } 980 for (unsigned k = 0; k < additionalArgs; ++k) {981 thisObj->putByIndexInline(exec, k + begin, exec->uncheckedArgument(k + 2), true);972 unsigned itemCount = std::max<int>(exec->argumentCount() - 2, 0); 973 if (itemCount < actualDeleteCount) { 974 shift<JSArray::ShiftCountForSplice>(exec, thisObj, actualStart, actualDeleteCount, itemCount, length); 975 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 976 } else if (itemCount > actualDeleteCount) { 977 unshift<JSArray::ShiftCountForSplice>(exec, thisObj, actualStart, actualDeleteCount, itemCount, length); 978 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 979 } 980 for (unsigned k = 0; k < itemCount; ++k) { 981 thisObj->putByIndexInline(exec, k + actualStart, exec->uncheckedArgument(k + 2), true); 982 982 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 983 983 } 984 984 985 985 scope.release(); 986 setLength(exec, vm, thisObj, length - deleteCount + additionalArgs);986 setLength(exec, vm, thisObj, length - actualDeleteCount + itemCount); 987 987 return JSValue::encode(result); 988 988 }
Note: See TracChangeset
for help on using the changeset viewer.