| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 3103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3114 } | 3114 } |
| 3115 | 3115 |
| 3116 | 3116 |
| 3117 void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { | 3117 void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| 3118 ASSERT(!HasStackOverflow()); | 3118 ASSERT(!HasStackOverflow()); |
| 3119 ASSERT(current_block() != NULL); | 3119 ASSERT(current_block() != NULL); |
| 3120 ASSERT(current_block()->HasPredecessor()); | 3120 ASSERT(current_block()->HasPredecessor()); |
| 3121 Variable* variable = expr->AsVariable(); | 3121 Variable* variable = expr->AsVariable(); |
| 3122 if (variable == NULL) { | 3122 if (variable == NULL) { |
| 3123 return Bailout("reference to rewritten variable"); | 3123 return Bailout("reference to rewritten variable"); |
| 3124 } else if (variable->mode() == Variable::LET) { |
| 3125 return Bailout("reference to let variable"); |
| 3124 } else if (variable->IsStackAllocated()) { | 3126 } else if (variable->IsStackAllocated()) { |
| 3125 HValue* value = environment()->Lookup(variable); | 3127 HValue* value = environment()->Lookup(variable); |
| 3126 if (variable->mode() == Variable::CONST && | 3128 if (variable->mode() == Variable::CONST && |
| 3127 value == graph()->GetConstantHole()) { | 3129 value == graph()->GetConstantHole()) { |
| 3128 return Bailout("reference to uninitialized const variable"); | 3130 return Bailout("reference to uninitialized const variable"); |
| 3129 } | 3131 } |
| 3130 return ast_context()->ReturnValue(value); | 3132 return ast_context()->ReturnValue(value); |
| 3131 } else if (variable->IsContextSlot()) { | 3133 } else if (variable->IsContextSlot()) { |
| 3132 if (variable->mode() == Variable::CONST) { | 3134 if (variable->mode() == Variable::CONST) { |
| 3133 return Bailout("reference to const context slot"); | 3135 return Bailout("reference to const context slot"); |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3579 VariableProxy* proxy = target->AsVariableProxy(); | 3581 VariableProxy* proxy = target->AsVariableProxy(); |
| 3580 Variable* var = proxy->AsVariable(); | 3582 Variable* var = proxy->AsVariable(); |
| 3581 Property* prop = target->AsProperty(); | 3583 Property* prop = target->AsProperty(); |
| 3582 ASSERT(var == NULL || prop == NULL); | 3584 ASSERT(var == NULL || prop == NULL); |
| 3583 | 3585 |
| 3584 // We have a second position recorded in the FullCodeGenerator to have | 3586 // We have a second position recorded in the FullCodeGenerator to have |
| 3585 // type feedback for the binary operation. | 3587 // type feedback for the binary operation. |
| 3586 BinaryOperation* operation = expr->binary_operation(); | 3588 BinaryOperation* operation = expr->binary_operation(); |
| 3587 | 3589 |
| 3588 if (var != NULL) { | 3590 if (var != NULL) { |
| 3589 if (var->mode() == Variable::CONST) { | 3591 if (var->mode() == Variable::CONST || |
| 3590 return Bailout("unsupported const compound assignment"); | 3592 var->mode() == Variable::LET) { |
| 3593 return Bailout("unsupported let or const compound assignment"); |
| 3591 } | 3594 } |
| 3592 | 3595 |
| 3593 CHECK_ALIVE(VisitForValue(operation)); | 3596 CHECK_ALIVE(VisitForValue(operation)); |
| 3594 | 3597 |
| 3595 if (var->is_global()) { | 3598 if (var->is_global()) { |
| 3596 HandleGlobalVariableAssignment(var, | 3599 HandleGlobalVariableAssignment(var, |
| 3597 Top(), | 3600 Top(), |
| 3598 expr->position(), | 3601 expr->position(), |
| 3599 expr->AssignmentId()); | 3602 expr->AssignmentId()); |
| 3600 } else if (var->IsStackAllocated()) { | 3603 } else if (var->IsStackAllocated()) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3723 if (expr->op() != Token::INIT_CONST) { | 3726 if (expr->op() != Token::INIT_CONST) { |
| 3724 return Bailout("non-initializer assignment to const"); | 3727 return Bailout("non-initializer assignment to const"); |
| 3725 } | 3728 } |
| 3726 if (!var->IsStackAllocated()) { | 3729 if (!var->IsStackAllocated()) { |
| 3727 return Bailout("assignment to const context slot"); | 3730 return Bailout("assignment to const context slot"); |
| 3728 } | 3731 } |
| 3729 // We insert a use of the old value to detect unsupported uses of const | 3732 // We insert a use of the old value to detect unsupported uses of const |
| 3730 // variables (e.g. initialization inside a loop). | 3733 // variables (e.g. initialization inside a loop). |
| 3731 HValue* old_value = environment()->Lookup(var); | 3734 HValue* old_value = environment()->Lookup(var); |
| 3732 AddInstruction(new HUseConst(old_value)); | 3735 AddInstruction(new HUseConst(old_value)); |
| 3736 } else if (var->mode() == Variable::LET) { |
| 3737 return Bailout("unsupported assignment to let"); |
| 3733 } | 3738 } |
| 3734 | 3739 |
| 3735 if (proxy->IsArguments()) return Bailout("assignment to arguments"); | 3740 if (proxy->IsArguments()) return Bailout("assignment to arguments"); |
| 3736 | 3741 |
| 3737 // Handle the assignment. | 3742 // Handle the assignment. |
| 3738 if (var->IsStackAllocated()) { | 3743 if (var->IsStackAllocated()) { |
| 3739 // We do not allow the arguments object to occur in a context where it | 3744 // We do not allow the arguments object to occur in a context where it |
| 3740 // may escape, but assignments to stack-allocated locals are | 3745 // may escape, but assignments to stack-allocated locals are |
| 3741 // permitted. | 3746 // permitted. |
| 3742 CHECK_ALIVE(VisitForValue(expr->value(), ARGUMENTS_ALLOWED)); | 3747 CHECK_ALIVE(VisitForValue(expr->value(), ARGUMENTS_ALLOWED)); |
| (...skipping 2058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5801 ASSERT(current_block() != NULL); | 5806 ASSERT(current_block() != NULL); |
| 5802 ASSERT(current_block()->HasPredecessor()); | 5807 ASSERT(current_block()->HasPredecessor()); |
| 5803 HThisFunction* self = new(zone()) HThisFunction; | 5808 HThisFunction* self = new(zone()) HThisFunction; |
| 5804 return ast_context()->ReturnInstruction(self, expr->id()); | 5809 return ast_context()->ReturnInstruction(self, expr->id()); |
| 5805 } | 5810 } |
| 5806 | 5811 |
| 5807 | 5812 |
| 5808 void HGraphBuilder::VisitDeclaration(Declaration* decl) { | 5813 void HGraphBuilder::VisitDeclaration(Declaration* decl) { |
| 5809 // We support only declarations that do not require code generation. | 5814 // We support only declarations that do not require code generation. |
| 5810 Variable* var = decl->proxy()->var(); | 5815 Variable* var = decl->proxy()->var(); |
| 5811 if (!var->IsStackAllocated() || decl->fun() != NULL) { | 5816 if (!var->IsStackAllocated() || |
| 5817 decl->fun() != NULL || |
| 5818 decl->mode() == Variable::LET) { |
| 5812 return Bailout("unsupported declaration"); | 5819 return Bailout("unsupported declaration"); |
| 5813 } | 5820 } |
| 5814 | 5821 |
| 5815 if (decl->mode() == Variable::CONST) { | 5822 if (decl->mode() == Variable::CONST) { |
| 5816 ASSERT(var->IsStackAllocated()); | 5823 ASSERT(var->IsStackAllocated()); |
| 5817 environment()->Bind(var, graph()->GetConstantHole()); | 5824 environment()->Bind(var, graph()->GetConstantHole()); |
| 5818 } | 5825 } |
| 5819 } | 5826 } |
| 5820 | 5827 |
| 5821 | 5828 |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6749 } | 6756 } |
| 6750 } | 6757 } |
| 6751 | 6758 |
| 6752 #ifdef DEBUG | 6759 #ifdef DEBUG |
| 6753 if (graph_ != NULL) graph_->Verify(); | 6760 if (graph_ != NULL) graph_->Verify(); |
| 6754 if (allocator_ != NULL) allocator_->Verify(); | 6761 if (allocator_ != NULL) allocator_->Verify(); |
| 6755 #endif | 6762 #endif |
| 6756 } | 6763 } |
| 6757 | 6764 |
| 6758 } } // namespace v8::internal | 6765 } } // namespace v8::internal |
| OLD | NEW |