| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3645 | 3645 |
| 3646 // The break target may be already bound (by the condition), or there | 3646 // The break target may be already bound (by the condition), or there |
| 3647 // may not be a valid frame. Bind it only if needed. | 3647 // may not be a valid frame. Bind it only if needed. |
| 3648 if (node->break_target()->is_linked()) { | 3648 if (node->break_target()->is_linked()) { |
| 3649 node->break_target()->Bind(); | 3649 node->break_target()->Bind(); |
| 3650 } | 3650 } |
| 3651 DecrementLoopNesting(); | 3651 DecrementLoopNesting(); |
| 3652 } | 3652 } |
| 3653 | 3653 |
| 3654 | 3654 |
| 3655 void CodeGenerator::SetTypeForStackSlot(Slot* slot, NumberInfo info) { |
| 3656 ASSERT(slot->type() == Slot::LOCAL || slot->type() == Slot::PARAMETER); |
| 3657 if (slot->type() == Slot::LOCAL) { |
| 3658 frame_->SetTypeForLocalAt(slot->index(), info); |
| 3659 } else { |
| 3660 frame_->SetTypeForParamAt(slot->index(), info); |
| 3661 } |
| 3662 if (FLAG_debug_code && info.IsSmi()) { |
| 3663 if (slot->type() == Slot::LOCAL) { |
| 3664 frame_->PushLocalAt(slot->index()); |
| 3665 } else { |
| 3666 frame_->PushParameterAt(slot->index()); |
| 3667 } |
| 3668 Result var = frame_->Pop(); |
| 3669 var.ToRegister(); |
| 3670 __ AbortIfNotSmi(var.reg()); |
| 3671 } |
| 3672 } |
| 3673 |
| 3674 |
| 3655 void CodeGenerator::VisitForStatement(ForStatement* node) { | 3675 void CodeGenerator::VisitForStatement(ForStatement* node) { |
| 3656 ASSERT(!in_spilled_code()); | 3676 ASSERT(!in_spilled_code()); |
| 3657 Comment cmnt(masm_, "[ ForStatement"); | 3677 Comment cmnt(masm_, "[ ForStatement"); |
| 3658 CodeForStatementPosition(node); | 3678 CodeForStatementPosition(node); |
| 3659 | 3679 |
| 3660 // Compile the init expression if present. | 3680 // Compile the init expression if present. |
| 3661 if (node->init() != NULL) { | 3681 if (node->init() != NULL) { |
| 3662 Visit(node->init()); | 3682 Visit(node->init()); |
| 3663 } | 3683 } |
| 3664 | 3684 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3745 | 3765 |
| 3746 CheckStack(); // TODO(1222600): ignore if body contains calls. | 3766 CheckStack(); // TODO(1222600): ignore if body contains calls. |
| 3747 | 3767 |
| 3748 // We know that the loop index is a smi if it is not modified in the | 3768 // We know that the loop index is a smi if it is not modified in the |
| 3749 // loop body and it is checked against a constant limit in the loop | 3769 // loop body and it is checked against a constant limit in the loop |
| 3750 // condition. In this case, we reset the static type information of the | 3770 // condition. In this case, we reset the static type information of the |
| 3751 // loop index to smi before compiling the body, the update expression, and | 3771 // loop index to smi before compiling the body, the update expression, and |
| 3752 // the bottom check of the loop condition. | 3772 // the bottom check of the loop condition. |
| 3753 if (node->is_fast_smi_loop()) { | 3773 if (node->is_fast_smi_loop()) { |
| 3754 // Set number type of the loop variable to smi. | 3774 // Set number type of the loop variable to smi. |
| 3755 Slot* slot = node->loop_variable()->slot(); | 3775 SetTypeForStackSlot(node->loop_variable()->slot(), NumberInfo::Smi()); |
| 3756 ASSERT(slot->type() == Slot::LOCAL); | |
| 3757 frame_->SetTypeForLocalAt(slot->index(), NumberInfo::Smi()); | |
| 3758 if (FLAG_debug_code) { | |
| 3759 frame_->PushLocalAt(slot->index()); | |
| 3760 Result var = frame_->Pop(); | |
| 3761 var.ToRegister(); | |
| 3762 __ AbortIfNotSmi(var.reg()); | |
| 3763 } | |
| 3764 } | 3776 } |
| 3765 | 3777 |
| 3766 Visit(node->body()); | 3778 Visit(node->body()); |
| 3767 | 3779 |
| 3768 // If there is an update expression, compile it if necessary. | 3780 // If there is an update expression, compile it if necessary. |
| 3769 if (node->next() != NULL) { | 3781 if (node->next() != NULL) { |
| 3770 if (node->continue_target()->is_linked()) { | 3782 if (node->continue_target()->is_linked()) { |
| 3771 node->continue_target()->Bind(); | 3783 node->continue_target()->Bind(); |
| 3772 } | 3784 } |
| 3773 | 3785 |
| 3774 // Control can reach the update by falling out of the body or by a | 3786 // Control can reach the update by falling out of the body or by a |
| 3775 // continue. | 3787 // continue. |
| 3776 if (has_valid_frame()) { | 3788 if (has_valid_frame()) { |
| 3777 // Record the source position of the statement as this code which | 3789 // Record the source position of the statement as this code which |
| 3778 // is after the code for the body actually belongs to the loop | 3790 // is after the code for the body actually belongs to the loop |
| 3779 // statement and not the body. | 3791 // statement and not the body. |
| 3780 CodeForStatementPosition(node); | 3792 CodeForStatementPosition(node); |
| 3781 Visit(node->next()); | 3793 Visit(node->next()); |
| 3782 } | 3794 } |
| 3783 } | 3795 } |
| 3784 | 3796 |
| 3785 // Set the type of the loop variable to smi before compiling the test | 3797 // Set the type of the loop variable to smi before compiling the test |
| 3786 // expression if we are in a fast smi loop condition. | 3798 // expression if we are in a fast smi loop condition. |
| 3787 if (node->is_fast_smi_loop() && has_valid_frame()) { | 3799 if (node->is_fast_smi_loop() && has_valid_frame()) { |
| 3788 // Set number type of the loop variable to smi. | 3800 // Set number type of the loop variable to smi. |
| 3789 Slot* slot = node->loop_variable()->slot(); | 3801 SetTypeForStackSlot(node->loop_variable()->slot(), NumberInfo::Smi()); |
| 3790 ASSERT(slot->type() == Slot::LOCAL); | |
| 3791 frame_->SetTypeForLocalAt(slot->index(), NumberInfo::Smi()); | |
| 3792 if (FLAG_debug_code) { | |
| 3793 frame_->PushLocalAt(slot->index()); | |
| 3794 Result var = frame_->Pop(); | |
| 3795 var.ToRegister(); | |
| 3796 __ AbortIfNotSmi(var.reg()); | |
| 3797 } | |
| 3798 } | 3802 } |
| 3799 | 3803 |
| 3800 // Based on the condition analysis, compile the backward jump as | 3804 // Based on the condition analysis, compile the backward jump as |
| 3801 // necessary. | 3805 // necessary. |
| 3802 switch (info) { | 3806 switch (info) { |
| 3803 case ALWAYS_TRUE: | 3807 case ALWAYS_TRUE: |
| 3804 if (has_valid_frame()) { | 3808 if (has_valid_frame()) { |
| 3805 if (node->next() == NULL) { | 3809 if (node->next() == NULL) { |
| 3806 node->continue_target()->Jump(); | 3810 node->continue_target()->Jump(); |
| 3807 } else { | 3811 } else { |
| (...skipping 8462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12270 | 12274 |
| 12271 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12275 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 12272 // tagged as a small integer. | 12276 // tagged as a small integer. |
| 12273 __ bind(&runtime); | 12277 __ bind(&runtime); |
| 12274 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12278 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 12275 } | 12279 } |
| 12276 | 12280 |
| 12277 #undef __ | 12281 #undef __ |
| 12278 | 12282 |
| 12279 } } // namespace v8::internal | 12283 } } // namespace v8::internal |
| OLD | NEW |