Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions Jint/Native/Date/DatePrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,7 @@ private JsValue ToJson(JsValue thisObject, JsCallArguments arguments)
{
var o = TypeConverter.ToObject(_realm, thisObject);
var tv = TypeConverter.ToPrimitive(o, Types.Number);
if (tv.IsNumber() && !IsFinite(((JsNumber) tv)._value))
if (tv.IsNumber() && !double.IsFinite(((JsNumber) tv)._value))
{
return Null;
}
Expand Down Expand Up @@ -1420,19 +1420,16 @@ internal static DatePresentation MakeDate(double day, double time)
return new DatePresentation((long) (day * MsPerDay + time), DateFlags.None);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static bool IsFinite(double value) => !double.IsNaN(value) && !double.IsInfinity(value);

private static bool AreFinite(double value1, double value2) => IsFinite(value1) && IsFinite(value2);
private static bool AreFinite(double value1, double value2) => double.IsFinite(value1) && double.IsFinite(value2);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static bool IsFinite(DatePresentation value) => value.IsFinite;

private static bool AreFinite(double value1, double value2, double value3)
=> IsFinite(value1) && IsFinite(value2) && IsFinite(value3);
=> double.IsFinite(value1) && double.IsFinite(value2) && double.IsFinite(value3);

private static bool AreFinite(double value1, double value2, double value3, double value4)
=> IsFinite(value1) && IsFinite(value2) && IsFinite(value3) && IsFinite(value4);
=> double.IsFinite(value1) && double.IsFinite(value2) && double.IsFinite(value3) && double.IsFinite(value4);

[StructLayout(LayoutKind.Auto)]
private readonly record struct Date(int Year, int Month, int Day);
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Global/GlobalObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ private static JsValue IsNaN(JsValue thisObject, JsValue value)
private static JsValue IsFinite(JsValue thisObject, JsValue value)
{
var n = TypeConverter.ToNumber(value);
return !double.IsNaN(n) && !double.IsInfinity(n);
return double.IsFinite(n);
}

private const string UriReservedString = ";/?:@&=+$,";
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Intl/DurationFormatPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ private double GetDurationComponent(ObjectInstance obj, string property)
}

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"Invalid value for {property}");
}
Expand Down
8 changes: 4 additions & 4 deletions Jint/Native/Intl/JsNumberFormat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ private string FormatWithNotation(double value)

private string FormatScientific(double value)
{
if (double.IsNaN(value) || double.IsInfinity(value) || value == 0)
if (!double.IsFinite(value) || value == 0)
{
return FormatDecimal(value);
}
Expand All @@ -232,7 +232,7 @@ private string FormatScientific(double value)

private string FormatEngineering(double value)
{
if (double.IsNaN(value) || double.IsInfinity(value) || value == 0)
if (!double.IsFinite(value) || value == 0)
{
return FormatDecimal(value);
}
Expand Down Expand Up @@ -702,7 +702,7 @@ private void AddDecimalParts(List<NumberFormatPart> parts, double value)
/// </summary>
private double ApplyRounding(double value, int decimalPlaces)
{
if (double.IsNaN(value) || double.IsInfinity(value))
if (!double.IsFinite(value))
{
return value;
}
Expand Down Expand Up @@ -1214,7 +1214,7 @@ private string FormatDecimal(double value)

private string FormatWithSignificantDigits(double value)
{
if (double.IsNaN(value) || double.IsInfinity(value))
if (!double.IsFinite(value))
{
return value.ToString(NumberFormatInfo);
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Intl/JsPluralRules.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ internal string Select(double n)
private string SelectCardinal(double n)
{
// Handle special values
if (double.IsNaN(n) || double.IsInfinity(n))
if (!double.IsFinite(n))
{
return "other";
}
Expand Down Expand Up @@ -194,7 +194,7 @@ private string SelectCardinal(double n)
/// </summary>
private string SelectOrdinal(double n)
{
if (double.IsNaN(n) || double.IsInfinity(n))
if (!double.IsFinite(n))
{
return "other";
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Intl/NumberFormatConstructor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ private int GetRoundingIncrementOption(ObjectInstance options)
}

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, "roundingIncrement must be a finite number");
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Intl/RelativeTimeFormatPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ private JsValue Format(JsValue thisObject, JsValue value, JsValue unit)
var relativeTimeFormat = ValidateRelativeTimeFormat(thisObject);

var numericValue = TypeConverter.ToNumber(value);
if (double.IsNaN(numericValue) || double.IsInfinity(numericValue))
if (!double.IsFinite(numericValue))
{
Throw.RangeError(_realm, "Invalid value");
}
Expand All @@ -77,7 +77,7 @@ private JsArray FormatToParts(JsValue thisObject, JsValue value, JsValue unit)
var relativeTimeFormat = ValidateRelativeTimeFormat(thisObject);

var numericValue = TypeConverter.ToNumber(value);
if (double.IsNaN(numericValue) || double.IsInfinity(numericValue))
if (!double.IsFinite(numericValue))
{
Throw.RangeError(_realm, "Invalid value");
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Json/JsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ private SerializeResult SerializeJSONValue(JsValue value, ref ValueStringBuilder
return SerializeResult.NotUndefined;
}

var isFinite = !double.IsNaN(doubleValue) && !double.IsInfinity(doubleValue);
var isFinite = double.IsFinite(doubleValue);
if (isFinite)
{
if (TypeConverter.CanBeStringifiedAsLong(doubleValue))
Expand Down
6 changes: 3 additions & 3 deletions Jint/Native/Temporal/Duration/DurationPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private double GetOptionalDurationProperty(ObjectInstance obj, string name, doub
anyDefined = true;

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"Duration {name} must be a finite number");
}
Expand Down Expand Up @@ -278,7 +278,7 @@ private JsDuration Round(JsValue thisObject, JsValue options)
if (!roundingIncrementValue.IsUndefined())
{
roundingIncrement = TypeConverter.ToNumber(roundingIncrementValue);
if (double.IsNaN(roundingIncrement) || double.IsInfinity(roundingIncrement))
if (!double.IsFinite(roundingIncrement))
{
Throw.RangeError(_realm, "roundingIncrement must be a finite number");
}
Expand Down Expand Up @@ -1381,7 +1381,7 @@ private JsString ToStringMethod(JsValue thisObject, JsValue options)
if (fsdValue.IsNumber())
{
var fsdNum = fsdValue.AsNumber();
if (double.IsNaN(fsdNum) || double.IsInfinity(fsdNum))
if (!double.IsFinite(fsdNum))
{
Throw.RangeError(_realm, "fractionalSecondDigits must be 'auto' or a number 0-9");
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Temporal/Instant/InstantConstructor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private JsInstant FromEpochMilliseconds(JsValue thisObject, JsValue epochMillise
var ms = TypeConverter.ToNumber(epochMilliseconds);

// NumberToBigInt: must be an integral number
if (double.IsNaN(ms) || double.IsInfinity(ms))
if (!double.IsFinite(ms))
{
Throw.RangeError(_realm, "Invalid epoch milliseconds");
}
Expand Down
6 changes: 3 additions & 3 deletions Jint/Native/Temporal/Instant/InstantPrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ private JsDuration DifferenceTemporalInstant(JsValue thisObject, JsCallArguments
if (!incValue.IsUndefined())
{
var inc = TypeConverter.ToNumber(incValue);
if (double.IsNaN(inc) || double.IsInfinity(inc))
if (!double.IsFinite(inc))
{
Throw.RangeError(_realm, "roundingIncrement must be finite");
}
Expand Down Expand Up @@ -323,7 +323,7 @@ private JsInstant Round(JsValue thisObject, JsValue roundTo)
if (!roundingIncrementValue.IsUndefined())
{
var inc = TypeConverter.ToNumber(roundingIncrementValue);
if (double.IsNaN(inc) || double.IsInfinity(inc))
if (!double.IsFinite(inc))
{
Throw.RangeError(_realm, "roundingIncrement must be finite");
}
Expand Down Expand Up @@ -561,7 +561,7 @@ private JsString ToStringMethod(JsValue thisObject, JsValue options)
else
{
var num = ((JsNumber) digitsValue)._value;
if (double.IsNaN(num) || double.IsInfinity(num))
if (!double.IsFinite(num))
{
Throw.RangeError(_realm, "fractionalSecondDigits must be finite");
}
Expand Down
6 changes: 3 additions & 3 deletions Jint/Native/Temporal/PlainDateTime/PlainDateTimePrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ private JsString ToString(JsValue thisObject, JsValue options)
if (fsdValue.IsNumber())
{
var fsdNum = fsdValue.AsNumber();
if (double.IsNaN(fsdNum) || double.IsInfinity(fsdNum))
if (!double.IsFinite(fsdNum))
{
Throw.RangeError(_realm, "fractionalSecondDigits must be a finite number");
}
Expand Down Expand Up @@ -1141,7 +1141,7 @@ private static string FormatDateTime(IsoDateTime dateTime, string calendar, stri
private int ConvertToInteger(JsValue value, string fieldName)
{
var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"DateTime {fieldName} must be a finite number");
}
Expand Down Expand Up @@ -1239,7 +1239,7 @@ private double GetDurationProperty(ObjectInstance obj, string name, ref bool has
hasAny = true;

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"Duration {name} must be a finite number");
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Temporal/PlainTime/PlainTimeConstructor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ private int GetTimeProperty(ObjectInstance obj, string name, int defaultValue, r
hasAny = true;

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"Time {name} must be a finite number");
}
Expand Down
2 changes: 1 addition & 1 deletion Jint/Native/Temporal/PlainTime/PlainTimePrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ private JsString ToString(JsValue thisObject, JsValue options)
if (fsdValue.IsNumber())
{
var fsdNum = fsdValue.AsNumber();
if (double.IsNaN(fsdNum) || double.IsInfinity(fsdNum))
if (!double.IsFinite(fsdNum))
{
Throw.RangeError(_realm, "fractionalSecondDigits must be a finite number");
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Temporal/TemporalHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1134,7 +1134,7 @@ public static bool IsValidDuration(DurationRecord duration)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static bool CheckDurationComponent(double component, ref int sign)
{
if (double.IsNaN(component) || double.IsInfinity(component))
if (!double.IsFinite(component))
return false;

if (component > 0)
Expand Down Expand Up @@ -4944,7 +4944,7 @@ public static int GetRoundingIncrementOption(Realm realm, JsValue normalizedOpti
var number = TypeConverter.ToNumber(increment);

// 6. If integerIncrement is NaN, +∞, or -∞, throw a RangeError exception.
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(realm, "Rounding increment must be finite");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ private BigInteger ToBigInt(JsValue value)
}

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, "epochNanoseconds must be a finite number");
}
Expand Down
4 changes: 2 additions & 2 deletions Jint/Native/Temporal/ZonedDateTime/ZonedDateTimePrototype.cs
Original file line number Diff line number Diff line change
Expand Up @@ -965,7 +965,7 @@ private JsString ToStringMethod(JsValue thisObject, JsValue options)
else
{
var num = ((JsNumber) precisionProp)._value;
if (double.IsNaN(num) || double.IsInfinity(num))
if (!double.IsFinite(num))
{
Throw.RangeError(_realm, "fractionalSecondDigits must be finite");
}
Expand Down Expand Up @@ -1398,7 +1398,7 @@ private double GetDoubleProperty(ObjectInstance obj, string name, double default
hasAny = true;

var number = TypeConverter.ToNumber(value);
if (double.IsNaN(number) || double.IsInfinity(number))
if (!double.IsFinite(number))
{
Throw.RangeError(_realm, $"Duration {name} must be a finite number");
}
Expand Down
4 changes: 3 additions & 1 deletion Jint/Runtime/Interpreter/Expressions/JintExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,9 @@ protected static JsValue Remainder(EvaluationContext context, JsValue left, JsVa
var n = left.AsNumber();
var d = right.AsNumber();

if (double.IsNaN(n) || double.IsNaN(d) || double.IsInfinity(n))
// A non-finite dividend, or a NaN divisor, gives NaN. An infinite *divisor* does not,
// and is handled by the branch below, so only n gets the full finiteness test.
if (!double.IsFinite(n) || double.IsNaN(d))
{
result = JsNumber.DoubleNaN;
}
Expand Down
6 changes: 3 additions & 3 deletions Jint/Runtime/TypeConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1022,12 +1022,12 @@ public static ObjectInstance ToObject(Realm realm, JsValue value)
internal static bool IsIntegralNumber(double value)
{
// Math.Floor(value) == value instead of value % 1 == 0: the remainder operator on doubles
// compiles to a native fmod call, Math.Floor is a JIT intrinsic (a single vroundsd). The NaN
// and infinity guards above still short-circuit, and for every finite value the two tests are
// compiles to a native fmod call, Math.Floor is a JIT intrinsic (a single vroundsd). The
// finiteness guard still short-circuits, and for every finite value the two tests are
// equivalent - value % 1 is value - trunc(value), which is +-0 exactly when value has no
// fractional part, which is exactly when Math.Floor(value) == value (-0.0 and magnitudes
// >= 2^52, which are necessarily integral, are accepted by both).
return !double.IsNaN(value) && !double.IsInfinity(value) && Math.Floor(value) == value;
return double.IsFinite(value) && Math.Floor(value) == value;
}

private static ObjectInstance ToObjectNonObject(Realm realm, JsValue value)
Expand Down