public override Completion Evaluate(Interpreter interpreter)
 {
     if (!(leftHandSideExpression is ObjectLiteral) && !(leftHandSideExpression is ArrayLiteral))
     {
         var lrefComp = leftHandSideExpression.Evaluate(interpreter);
         if (lrefComp.IsAbrupt())
         {
             return(lrefComp);
         }
         var lref = lrefComp.value;
         if (!(lref is ReferenceValue referenceValue))
         {
             throw new InvalidOperationException("AssignmentExpression.Evaluate: left hand side did not return a reference.");
         }
         Completion rval;
         if (assignmentExpression is FunctionExpression functionExpression && functionExpression.isAnonymous && leftHandSideExpression is IdentifierReference)
         {
             rval = functionExpression.NamedEvaluate(interpreter, referenceValue.referencedName);
         }
         else
         {
             rval = assignmentExpression.Evaluate(interpreter).GetValue();
         }
         if (rval.IsAbrupt())
         {
             return(rval);
         }
         var comp = referenceValue.PutValue(rval.value !);
         if (comp.IsAbrupt())
         {
             return(comp);
         }
         return(rval);
     }
示例#2
0
        public override Completion Evaluate(Interpreter interpreter)
        {
            var lhs = leftHandSideExpression.Evaluate(interpreter);

            if (lhs.IsAbrupt())
            {
                return(lhs);
            }

            var lhsValue = lhs.GetValue();

            if (lhsValue.IsAbrupt())
            {
                return(lhsValue);
            }

            var oldValueComp = lhsValue.value !.ToNumber();

            if (oldValueComp.IsAbrupt())
            {
                return(oldValueComp);
            }
            var oldValue = oldValueComp.value as NumberValue;

            if (!(lhs.value is ReferenceValue reference))
            {
                throw new InvalidOperationException("PostfixUpdateExpression.Evaluate: leftHandSideExpression did not return a reference");
            }

            NumberValue newValue;

            if (updateOperation == UpdateOperator.Decrement)
            {
                newValue = new NumberValue(oldValue !.number - 1);
            }
            else
            {
                newValue = new NumberValue(oldValue !.number + 1);
            }

            var putComp = reference.PutValue(newValue);

            if (putComp.IsAbrupt())
            {
                return(putComp);
            }

            return(Completion.NormalCompletion(oldValue));
        }