OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1784 if (expr->is_compound()) { | 1784 if (expr->is_compound()) { |
1785 AccumulatorValueContext result_context(this); | 1785 AccumulatorValueContext result_context(this); |
1786 { AccumulatorValueContext left_operand_context(this); | 1786 { AccumulatorValueContext left_operand_context(this); |
1787 switch (assign_type) { | 1787 switch (assign_type) { |
1788 case VARIABLE: | 1788 case VARIABLE: |
1789 EmitVariableLoad(expr->target()->AsVariableProxy()); | 1789 EmitVariableLoad(expr->target()->AsVariableProxy()); |
1790 PrepareForBailout(expr->target(), TOS_REG); | 1790 PrepareForBailout(expr->target(), TOS_REG); |
1791 break; | 1791 break; |
1792 case NAMED_PROPERTY: | 1792 case NAMED_PROPERTY: |
1793 EmitNamedPropertyLoad(property); | 1793 EmitNamedPropertyLoad(property); |
1794 PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); | 1794 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1795 break; | 1795 break; |
1796 case KEYED_PROPERTY: | 1796 case KEYED_PROPERTY: |
1797 EmitKeyedPropertyLoad(property); | 1797 EmitKeyedPropertyLoad(property); |
1798 PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG); | 1798 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1799 break; | 1799 break; |
1800 } | 1800 } |
1801 } | 1801 } |
1802 | 1802 |
1803 Token::Value op = expr->binary_op(); | 1803 Token::Value op = expr->binary_op(); |
1804 __ push(eax); // Left operand goes on the stack. | 1804 __ push(eax); // Left operand goes on the stack. |
1805 VisitForAccumulatorValue(expr->value()); | 1805 VisitForAccumulatorValue(expr->value()); |
1806 | 1806 |
1807 OverwriteMode mode = expr->value()->ResultOverwriteAllowed() | 1807 OverwriteMode mode = expr->value()->ResultOverwriteAllowed() |
1808 ? OVERWRITE_RIGHT | 1808 ? OVERWRITE_RIGHT |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2209 | 2209 |
2210 | 2210 |
2211 void FullCodeGenerator::VisitProperty(Property* expr) { | 2211 void FullCodeGenerator::VisitProperty(Property* expr) { |
2212 Comment cmnt(masm_, "[ Property"); | 2212 Comment cmnt(masm_, "[ Property"); |
2213 Expression* key = expr->key(); | 2213 Expression* key = expr->key(); |
2214 | 2214 |
2215 if (key->IsPropertyName()) { | 2215 if (key->IsPropertyName()) { |
2216 VisitForAccumulatorValue(expr->obj()); | 2216 VisitForAccumulatorValue(expr->obj()); |
2217 __ mov(edx, result_register()); | 2217 __ mov(edx, result_register()); |
2218 EmitNamedPropertyLoad(expr); | 2218 EmitNamedPropertyLoad(expr); |
2219 PrepareForBailoutForId(expr->ReturnId(), TOS_REG); | 2219 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2220 context()->Plug(eax); | 2220 context()->Plug(eax); |
2221 } else { | 2221 } else { |
2222 VisitForStackValue(expr->obj()); | 2222 VisitForStackValue(expr->obj()); |
2223 VisitForAccumulatorValue(expr->key()); | 2223 VisitForAccumulatorValue(expr->key()); |
2224 __ pop(edx); // Object. | 2224 __ pop(edx); // Object. |
2225 __ mov(ecx, result_register()); // Key. | 2225 __ mov(ecx, result_register()); // Key. |
2226 EmitKeyedPropertyLoad(expr); | 2226 EmitKeyedPropertyLoad(expr); |
2227 context()->Plug(eax); | 2227 context()->Plug(eax); |
2228 } | 2228 } |
2229 } | 2229 } |
(...skipping 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4026 __ mov(ecx, Operand(esp, 0)); // Key. | 4026 __ mov(ecx, Operand(esp, 0)); // Key. |
4027 EmitKeyedPropertyLoad(prop); | 4027 EmitKeyedPropertyLoad(prop); |
4028 } | 4028 } |
4029 } | 4029 } |
4030 | 4030 |
4031 // We need a second deoptimization point after loading the value | 4031 // We need a second deoptimization point after loading the value |
4032 // in case evaluating the property load my have a side effect. | 4032 // in case evaluating the property load my have a side effect. |
4033 if (assign_type == VARIABLE) { | 4033 if (assign_type == VARIABLE) { |
4034 PrepareForBailout(expr->expression(), TOS_REG); | 4034 PrepareForBailout(expr->expression(), TOS_REG); |
4035 } else { | 4035 } else { |
4036 PrepareForBailoutForId(expr->CountId(), TOS_REG); | 4036 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
4037 } | 4037 } |
4038 | 4038 |
4039 // Call ToNumber only if operand is not a smi. | 4039 // Call ToNumber only if operand is not a smi. |
4040 Label no_conversion; | 4040 Label no_conversion; |
4041 if (ShouldInlineSmiCase(expr->op())) { | 4041 if (ShouldInlineSmiCase(expr->op())) { |
4042 __ JumpIfSmi(eax, &no_conversion, Label::kNear); | 4042 __ JumpIfSmi(eax, &no_conversion, Label::kNear); |
4043 } | 4043 } |
4044 ToNumberStub convert_stub; | 4044 ToNumberStub convert_stub; |
4045 __ CallStub(&convert_stub); | 4045 __ CallStub(&convert_stub); |
4046 __ bind(&no_conversion); | 4046 __ bind(&no_conversion); |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4544 *stack_depth = 0; | 4544 *stack_depth = 0; |
4545 *context_length = 0; | 4545 *context_length = 0; |
4546 return previous_; | 4546 return previous_; |
4547 } | 4547 } |
4548 | 4548 |
4549 #undef __ | 4549 #undef __ |
4550 | 4550 |
4551 } } // namespace v8::internal | 4551 } } // namespace v8::internal |
4552 | 4552 |
4553 #endif // V8_TARGET_ARCH_IA32 | 4553 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |