Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (272470 => 272471)
--- trunk/Source/_javascript_Core/ChangeLog 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/ChangeLog 2021-02-07 11:13:28 UTC (rev 272471)
@@ -1,3 +1,62 @@
+2021-02-07 Yusuke Suzuki <[email protected]>
+
+ [JSC] Replace toInteger with toIntegerOrInfinity
+ https://bugs.webkit.org/show_bug.cgi?id=218642
+
+ Reviewed by Alexey Shvayka.
+
+ In ECMA262 spec, ToInteger abstract operation is replaced with ToIntegerOrInfinity.
+ This patch renames toInteger to toIntegerOrInfinity in JSC.
+
+ * builtins/ArrayPrototype.js:
+ (fill):
+ (includes):
+ (copyWithin):
+ (flat):
+ (at):
+ * builtins/FunctionPrototype.js:
+ (bind):
+ * builtins/GlobalOperations.js:
+ (globalPrivate.toIntegerOrInfinity):
+ (globalPrivate.toLength):
+ (globalPrivate.toInteger): Deleted.
+ * builtins/RegExpPrototype.js:
+ (overriddenName.string_appeared_here.replace):
+ * builtins/StringPrototype.js:
+ (repeat):
+ (at):
+ * builtins/TypedArrayPrototype.js:
+ (subarray):
+ (at):
+ * inspector/JSInjectedScriptHost.cpp:
+ (Inspector::JSInjectedScriptHost::weakMapEntries):
+ (Inspector::JSInjectedScriptHost::weakSetEntries):
+ (Inspector::JSInjectedScriptHost::iteratorEntries):
+ * runtime/ArrayPrototype.cpp:
+ (JSC::argumentClampedIndexFromStartOrEnd):
+ (JSC::JSC_DEFINE_HOST_FUNCTION):
+ * runtime/IntlSegments.cpp:
+ (JSC::IntlSegments::containing):
+ * runtime/JSCJSValue.cpp:
+ (JSC::JSValue::toIntegerOrInfinity const):
+ (JSC::JSValue::toLength const):
+ (JSC::JSValue::toInteger const): Deleted.
+ * runtime/JSCJSValue.h:
+ * runtime/JSCJSValueInlines.h:
+ * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
+ (JSC::argumentClampedIndexFromStartOrEnd):
+ (JSC::genericTypedArrayViewProtoFuncSet):
+ (JSC::genericTypedArrayViewProtoFuncLastIndexOf):
+ * runtime/NumberPrototype.cpp:
+ (JSC::JSC_DEFINE_HOST_FUNCTION):
+ (JSC::extractToStringRadixArgument):
+ * runtime/RegExpObjectInlines.h:
+ (JSC::getRegExpObjectLastIndexAsUnsigned):
+ * runtime/StringPrototype.cpp:
+ (JSC::JSC_DEFINE_HOST_FUNCTION):
+ (JSC::stringIndexOfImpl):
+ (JSC::stringIncludesImpl):
+
2021-02-06 Alexey Shvayka <[email protected]>
REGRESSION (r264574): Unchecked JS exception in validateAndApplyPropertyDescriptor()
Modified: trunk/Source/_javascript_Core/builtins/ArrayPrototype.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/ArrayPrototype.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/ArrayPrototype.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -205,7 +205,7 @@
var array = @toObject(this, "Array.prototype.fill requires that |this| not be null or undefined");
var length = @toLength(array.length);
- var relativeStart = @toInteger(@argument(1));
+ var relativeStart = @toIntegerOrInfinity(@argument(1));
var k = 0;
if (relativeStart < 0) {
k = length + relativeStart;
@@ -219,7 +219,7 @@
var relativeEnd = length;
var end = @argument(2);
if (end !== @undefined)
- relativeEnd = @toInteger(end);
+ relativeEnd = @toIntegerOrInfinity(end);
var final = 0;
if (relativeEnd < 0) {
final = length + relativeEnd;
@@ -285,7 +285,7 @@
var fromIndex = 0;
var from = @argument(1);
if (from !== @undefined)
- fromIndex = @toInteger(from);
+ fromIndex = @toIntegerOrInfinity(from);
var index;
if (fromIndex >= 0)
@@ -576,10 +576,10 @@
var array = @toObject(this, "Array.prototype.copyWithin requires that |this| not be null or undefined");
var length = @toLength(array.length);
- var relativeTarget = @toInteger(target);
+ var relativeTarget = @toIntegerOrInfinity(target);
var to = (relativeTarget < 0) ? maxWithPositives(length + relativeTarget, 0) : minWithMaybeNegativeZeroAndPositive(relativeTarget, length);
- var relativeStart = @toInteger(start);
+ var relativeStart = @toIntegerOrInfinity(start);
var from = (relativeStart < 0) ? maxWithPositives(length + relativeStart, 0) : minWithMaybeNegativeZeroAndPositive(relativeStart, length);
var relativeEnd;
@@ -587,7 +587,7 @@
if (end === @undefined)
relativeEnd = length;
else
- relativeEnd = @toInteger(end);
+ relativeEnd = @toIntegerOrInfinity(end);
var finalValue = (relativeEnd < 0) ? maxWithPositives(length + relativeEnd, 0) : minWithMaybeNegativeZeroAndPositive(relativeEnd, length);
@@ -641,7 +641,7 @@
var depthNum = 1;
var depth = @argument(0);
if (depth !== @undefined)
- depthNum = @toInteger(depth);
+ depthNum = @toIntegerOrInfinity(depth);
var result = @arraySpeciesCreate(array, 0);
@@ -694,7 +694,7 @@
var array = @toObject(this, "Array.prototype.at requires that |this| not be null or undefined");
var length = @toLength(array.length);
- var k = @toInteger(index);
+ var k = @toIntegerOrInfinity(index);
if (k < 0)
k += length;
Modified: trunk/Source/_javascript_Core/builtins/FunctionPrototype.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/FunctionPrototype.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/FunctionPrototype.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -77,7 +77,7 @@
if (@hasOwnLengthProperty(target)) {
var lengthValue = target.length;
if (typeof lengthValue === "number") {
- lengthValue = @toInteger(lengthValue);
+ lengthValue = @toIntegerOrInfinity(lengthValue);
// Note that we only care about positive lengthValues, however, this comparision
// against numBoundArgs suffices to prove we're not a negative number.
if (lengthValue > numBoundArgs)
Modified: trunk/Source/_javascript_Core/builtins/GlobalOperations.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/GlobalOperations.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/GlobalOperations.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -27,14 +27,14 @@
// @internal
@globalPrivate
-function toInteger(target)
+function toIntegerOrInfinity(target)
{
"use strict";
var numberValue = +target;
- // isNaN(numberValue)
- if (numberValue !== numberValue)
+ // isNaN(numberValue) or 0
+ if (numberValue !== numberValue || !numberValue)
return 0;
return @trunc(numberValue);
}
@@ -44,7 +44,7 @@
{
"use strict";
- var length = @toInteger(target);
+ var length = @toIntegerOrInfinity(target);
// originally Math.min(Math.max(length, 0), maxSafeInteger));
return +(length > 0 ? (length < @MAX_SAFE_INTEGER ? length : @MAX_SAFE_INTEGER) : 0);
}
Modified: trunk/Source/_javascript_Core/builtins/RegExpPrototype.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/RegExpPrototype.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/RegExpPrototype.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -331,7 +331,7 @@
nCaptures = 0;
var matched = @toString(result[0]);
var matchLength = matched.length;
- var position = @toInteger(result.index);
+ var position = @toIntegerOrInfinity(result.index);
position = (position > stringLength) ? stringLength : position;
position = (position < 0) ? 0 : position;
Modified: trunk/Source/_javascript_Core/builtins/StringPrototype.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/StringPrototype.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/StringPrototype.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -126,7 +126,7 @@
@throwTypeError("String.prototype.repeat requires that |this| not be null or undefined");
var string = @toString(this);
- count = @toInteger(count);
+ count = @toIntegerOrInfinity(count);
if (count < 0 || count === @Infinity)
@throwRangeError("String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity");
@@ -352,7 +352,7 @@
var string = @toString(this);
var length = string.length;
- var k = @toInteger(index);
+ var k = @toIntegerOrInfinity(index);
if (k < 0)
k += length;
Modified: trunk/Source/_javascript_Core/builtins/TypedArrayPrototype.js (272470 => 272471)
--- trunk/Source/_javascript_Core/builtins/TypedArrayPrototype.js 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/builtins/TypedArrayPrototype.js 2021-02-07 11:13:28 UTC (rev 272471)
@@ -222,10 +222,10 @@
if (!@isTypedArrayView(this))
@throwTypeError("|this| should be a typed array view");
- var start = @toInteger(begin);
+ var start = @toIntegerOrInfinity(begin);
var finish;
if (end !== @undefined)
- finish = @toInteger(end);
+ finish = @toIntegerOrInfinity(end);
var constructor = @typedArraySpeciesConstructor(this);
@@ -364,7 +364,7 @@
var length = @typedArrayLength(this);
- var k = @toInteger(index);
+ var k = @toIntegerOrInfinity(index);
if (k < 0)
k += length;
Modified: trunk/Source/_javascript_Core/inspector/JSInjectedScriptHost.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/inspector/JSInjectedScriptHost.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/inspector/JSInjectedScriptHost.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -470,7 +470,7 @@
return jsUndefined();
MarkedArgumentBuffer buffer;
- auto fetchCount = callFrame->argument(1).toInteger(globalObject);
+ auto fetchCount = callFrame->argument(1).toIntegerOrInfinity(globalObject);
weakMap->takeSnapshot(buffer, fetchCount >= 0 ? static_cast<unsigned>(fetchCount) : 0);
ASSERT(!buffer.hasOverflowed());
@@ -514,7 +514,7 @@
return jsUndefined();
MarkedArgumentBuffer buffer;
- auto fetchCount = callFrame->argument(1).toInteger(globalObject);
+ auto fetchCount = callFrame->argument(1).toIntegerOrInfinity(globalObject);
weakSet->takeSnapshot(buffer, fetchCount >= 0 ? static_cast<unsigned>(fetchCount) : 0);
ASSERT(!buffer.hasOverflowed());
@@ -592,7 +592,7 @@
unsigned numberToFetch = 5;
JSValue numberToFetchArg = callFrame->argument(1);
- double fetchDouble = numberToFetchArg.toInteger(globalObject);
+ double fetchDouble = numberToFetchArg.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, { });
if (fetchDouble >= 0)
numberToFetch = static_cast<unsigned>(fetchDouble);
Modified: trunk/Source/_javascript_Core/runtime/ArrayPrototype.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/ArrayPrototype.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/ArrayPrototype.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -287,7 +287,7 @@
if (value.isUndefined())
return undefinedValue;
- double indexDouble = value.toInteger(globalObject);
+ double indexDouble = value.toIntegerOrInfinity(globalObject);
if (indexDouble < 0) {
indexDouble += length;
return indexDouble < 0 ? 0 : static_cast<uint64_t>(indexDouble);
@@ -1167,7 +1167,7 @@
uint64_t actualDeleteCount = length - actualStart;
if (callFrame->argumentCount() > 1) {
- double deleteCount = callFrame->uncheckedArgument(1).toInteger(globalObject);
+ double deleteCount = callFrame->uncheckedArgument(1).toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (deleteCount < 0)
actualDeleteCount = 0;
@@ -1427,7 +1427,7 @@
uint64_t index = length - 1;
if (callFrame->argumentCount() >= 2) {
JSValue fromValue = callFrame->uncheckedArgument(1);
- double fromDouble = fromValue.toInteger(globalObject);
+ double fromDouble = fromValue.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, { });
if (fromDouble < 0) {
fromDouble += length;
Modified: trunk/Source/_javascript_Core/runtime/IntlSegments.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/IntlSegments.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/IntlSegments.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -71,7 +71,7 @@
VM& vm = globalObject->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
- double value = indexValue.toInteger(globalObject);
+ double value = indexValue.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, { });
if (value < 0 || value >= m_buffer->size())
Modified: trunk/Source/_javascript_Core/runtime/JSCJSValue.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/JSCJSValue.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/JSCJSValue.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -35,15 +35,6 @@
namespace JSC {
-// ECMA 9.4
-double JSValue::toInteger(JSGlobalObject* globalObject) const
-{
- if (isInt32())
- return asInt32();
- double d = toNumber(globalObject);
- return std::isnan(d) ? 0.0 : trunc(d);
-}
-
double JSValue::toIntegerPreserveNaN(JSGlobalObject* globalObject) const
{
if (isInt32())
@@ -55,7 +46,7 @@
{
// ECMA 7.1.15
// http://www.ecma-international.org/ecma-262/6.0/#sec-tolength
- double d = toInteger(globalObject);
+ double d = toIntegerOrInfinity(globalObject);
if (d <= 0)
return 0.0;
if (std::isinf(d))
Modified: trunk/Source/_javascript_Core/runtime/JSCJSValue.h (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/JSCJSValue.h 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/JSCJSValue.h 2021-02-07 11:13:28 UTC (rev 272471)
@@ -290,7 +290,6 @@
JSObject* toObject(JSGlobalObject*) const;
// Integer conversions.
- JS_EXPORT_PRIVATE double toInteger(JSGlobalObject*) const;
JS_EXPORT_PRIVATE double toIntegerPreserveNaN(JSGlobalObject*) const;
double toIntegerOrInfinity(JSGlobalObject*) const;
int32_t toInt32(JSGlobalObject*) const;
Modified: trunk/Source/_javascript_Core/runtime/JSCJSValueInlines.h (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/JSCJSValueInlines.h 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/JSCJSValueInlines.h 2021-02-07 11:13:28 UTC (rev 272471)
@@ -80,8 +80,6 @@
}
// https://tc39.es/ecma262/#sec-tointegerorinfinity
-// FIXME: We will replace toInteger with toIntegerOrInfinity. The difference is that toIntegerOrInfinity will convert -0 to +0.
-// https://bugs.webkit.org/show_bug.cgi?id=218642
inline double JSValue::toIntegerOrInfinity(JSGlobalObject* globalObject) const
{
if (isInt32())
Modified: trunk/Source/_javascript_Core/runtime/JSGenericTypedArrayViewPrototypeFunctions.h (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/JSGenericTypedArrayViewPrototypeFunctions.h 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/JSGenericTypedArrayViewPrototypeFunctions.h 2021-02-07 11:13:28 UTC (rev 272471)
@@ -91,7 +91,7 @@
if (value.isUndefined())
return undefinedValue;
- double indexDouble = value.toInteger(globalObject);
+ double indexDouble = value.toIntegerOrInfinity(globalObject);
if (indexDouble < 0) {
indexDouble += length;
return indexDouble < 0 ? 0 : static_cast<unsigned>(indexDouble);
@@ -112,7 +112,7 @@
unsigned offset;
if (callFrame->argumentCount() >= 2) {
- double offsetNumber = callFrame->uncheckedArgument(1).toInteger(globalObject);
+ double offsetNumber = callFrame->uncheckedArgument(1).toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (UNLIKELY(offsetNumber < 0))
return throwVMRangeError(globalObject, scope, "Offset should not be negative");
@@ -355,7 +355,7 @@
int index = length - 1;
if (callFrame->argumentCount() >= 2) {
JSValue fromValue = callFrame->uncheckedArgument(1);
- double fromDouble = fromValue.toInteger(globalObject);
+ double fromDouble = fromValue.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (fromDouble < 0) {
fromDouble += length;
Modified: trunk/Source/_javascript_Core/runtime/NumberPrototype.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/NumberPrototype.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/NumberPrototype.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -393,7 +393,7 @@
JSValue arg = callFrame->argument(0);
// Perform ToInteger on the argument before remaining steps.
- int decimalPlaces = static_cast<int>(arg.toInteger(globalObject));
+ int decimalPlaces = static_cast<int>(arg.toIntegerOrInfinity(globalObject));
RETURN_IF_EXCEPTION(scope, { });
// Handle NaN and Infinity.
@@ -428,7 +428,7 @@
if (!toThisNumber(vm, callFrame->thisValue(), x))
return throwVMToThisNumberError(globalObject, scope, callFrame->thisValue());
- int decimalPlaces = static_cast<int>(callFrame->argument(0).toInteger(globalObject));
+ int decimalPlaces = static_cast<int>(callFrame->argument(0).toIntegerOrInfinity(globalObject));
RETURN_IF_EXCEPTION(scope, { });
if (decimalPlaces < 0 || decimalPlaces > 100)
return throwVMRangeError(globalObject, scope, "toFixed() argument must be between 0 and 100"_s);
@@ -468,7 +468,7 @@
return JSValue::encode(jsString(vm, String::number(x)));
// Perform ToInteger on the argument before remaining steps.
- int significantFigures = static_cast<int>(arg.toInteger(globalObject));
+ int significantFigures = static_cast<int>(arg.toIntegerOrInfinity(globalObject));
RETURN_IF_EXCEPTION(scope, { });
// Handle NaN and Infinity.
@@ -601,7 +601,7 @@
if (radix >= 2 && radix <= 36)
return radix;
} else {
- double radixDouble = radixValue.toInteger(globalObject);
+ double radixDouble = radixValue.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(throwScope, 0);
if (radixDouble >= 2 && radixDouble <= 36)
return static_cast<int32_t>(radixDouble);
Modified: trunk/Source/_javascript_Core/runtime/RegExpObjectInlines.h (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/RegExpObjectInlines.h 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/RegExpObjectInlines.h 2021-02-07 11:13:28 UTC (rev 272471)
@@ -45,7 +45,7 @@
if (lastIndex > input.length())
return UINT_MAX;
} else {
- double doubleLastIndex = jsLastIndex.toInteger(globalObject);
+ double doubleLastIndex = jsLastIndex.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, UINT_MAX);
if (doubleLastIndex > input.length())
return UINT_MAX;
Modified: trunk/Source/_javascript_Core/runtime/StringPrototype.cpp (272470 => 272471)
--- trunk/Source/_javascript_Core/runtime/StringPrototype.cpp 2021-02-07 06:08:07 UTC (rev 272470)
+++ trunk/Source/_javascript_Core/runtime/StringPrototype.cpp 2021-02-07 11:13:28 UTC (rev 272471)
@@ -994,7 +994,7 @@
return JSValue::encode(jsSingleCharacterString(vm, view[i]));
return JSValue::encode(jsEmptyString(vm));
}
- double dpos = a0.toInteger(globalObject);
+ double dpos = a0.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, { });
if (dpos >= 0 && dpos < view.length())
return JSValue::encode(jsSingleCharacterString(vm, view[static_cast<unsigned>(dpos)]));
@@ -1021,7 +1021,7 @@
return JSValue::encode(jsNumber(view[i]));
return JSValue::encode(jsNaN());
}
- double dpos = a0.toInteger(globalObject);
+ double dpos = a0.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, { });
if (dpos >= 0 && dpos < view.length())
return JSValue::encode(jsNumber(view[static_cast<int>(dpos)]));
@@ -1061,7 +1061,7 @@
RETURN_IF_EXCEPTION(scope, encodedJSValue());
- double doublePosition = argument0.toInteger(globalObject);
+ double doublePosition = argument0.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (doublePosition >= 0 && doublePosition < length)
return JSValue::encode(jsNumber(codePointAt(string, static_cast<unsigned>(doublePosition), length)));
@@ -1092,7 +1092,7 @@
if (a1.isUInt32())
pos = std::min<uint32_t>(a1.asUInt32(), len);
else {
- double dpos = a1.toInteger(globalObject);
+ double dpos = a1.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (dpos < 0)
dpos = 0;
@@ -1191,9 +1191,9 @@
RELEASE_ASSERT(length >= 0);
// The arg processing is very much like ArrayProtoFunc::Slice
- double start = a0.toInteger(globalObject);
+ double start = a0.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
- double end = a1.isUndefined() ? length : a1.toInteger(globalObject);
+ double end = a1.isUndefined() ? length : a1.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
RELEASE_AND_RETURN(scope, JSValue::encode(stringSlice(globalObject, vm, string, length, start, end)));
}
@@ -1393,9 +1393,9 @@
JSValue a0 = callFrame->argument(0);
JSValue a1 = callFrame->argument(1);
- double start = a0.toInteger(globalObject);
+ double start = a0.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
- double length = a1.isUndefined() ? len : a1.toInteger(globalObject);
+ double length = a1.isUndefined() ? len : a1.toIntegerOrInfinity(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
if (start >= len || length <= 0)
return JSValue::encode(jsEmptyString(vm));
@@ -1731,7 +1731,7 @@
start = std::max(0, positionArg.asInt32());
else {
unsigned length = stringToSearchIn.length();
- start = clampAndTruncateToUnsigned(positionArg.toInteger(globalObject), 0, length);
+ start = clampAndTruncateToUnsigned(positionArg.toIntegerOrInfinity(globalObject), 0, length);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
}
@@ -1766,7 +1766,7 @@
if (endPositionArg.isInt32())
end = std::max(0, endPositionArg.asInt32());
else if (!endPositionArg.isUndefined()) {
- end = clampAndTruncateToUnsigned(endPositionArg.toInteger(globalObject), 0, length);
+ end = clampAndTruncateToUnsigned(endPositionArg.toIntegerOrInfinity(globalObject), 0, length);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
}
@@ -1781,7 +1781,7 @@
start = std::max(0, positionArg.asInt32());
else {
unsigned length = stringToSearchIn.length();
- start = clampAndTruncateToUnsigned(positionArg.toInteger(globalObject), 0, length);
+ start = clampAndTruncateToUnsigned(positionArg.toIntegerOrInfinity(globalObject), 0, length);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
}