OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 2573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2584 | 2584 |
2585 void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { | 2585 void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
2586 DCHECK(expr->expression()->IsValidReferenceExpressionOrThis()); | 2586 DCHECK(expr->expression()->IsValidReferenceExpressionOrThis()); |
2587 | 2587 |
2588 // Left-hand side can only be a property, a global or a variable slot. | 2588 // Left-hand side can only be a property, a global or a variable slot. |
2589 Property* property = expr->expression()->AsProperty(); | 2589 Property* property = expr->expression()->AsProperty(); |
2590 LhsKind assign_type = Property::GetAssignType(property); | 2590 LhsKind assign_type = Property::GetAssignType(property); |
2591 | 2591 |
2592 // Reserve space for result of postfix operation. | 2592 // Reserve space for result of postfix operation. |
2593 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); | 2593 bool is_postfix = expr->is_postfix() && !ast_context()->IsEffect(); |
2594 if (is_postfix) environment()->Push(jsgraph()->UndefinedConstant()); | 2594 if (is_postfix && assign_type != VARIABLE) { |
| 2595 environment()->Push(jsgraph()->ZeroConstant()); |
| 2596 } |
2595 | 2597 |
2596 // Evaluate LHS expression and get old value. | 2598 // Evaluate LHS expression and get old value. |
2597 Node* old_value = NULL; | 2599 Node* old_value = NULL; |
2598 int stack_depth = -1; | 2600 int stack_depth = -1; |
2599 switch (assign_type) { | 2601 switch (assign_type) { |
2600 case VARIABLE: { | 2602 case VARIABLE: { |
2601 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 2603 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
2602 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); | 2604 VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
2603 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); | 2605 FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
2604 old_value = | 2606 old_value = |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2667 } | 2669 } |
2668 } | 2670 } |
2669 | 2671 |
2670 // Convert old value into a number. | 2672 // Convert old value into a number. |
2671 if (!is_strong(language_mode())) { | 2673 if (!is_strong(language_mode())) { |
2672 old_value = NewNode(javascript()->ToNumber(), old_value); | 2674 old_value = NewNode(javascript()->ToNumber(), old_value); |
2673 PrepareFrameState(old_value, expr->ToNumberId(), | 2675 PrepareFrameState(old_value, expr->ToNumberId(), |
2674 OutputFrameStateCombine::Push()); | 2676 OutputFrameStateCombine::Push()); |
2675 } | 2677 } |
2676 | 2678 |
| 2679 // Create a proper eager frame state for the stores. |
| 2680 environment()->Push(old_value); |
| 2681 FrameStateBeforeAndAfter store_states(this, expr->ToNumberId()); |
| 2682 old_value = environment()->Pop(); |
| 2683 |
2677 // Save result for postfix expressions at correct stack depth. | 2684 // Save result for postfix expressions at correct stack depth. |
2678 if (is_postfix) { | 2685 if (is_postfix) { |
2679 environment()->Poke(stack_depth, old_value); | 2686 if (assign_type != VARIABLE) { |
2680 } else { | 2687 environment()->Poke(stack_depth, old_value); |
2681 environment()->Push(old_value); | 2688 } else { |
| 2689 environment()->Push(old_value); |
| 2690 } |
2682 } | 2691 } |
2683 // TODO(bmeurer): This might not match the fullcodegen in case of non VARIABLE | |
2684 // eager deoptimization; we will figure out when we get there. | |
2685 FrameStateBeforeAndAfter store_states(this, expr->ToNumberId()); | |
2686 if (!is_postfix) old_value = environment()->Pop(); | |
2687 | 2692 |
2688 // Create node to perform +1/-1 operation. | 2693 // Create node to perform +1/-1 operation. |
2689 Node* value; | 2694 Node* value; |
2690 { | 2695 { |
2691 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 2696 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
2692 value = | 2697 value = |
2693 BuildBinaryOp(old_value, jsgraph()->OneConstant(), expr->binary_op()); | 2698 BuildBinaryOp(old_value, jsgraph()->OneConstant(), expr->binary_op()); |
2694 // This should never deoptimize outside strong mode because otherwise we | 2699 // This should never deoptimize outside strong mode because otherwise we |
2695 // have converted to number before. | 2700 // have converted to number before. |
2696 states.AddToNode(value, is_strong(language_mode()) ? expr->ToNumberId() | 2701 states.AddToNode(value, is_strong(language_mode()) ? expr->ToNumberId() |
(...skipping 1520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4217 // Phi does not exist yet, introduce one. | 4222 // Phi does not exist yet, introduce one. |
4218 value = NewPhi(inputs, value, control); | 4223 value = NewPhi(inputs, value, control); |
4219 value->ReplaceInput(inputs - 1, other); | 4224 value->ReplaceInput(inputs - 1, other); |
4220 } | 4225 } |
4221 return value; | 4226 return value; |
4222 } | 4227 } |
4223 | 4228 |
4224 } // namespace compiler | 4229 } // namespace compiler |
4225 } // namespace internal | 4230 } // namespace internal |
4226 } // namespace v8 | 4231 } // namespace v8 |
OLD | NEW |