|
@@ -21,18 +21,13 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
private readonly JintExpression _left;
|
|
|
private readonly JintExpression _right;
|
|
|
|
|
|
- private JintBinaryExpression(Engine engine, BinaryExpression expression) : base(engine, expression)
|
|
|
+ private JintBinaryExpression(Engine engine, BinaryExpression expression) : base(expression)
|
|
|
{
|
|
|
- _left = Build(_engine, expression.Left);
|
|
|
- _right = Build(_engine, expression.Right);
|
|
|
+ _left = Build(engine, expression.Left);
|
|
|
+ _right = Build(engine, expression.Right);
|
|
|
}
|
|
|
|
|
|
- protected bool TryOperatorOverloading(JsValue left, JsValue right, string clrName, out object result)
|
|
|
- {
|
|
|
- return TryOperatorOverloading(_engine, left, right, clrName, out result);
|
|
|
- }
|
|
|
-
|
|
|
- internal static bool TryOperatorOverloading(Engine engine, JsValue leftValue, JsValue rightValue, string clrName, out object result)
|
|
|
+ internal static bool TryOperatorOverloading(EvaluationContext context, JsValue leftValue, JsValue rightValue, string clrName, out object result)
|
|
|
{
|
|
|
var left = leftValue.ToObject();
|
|
|
var right = rightValue.ToObject();
|
|
@@ -56,15 +51,16 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
var methods = leftMethods.Concat(rightMethods).Where(x => x.Name == clrName && x.GetParameters().Length == 2);
|
|
|
var _methods = MethodDescriptor.Build(methods.ToArray());
|
|
|
|
|
|
- return TypeConverter.FindBestMatch(engine, _methods, _ => arguments).FirstOrDefault()?.Item1;
|
|
|
+ return TypeConverter.FindBestMatch(_methods, _ => arguments).FirstOrDefault()?.Item1;
|
|
|
});
|
|
|
|
|
|
if (method != null)
|
|
|
{
|
|
|
- result = method.Call(engine, null, arguments);
|
|
|
+ result = method.Call(context.Engine, null, arguments);
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
result = null;
|
|
|
return false;
|
|
|
}
|
|
@@ -146,22 +142,14 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
if (lval is not null && rval is not null)
|
|
|
{
|
|
|
// we have fixed result
|
|
|
- return new JintConstantExpression(engine, expression, result.GetValue());
|
|
|
+ var context = new EvaluationContext(engine);
|
|
|
+ return new JintConstantExpression(expression, result.GetValue(context).Value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- public override JsValue GetValue()
|
|
|
- {
|
|
|
- // need to notify correct node when taking shortcut
|
|
|
- _engine._lastSyntaxNode = _expression;
|
|
|
-
|
|
|
- // we always create a JsValue
|
|
|
- return (JsValue) EvaluateInternal();
|
|
|
- }
|
|
|
-
|
|
|
public static bool SameValueZero(JsValue x, JsValue y)
|
|
|
{
|
|
|
return x == y || (x is JsNumber xNum && y is JsNumber yNum && double.IsNaN(xNum._value) && double.IsNaN(yNum._value));
|
|
@@ -234,12 +222,12 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
var equal = StrictlyEqual(left, right);
|
|
|
- return equal ? JsBoolean.True : JsBoolean.False;
|
|
|
+ return NormalCompletion(equal ? JsBoolean.True : JsBoolean.False);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -249,13 +237,11 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
- return StrictlyEqual(left, right)
|
|
|
- ? JsBoolean.False
|
|
|
- : JsBoolean.True;
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
+ return NormalCompletion(StrictlyEqual(left, right) ? JsBoolean.False : JsBoolean.True);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -265,21 +251,20 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_LessThan", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_LessThan", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
+
|
|
|
var value = Compare(left, right);
|
|
|
|
|
|
- return value._type == InternalTypes.Undefined
|
|
|
- ? JsBoolean.False
|
|
|
- : value;
|
|
|
+ return NormalCompletion(value._type == InternalTypes.Undefined ? JsBoolean.False : value);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -289,22 +274,20 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_GreaterThan", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_GreaterThan", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
var value = Compare(right, left, false);
|
|
|
|
|
|
- return value._type == InternalTypes.Undefined
|
|
|
- ? JsBoolean.False
|
|
|
- : value;
|
|
|
+ return NormalCompletion(value._type == InternalTypes.Undefined ? JsBoolean.False : value);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -314,49 +297,54 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_Addition", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_Addition", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
if (AreIntegerOperands(left, right))
|
|
|
{
|
|
|
- return JsNumber.Create(left.AsInteger() + right.AsInteger());
|
|
|
+ return NormalCompletion(JsNumber.Create(left.AsInteger() + right.AsInteger()));
|
|
|
}
|
|
|
|
|
|
var lprim = TypeConverter.ToPrimitive(left);
|
|
|
var rprim = TypeConverter.ToPrimitive(right);
|
|
|
- return lprim.IsString() || rprim.IsString()
|
|
|
+ JsValue result = lprim.IsString() || rprim.IsString()
|
|
|
? JsString.Create(TypeConverter.ToString(lprim) + TypeConverter.ToString(rprim))
|
|
|
: JsNumber.Create(TypeConverter.ToNumber(lprim) + TypeConverter.ToNumber(rprim));
|
|
|
+
|
|
|
+ return NormalCompletion(result);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private sealed class MinusBinaryExpression : JintBinaryExpression
|
|
|
{
|
|
|
public MinusBinaryExpression(Engine engine, BinaryExpression expression) : base(engine, expression)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_Subtraction", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_Subtraction", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
- return AreIntegerOperands(left, right)
|
|
|
+ var number = AreIntegerOperands(left, right)
|
|
|
? JsNumber.Create(left.AsInteger() - right.AsInteger())
|
|
|
: JsNumber.Create(TypeConverter.ToNumber(left) - TypeConverter.ToNumber(right));
|
|
|
+
|
|
|
+ return NormalCompletion(number);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -366,28 +354,28 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_Multiply", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_Multiply", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
if (AreIntegerOperands(left, right))
|
|
|
{
|
|
|
- return JsNumber.Create((long) left.AsInteger() * right.AsInteger());
|
|
|
+ return NormalCompletion(JsNumber.Create((long) left.AsInteger() * right.AsInteger()));
|
|
|
}
|
|
|
|
|
|
if (left.IsUndefined() || right.IsUndefined())
|
|
|
{
|
|
|
- return Undefined.Instance;
|
|
|
+ return NormalCompletion(Undefined.Instance);
|
|
|
}
|
|
|
|
|
|
- return JsNumber.Create(TypeConverter.ToNumber(left) * TypeConverter.ToNumber(right));
|
|
|
+ return NormalCompletion(JsNumber.Create(TypeConverter.ToNumber(left) * TypeConverter.ToNumber(right)));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -397,18 +385,18 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_Division", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_Division", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
- return Divide(left, right);
|
|
|
+ return NormalCompletion(Divide(left, right));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -421,20 +409,18 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
_invert = invert;
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, _invert ? "op_Inequality" : "op_Equality", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, _invert ? "op_Inequality" : "op_Equality", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
- return Equal(left, right) == !_invert
|
|
|
- ? JsBoolean.True
|
|
|
- : JsBoolean.False;
|
|
|
+ return NormalCompletion(Equal(left, right) == !_invert ? JsBoolean.True : JsBoolean.False);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -447,24 +433,22 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
_leftFirst = leftFirst;
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var leftValue = _left.GetValue();
|
|
|
- var rightValue = _right.GetValue();
|
|
|
+ var leftValue = _left.GetValue(context).Value;
|
|
|
+ var rightValue = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(leftValue, rightValue, _leftFirst ? "op_GreaterThanOrEqual" : "op_LessThanOrEqual", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, leftValue, rightValue, _leftFirst ? "op_GreaterThanOrEqual" : "op_LessThanOrEqual", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
var left = _leftFirst ? leftValue : rightValue;
|
|
|
var right = _leftFirst ? rightValue : leftValue;
|
|
|
|
|
|
var value = Compare(left, right, _leftFirst);
|
|
|
- return value.IsUndefined() || ((JsBoolean) value)._value
|
|
|
- ? JsBoolean.False
|
|
|
- : JsBoolean.True;
|
|
|
+ return NormalCompletion(value.IsUndefined() || ((JsBoolean) value)._value ? JsBoolean.False : JsBoolean.True);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -474,12 +458,11 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var value = _left.GetValue();
|
|
|
- return value.InstanceofOperator(_right.GetValue())
|
|
|
- ? JsBoolean.True
|
|
|
- : JsBoolean.False;
|
|
|
+ var leftValue = _left.GetValue(context).Value;
|
|
|
+ var rightValue = _right.GetValue(context).Value;
|
|
|
+ return NormalCompletion(leftValue.InstanceofOperator(rightValue) ? JsBoolean.True : JsBoolean.False);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -489,32 +472,33 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- return JsNumber.Create(Math.Pow(TypeConverter.ToNumber(left), TypeConverter.ToNumber(right)));
|
|
|
+ return NormalCompletion(JsNumber.Create(Math.Pow(TypeConverter.ToNumber(left), TypeConverter.ToNumber(right))));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private sealed class InBinaryExpression : JintBinaryExpression
|
|
|
{
|
|
|
public InBinaryExpression(Engine engine, BinaryExpression expression) : base(engine, expression)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
var oi = right as ObjectInstance;
|
|
|
if (oi is null)
|
|
|
{
|
|
|
- ExceptionHelper.ThrowTypeError(_engine.Realm, "in can only be used with an object");
|
|
|
+ ExceptionHelper.ThrowTypeError(context.Engine.Realm, "in can only be used with an object");
|
|
|
}
|
|
|
|
|
|
- return oi.HasProperty(left) ? JsBoolean.True : JsBoolean.False;
|
|
|
+ return NormalCompletion(oi.HasProperty(left) ? JsBoolean.True : JsBoolean.False);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -524,15 +508,15 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, "op_Modulus", out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, "op_Modulus", out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
if (AreIntegerOperands(left, right))
|
|
@@ -541,16 +525,16 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
var rightInteger = right.AsInteger();
|
|
|
if (leftInteger > 0 && rightInteger != 0)
|
|
|
{
|
|
|
- return JsNumber.Create(leftInteger % rightInteger);
|
|
|
+ return NormalCompletion(JsNumber.Create(leftInteger % rightInteger));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (left.IsUndefined() || right.IsUndefined())
|
|
|
{
|
|
|
- return Undefined.Instance;
|
|
|
+ return NormalCompletion(Undefined.Instance);
|
|
|
}
|
|
|
|
|
|
- return JsNumber.Create(TypeConverter.ToNumber(left) % TypeConverter.ToNumber(right));
|
|
|
+ return NormalCompletion(JsNumber.Create(TypeConverter.ToNumber(left) % TypeConverter.ToNumber(right)));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -560,23 +544,16 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
- switch (_operator)
|
|
|
+ return _operator switch
|
|
|
{
|
|
|
- case BinaryOperator.BitwiseAnd:
|
|
|
- return "op_BitwiseAnd";
|
|
|
- case BinaryOperator.BitwiseOr:
|
|
|
- return "op_BitwiseOr";
|
|
|
- case BinaryOperator.BitwiseXOr:
|
|
|
- return "op_ExclusiveOr";
|
|
|
- case BinaryOperator.LeftShift:
|
|
|
- return "op_LeftShift";
|
|
|
- case BinaryOperator.RightShift:
|
|
|
- return "op_RightShift";
|
|
|
- case BinaryOperator.UnsignedRightShift:
|
|
|
- return "op_UnsignedRightShift";
|
|
|
- default:
|
|
|
- return null;
|
|
|
- }
|
|
|
+ BinaryOperator.BitwiseAnd => "op_BitwiseAnd",
|
|
|
+ BinaryOperator.BitwiseOr => "op_BitwiseOr",
|
|
|
+ BinaryOperator.BitwiseXOr => "op_ExclusiveOr",
|
|
|
+ BinaryOperator.LeftShift => "op_LeftShift",
|
|
|
+ BinaryOperator.RightShift => "op_RightShift",
|
|
|
+ BinaryOperator.UnsignedRightShift => "op_UnsignedRightShift",
|
|
|
+ _ => null
|
|
|
+ };
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -587,15 +564,15 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
_operator = expression.Operator;
|
|
|
}
|
|
|
|
|
|
- protected override object EvaluateInternal()
|
|
|
+ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
|
|
|
{
|
|
|
- var left = _left.GetValue();
|
|
|
- var right = _right.GetValue();
|
|
|
+ var left = _left.GetValue(context).Value;
|
|
|
+ var right = _right.GetValue(context).Value;
|
|
|
|
|
|
- if (_engine.Options.Interop.OperatorOverloadingAllowed
|
|
|
- && TryOperatorOverloading(left, right, OperatorClrName, out var opResult))
|
|
|
+ if (context.OperatorOverloadingAllowed
|
|
|
+ && TryOperatorOverloading(context, left, right, OperatorClrName, out var opResult))
|
|
|
{
|
|
|
- return opResult;
|
|
|
+ return NormalCompletion(JsValue.FromObject(context.Engine, opResult));
|
|
|
}
|
|
|
|
|
|
if (AreIntegerOperands(left, right))
|
|
@@ -603,38 +580,40 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
int leftValue = left.AsInteger();
|
|
|
int rightValue = right.AsInteger();
|
|
|
|
|
|
+ JsValue result;
|
|
|
switch (_operator)
|
|
|
{
|
|
|
case BinaryOperator.BitwiseAnd:
|
|
|
- return JsNumber.Create(leftValue & rightValue);
|
|
|
-
|
|
|
+ result = JsNumber.Create(leftValue & rightValue);
|
|
|
+ break;
|
|
|
case BinaryOperator.BitwiseOr:
|
|
|
- return
|
|
|
- JsNumber.Create(leftValue | rightValue);
|
|
|
-
|
|
|
+ result = JsNumber.Create(leftValue | rightValue);
|
|
|
+ break;
|
|
|
case BinaryOperator.BitwiseXOr:
|
|
|
- return
|
|
|
- JsNumber.Create(leftValue ^ rightValue);
|
|
|
-
|
|
|
+ result = JsNumber.Create(leftValue ^ rightValue);
|
|
|
+ break;
|
|
|
case BinaryOperator.LeftShift:
|
|
|
- return JsNumber.Create(leftValue << (int) ((uint) rightValue & 0x1F));
|
|
|
-
|
|
|
+ result = JsNumber.Create(leftValue << (int) ((uint) rightValue & 0x1F));
|
|
|
+ break;
|
|
|
case BinaryOperator.RightShift:
|
|
|
- return JsNumber.Create(leftValue >> (int) ((uint) rightValue & 0x1F));
|
|
|
-
|
|
|
+ result = JsNumber.Create(leftValue >> (int) ((uint) rightValue & 0x1F));
|
|
|
+ break;
|
|
|
case BinaryOperator.UnsignedRightShift:
|
|
|
- return JsNumber.Create((uint) leftValue >> (int) ((uint) rightValue & 0x1F));
|
|
|
+ result = JsNumber.Create((uint) leftValue >> (int) ((uint) rightValue & 0x1F));
|
|
|
+ break;
|
|
|
default:
|
|
|
ExceptionHelper.ThrowArgumentOutOfRangeException(nameof(_operator), "unknown shift operator");
|
|
|
- return null;
|
|
|
+ result = null;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
+ return NormalCompletion(result);
|
|
|
}
|
|
|
|
|
|
- return EvaluateNonInteger(left, right);
|
|
|
+ return NormalCompletion(EvaluateNonInteger(left, right));
|
|
|
}
|
|
|
|
|
|
- private object EvaluateNonInteger(JsValue left, JsValue right)
|
|
|
+ private JsNumber EvaluateNonInteger(JsValue left, JsValue right)
|
|
|
{
|
|
|
switch (_operator)
|
|
|
{
|
|
@@ -642,30 +621,24 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
return JsNumber.Create(TypeConverter.ToInt32(left) & TypeConverter.ToInt32(right));
|
|
|
|
|
|
case BinaryOperator.BitwiseOr:
|
|
|
- return
|
|
|
- JsNumber.Create(TypeConverter.ToInt32(left) | TypeConverter.ToInt32(right));
|
|
|
+ return JsNumber.Create(TypeConverter.ToInt32(left) | TypeConverter.ToInt32(right));
|
|
|
|
|
|
case BinaryOperator.BitwiseXOr:
|
|
|
- return
|
|
|
- JsNumber.Create(TypeConverter.ToInt32(left) ^ TypeConverter.ToInt32(right));
|
|
|
+ return JsNumber.Create(TypeConverter.ToInt32(left) ^ TypeConverter.ToInt32(right));
|
|
|
|
|
|
case BinaryOperator.LeftShift:
|
|
|
- return JsNumber.Create(TypeConverter.ToInt32(left) <<
|
|
|
- (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
+ return JsNumber.Create(TypeConverter.ToInt32(left) << (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
|
|
|
case BinaryOperator.RightShift:
|
|
|
- return JsNumber.Create(TypeConverter.ToInt32(left) >>
|
|
|
- (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
+ return JsNumber.Create(TypeConverter.ToInt32(left) >> (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
|
|
|
case BinaryOperator.UnsignedRightShift:
|
|
|
- return JsNumber.Create((uint) TypeConverter.ToInt32(left) >>
|
|
|
- (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
+ return JsNumber.Create((uint) TypeConverter.ToInt32(left) >> (int) (TypeConverter.ToUint32(right) & 0x1F));
|
|
|
default:
|
|
|
ExceptionHelper.ThrowArgumentOutOfRangeException(nameof(_operator), "unknown shift operator");
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|