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
2 changes: 2 additions & 0 deletions Jint.Tests/Runtime/BigIntTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ public class BigIntTests
[InlineData("a = a - b;", "100")]
[InlineData("a = a * b;", "2829")]
[InlineData("a = a / b;", "5")]
[InlineData("a = a % b;", "8")]
[InlineData("a += b;", "146")]
[InlineData("a -= b;", "100")]
[InlineData("a *= b;", "2829")]
[InlineData("a /= b;", "5")]
[InlineData("a %= b;", "8")]
public void BasicOperations(string statement, string expected)
{
var outputValues = new List<JsValue>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,15 +170,7 @@ protected override object EvaluateInternal(EvaluationContext context)
case Operator.RemainderAssignment:
{
var rval = _right.GetValue(context);
if (originalLeftValue.IsUndefined() || rval.IsUndefined())
{
newLeftValue = JsValue.Undefined;
}
else
{
newLeftValue = TypeConverter.ToNumber(originalLeftValue) % TypeConverter.ToNumber(rval);
}

newLeftValue = Remainder(context, originalLeftValue, rval);
break;
}

Expand Down
76 changes: 1 addition & 75 deletions Jint/Runtime/Interpreter/Expressions/JintBinaryExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using System.Runtime.CompilerServices;
using Jint.Extensions;
using Jint.Native;
using Jint.Native.Number;
using Jint.Native.Object;
using Jint.Runtime.Interop;

Expand Down Expand Up @@ -686,80 +685,7 @@ protected override object EvaluateInternal(EvaluationContext context)
return JsValue.FromObject(context.Engine, opResult);
}

var result = JsValue.Undefined;
left = TypeConverter.ToNumeric(left);
right = TypeConverter.ToNumeric(right);

if (AreIntegerOperands(left, right))
{
var leftInteger = left.AsInteger();
var rightInteger = right.AsInteger();

if (rightInteger == 0)
{
result = JsNumber.DoubleNaN;
}
else
{
var modulo = leftInteger % rightInteger;
if (modulo == 0 && leftInteger < 0)
{
result = JsNumber.NegativeZero;
}
else
{
result = JsNumber.Create(modulo);
}
}
}
else if (AreNonBigIntOperands(left, right))
{
var n = left.AsNumber();
var d = right.AsNumber();

if (double.IsNaN(n) || double.IsNaN(d) || double.IsInfinity(n))
{
result = JsNumber.DoubleNaN;
}
else if (double.IsInfinity(d))
{
result = n;
}
else if (NumberInstance.IsPositiveZero(d) || NumberInstance.IsNegativeZero(d))
{
result = JsNumber.DoubleNaN;
}
else if (NumberInstance.IsPositiveZero(n) || NumberInstance.IsNegativeZero(n))
{
result = n;
}
else
{
result = JsNumber.Create(n % d);
}
}
else
{
AssertValidBigIntArithmeticOperands(left, right);

var n = TypeConverter.ToBigInt(left);
var d = TypeConverter.ToBigInt(right);

if (d == 0)
{
Throw.RangeError(context.Engine.Realm, "Division by zero");
}
else if (n == 0)
{
result = JsBigInt.Zero;
}
else
{
result = JsBigInt.Create(n % d);
}
}

return result;
return Remainder(context, left, right);
}
}

Expand Down
77 changes: 77 additions & 0 deletions Jint/Runtime/Interpreter/Expressions/JintExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,83 @@ protected internal static JintExpression Build(Expression expression)
return result;
}

protected static JsValue Remainder(EvaluationContext context, JsValue left, JsValue right)
{
var result = JsValue.Undefined;
left = TypeConverter.ToNumeric(left);
right = TypeConverter.ToNumeric(right);
if (AreIntegerOperands(left, right))
{
var leftInteger = left.AsInteger();
var rightInteger = right.AsInteger();

if (rightInteger == 0)
{
result = JsNumber.DoubleNaN;
}
else
{
var modulo = leftInteger % rightInteger;
if (modulo == 0 && leftInteger < 0)
{
result = JsNumber.NegativeZero;
}
else
{
result = JsNumber.Create(modulo);
}
}
}
else if (JintBinaryExpression.AreNonBigIntOperands(left, right))
{
var n = left.AsNumber();
var d = right.AsNumber();

if (double.IsNaN(n) || double.IsNaN(d) || double.IsInfinity(n))
{
result = JsNumber.DoubleNaN;
}
else if (double.IsInfinity(d))
{
result = n;
}
else if (NumberInstance.IsPositiveZero(d) || NumberInstance.IsNegativeZero(d))
{
result = JsNumber.DoubleNaN;
}
else if (NumberInstance.IsPositiveZero(n) || NumberInstance.IsNegativeZero(n))
{
result = n;
}
else
{
result = JsNumber.Create(n % d);
}
}
else
{
JintBinaryExpression.AssertValidBigIntArithmeticOperands(left, right);

var n = TypeConverter.ToBigInt(left);
var d = TypeConverter.ToBigInt(right);

if (d == 0)
{
Throw.RangeError(context.Engine.Realm, "Division by zero");
}
else if (n == 0)
{
result = JsBigInt.Zero;
}
else
{
result = JsBigInt.Create(n % d);
}
}

return result;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected static JsValue Divide(EvaluationContext context, JsValue left, JsValue right)
{
Expand Down
Loading