|
@@ -1,9 +1,10 @@
|
|
using System.Numerics;
|
|
using System.Numerics;
|
|
-using Esprima.Ast;
|
|
|
|
using Jint.Native;
|
|
using Jint.Native;
|
|
using Jint.Native.Function;
|
|
using Jint.Native.Function;
|
|
using Jint.Runtime.Environments;
|
|
using Jint.Runtime.Environments;
|
|
|
|
+
|
|
using Environment = Jint.Runtime.Environments.Environment;
|
|
using Environment = Jint.Runtime.Environments.Environment;
|
|
|
|
+using Operator = Esprima.Ast.AssignmentOperator;
|
|
|
|
|
|
namespace Jint.Runtime.Interpreter.Expressions
|
|
namespace Jint.Runtime.Interpreter.Expressions
|
|
{
|
|
{
|
|
@@ -13,7 +14,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
private readonly JintIdentifierExpression? _leftIdentifier;
|
|
private readonly JintIdentifierExpression? _leftIdentifier;
|
|
|
|
|
|
private readonly JintExpression _right;
|
|
private readonly JintExpression _right;
|
|
- private readonly AssignmentOperator _operator;
|
|
|
|
|
|
+ private readonly Operator _operator;
|
|
|
|
|
|
private JintAssignmentExpression(AssignmentExpression expression) : base(expression)
|
|
private JintAssignmentExpression(AssignmentExpression expression) : base(expression)
|
|
{
|
|
{
|
|
@@ -26,7 +27,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
|
|
|
|
internal static JintExpression Build(AssignmentExpression expression)
|
|
internal static JintExpression Build(AssignmentExpression expression)
|
|
{
|
|
{
|
|
- if (expression.Operator == AssignmentOperator.Assign)
|
|
|
|
|
|
+ if (expression.Operator == Operator.Assign)
|
|
{
|
|
{
|
|
if (expression.Left is BindingPattern)
|
|
if (expression.Left is BindingPattern)
|
|
{
|
|
{
|
|
@@ -79,7 +80,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
{
|
|
{
|
|
switch (_operator)
|
|
switch (_operator)
|
|
{
|
|
{
|
|
- case AssignmentOperator.PlusAssign:
|
|
|
|
|
|
+ case Operator.PlusAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
@@ -114,7 +115,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.MinusAssign:
|
|
|
|
|
|
+ case Operator.MinusAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
@@ -133,7 +134,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.TimesAssign:
|
|
|
|
|
|
+ case Operator.TimesAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
if (AreIntegerOperands(originalLeftValue, rval))
|
|
@@ -156,14 +157,14 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.DivideAssign:
|
|
|
|
|
|
+ case Operator.DivideAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = Divide(context, originalLeftValue, rval);
|
|
newLeftValue = Divide(context, originalLeftValue, rval);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.ModuloAssign:
|
|
|
|
|
|
+ case Operator.ModuloAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
if (originalLeftValue.IsUndefined() || rval.IsUndefined())
|
|
if (originalLeftValue.IsUndefined() || rval.IsUndefined())
|
|
@@ -178,49 +179,49 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.BitwiseAndAssign:
|
|
|
|
|
|
+ case Operator.BitwiseAndAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) & TypeConverter.ToInt32(rval);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) & TypeConverter.ToInt32(rval);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.BitwiseOrAssign:
|
|
|
|
|
|
+ case Operator.BitwiseOrAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) | TypeConverter.ToInt32(rval);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) | TypeConverter.ToInt32(rval);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.BitwiseXorAssign:
|
|
|
|
|
|
+ case Operator.BitwiseXorAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) ^ TypeConverter.ToInt32(rval);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) ^ TypeConverter.ToInt32(rval);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.LeftShiftAssign:
|
|
|
|
|
|
+ case Operator.LeftShiftAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) << (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) << (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.RightShiftAssign:
|
|
|
|
|
|
+ case Operator.RightShiftAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) >> (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
newLeftValue = TypeConverter.ToInt32(originalLeftValue) >> (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.UnsignedRightShiftAssign:
|
|
|
|
|
|
+ case Operator.UnsignedRightShiftAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
newLeftValue = (uint) TypeConverter.ToInt32(originalLeftValue) >> (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
newLeftValue = (uint) TypeConverter.ToInt32(originalLeftValue) >> (int) (TypeConverter.ToUint32(rval) & 0x1F);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.NullishAssign:
|
|
|
|
|
|
+ case Operator.NullishAssign:
|
|
{
|
|
{
|
|
if (!originalLeftValue.IsNullOrUndefined())
|
|
if (!originalLeftValue.IsNullOrUndefined())
|
|
{
|
|
{
|
|
@@ -232,7 +233,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.AndAssign:
|
|
|
|
|
|
+ case Operator.AndAssign:
|
|
{
|
|
{
|
|
if (!TypeConverter.ToBoolean(originalLeftValue))
|
|
if (!TypeConverter.ToBoolean(originalLeftValue))
|
|
{
|
|
{
|
|
@@ -244,7 +245,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.OrAssign:
|
|
|
|
|
|
+ case Operator.OrAssign:
|
|
{
|
|
{
|
|
if (TypeConverter.ToBoolean(originalLeftValue))
|
|
if (TypeConverter.ToBoolean(originalLeftValue))
|
|
{
|
|
{
|
|
@@ -256,7 +257,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- case AssignmentOperator.ExponentiationAssign:
|
|
|
|
|
|
+ case Operator.ExponentiationAssign:
|
|
{
|
|
{
|
|
var rval = _right.GetValue(context);
|
|
var rval = _right.GetValue(context);
|
|
if (!originalLeftValue.IsBigInt() && !rval.IsBigInt())
|
|
if (!originalLeftValue.IsBigInt() && !rval.IsBigInt())
|
|
@@ -297,41 +298,41 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
string? operatorClrName = null;
|
|
string? operatorClrName = null;
|
|
switch (_operator)
|
|
switch (_operator)
|
|
{
|
|
{
|
|
- case AssignmentOperator.PlusAssign:
|
|
|
|
|
|
+ case Operator.PlusAssign:
|
|
operatorClrName = "op_Addition";
|
|
operatorClrName = "op_Addition";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.MinusAssign:
|
|
|
|
|
|
+ case Operator.MinusAssign:
|
|
operatorClrName = "op_Subtraction";
|
|
operatorClrName = "op_Subtraction";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.TimesAssign:
|
|
|
|
|
|
+ case Operator.TimesAssign:
|
|
operatorClrName = "op_Multiply";
|
|
operatorClrName = "op_Multiply";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.DivideAssign:
|
|
|
|
|
|
+ case Operator.DivideAssign:
|
|
operatorClrName = "op_Division";
|
|
operatorClrName = "op_Division";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.ModuloAssign:
|
|
|
|
|
|
+ case Operator.ModuloAssign:
|
|
operatorClrName = "op_Modulus";
|
|
operatorClrName = "op_Modulus";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.BitwiseAndAssign:
|
|
|
|
|
|
+ case Operator.BitwiseAndAssign:
|
|
operatorClrName = "op_BitwiseAnd";
|
|
operatorClrName = "op_BitwiseAnd";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.BitwiseOrAssign:
|
|
|
|
|
|
+ case Operator.BitwiseOrAssign:
|
|
operatorClrName = "op_BitwiseOr";
|
|
operatorClrName = "op_BitwiseOr";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.BitwiseXorAssign:
|
|
|
|
|
|
+ case Operator.BitwiseXorAssign:
|
|
operatorClrName = "op_ExclusiveOr";
|
|
operatorClrName = "op_ExclusiveOr";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.LeftShiftAssign:
|
|
|
|
|
|
+ case Operator.LeftShiftAssign:
|
|
operatorClrName = "op_LeftShift";
|
|
operatorClrName = "op_LeftShift";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.RightShiftAssign:
|
|
|
|
|
|
+ case Operator.RightShiftAssign:
|
|
operatorClrName = "op_RightShift";
|
|
operatorClrName = "op_RightShift";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.UnsignedRightShiftAssign:
|
|
|
|
|
|
+ case Operator.UnsignedRightShiftAssign:
|
|
operatorClrName = "op_UnsignedRightShift";
|
|
operatorClrName = "op_UnsignedRightShift";
|
|
break;
|
|
break;
|
|
- case AssignmentOperator.ExponentiationAssign:
|
|
|
|
- case AssignmentOperator.Assign:
|
|
|
|
|
|
+ case Operator.ExponentiationAssign:
|
|
|
|
+ case Operator.Assign:
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -352,7 +353,7 @@ namespace Jint.Runtime.Interpreter.Expressions
|
|
private JsValue NamedEvaluation(EvaluationContext context, JintExpression expression)
|
|
private JsValue NamedEvaluation(EvaluationContext context, JintExpression expression)
|
|
{
|
|
{
|
|
var rval = expression.GetValue(context);
|
|
var rval = expression.GetValue(context);
|
|
- if (expression._expression.IsAnonymousFunctionDefinition() && _left._expression.Type == Nodes.Identifier)
|
|
|
|
|
|
+ if (expression._expression.IsAnonymousFunctionDefinition() && _left._expression.Type == NodeType.Identifier)
|
|
{
|
|
{
|
|
((Function) rval).SetFunctionName(((Identifier) _left._expression).Name);
|
|
((Function) rval).SetFunctionName(((Identifier) _left._expression).Name);
|
|
}
|
|
}
|