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); }
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)); }