Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The simplified version of the evaluation of `a += b` is: > AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression > 1. Let lRef be ? Evaluation of LeftHandSideExpression. > 2. Let lVal be ? GetValue(lRef). > 3. Let rRef be ? Evaluation of AssignmentExpression. > 4. Let rVal be ? GetValue(rRef). > 5. Let r be ? ApplyStringOrNumericBinaryOperator(lVal, opText, rVal). > 6. Perform ? PutValue(lRef, r). > 7. Return r. The simplified version of the evaluation of `a = a + b` is: > AssignmentExpression : LeftHandSideExpression = AssignmentExpressionLeft + AssignmentExpressionRight > 1. Let lRef be ? Evaluation of LeftHandSideExpression. > 2. Let alRef be ? Evaluation of AssignmentExpressionLeft. > 3. Let alVal be ? GetValue(alRef). > 4. Let arRef be ? Evaluation of AssignmentExpressionRight. > 5. Let arVal be ? GetValue(arRef). > 6. Let rRef be ? ApplyStringOrNumericBinaryOperator(alVal, opText, arVal). > 7. Let rVal be ? GetValue(rRef). [Note GetValue(rRef) returns rRef itself] > 8. Perform ? PutValue(lRef, rVal). > 9. Return rVal. The difference of these is that the evaluation of `a` is done twice for `a = a + b`, one with `1. Let lRef be ? Evaluation of LeftHandSideExpression` and one with `2. Let alRef be ? Evaluation of AssignmentExpressionLeft.` So this is same with #8366 and can be compressed similarly when the conditions are met (`a.b = a.b + c` -> `a.b += c`). **References** - [Spec of `=`, `+=`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-assignment-operators-runtime-semantics-evaluation) - [Spec of `+`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-addition-operator-plus-runtime-semantics-evaluation)
- Loading branch information