Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1807 context()->Plug(eax); | 1807 context()->Plug(eax); |
| 1808 } | 1808 } |
| 1809 } | 1809 } |
| 1810 | 1810 |
| 1811 | 1811 |
| 1812 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1812 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| 1813 DCHECK(expr->target()->IsValidReferenceExpression()); | 1813 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1814 | 1814 |
| 1815 Comment cmnt(masm_, "[ Assignment"); | 1815 Comment cmnt(masm_, "[ Assignment"); |
| 1816 | 1816 |
| 1817 // Left-hand side can only be a property, a global or a (parameter or local) | |
| 1818 // slot. | |
| 1819 enum LhsKind { | |
| 1820 VARIABLE, | |
| 1821 NAMED_PROPERTY, | |
| 1822 KEYED_PROPERTY, | |
| 1823 NAMED_SUPER_PROPERTY | |
| 1824 }; | |
| 1825 LhsKind assign_type = VARIABLE; | |
| 1826 Property* property = expr->target()->AsProperty(); | 1817 Property* property = expr->target()->AsProperty(); |
| 1827 if (property != NULL) { | 1818 LhsKind assign_type = GetAssignType(property); |
| 1828 assign_type = (property->key()->IsPropertyName()) | |
| 1829 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
| 1830 : NAMED_PROPERTY) | |
| 1831 : KEYED_PROPERTY; | |
| 1832 } | |
| 1833 | 1819 |
| 1834 // Evaluate LHS expression. | 1820 // Evaluate LHS expression. |
| 1835 switch (assign_type) { | 1821 switch (assign_type) { |
| 1836 case VARIABLE: | 1822 case VARIABLE: |
| 1837 // Nothing to do here. | 1823 // Nothing to do here. |
| 1838 break; | 1824 break; |
| 1839 case NAMED_SUPER_PROPERTY: | 1825 case NAMED_SUPER_PROPERTY: |
| 1840 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1826 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1841 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1827 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1842 __ push(result_register()); | 1828 __ push(result_register()); |
| 1843 if (expr->is_compound()) { | 1829 if (expr->is_compound()) { |
| 1844 __ push(MemOperand(esp, kPointerSize)); | 1830 __ push(MemOperand(esp, kPointerSize)); |
| 1845 __ push(result_register()); | 1831 __ push(result_register()); |
| 1846 } | 1832 } |
| 1847 break; | 1833 break; |
| 1848 case NAMED_PROPERTY: | 1834 case NAMED_PROPERTY: |
| 1849 if (expr->is_compound()) { | 1835 if (expr->is_compound()) { |
| 1850 // We need the receiver both on the stack and in the register. | 1836 // We need the receiver both on the stack and in the register. |
| 1851 VisitForStackValue(property->obj()); | 1837 VisitForStackValue(property->obj()); |
| 1852 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1838 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 1853 } else { | 1839 } else { |
| 1854 VisitForStackValue(property->obj()); | 1840 VisitForStackValue(property->obj()); |
| 1855 } | 1841 } |
| 1856 break; | 1842 break; |
| 1843 case KEYED_SUPER_PROPERTY: | |
| 1844 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | |
| 1845 EmitLoadHomeObject(property->obj()->AsSuperReference()); | |
| 1846 __ Push(result_register()); | |
| 1847 VisitForAccumulatorValue(property->key()); | |
| 1848 __ Push(result_register()); | |
| 1849 if (expr->is_compound()) { | |
| 1850 __ push(MemOperand(esp, 2 * kPointerSize)); | |
| 1851 __ push(MemOperand(esp, 2 * kPointerSize)); | |
| 1852 __ push(result_register()); | |
| 1853 } | |
| 1854 break; | |
| 1857 case KEYED_PROPERTY: { | 1855 case KEYED_PROPERTY: { |
| 1858 if (expr->is_compound()) { | 1856 if (expr->is_compound()) { |
| 1859 VisitForStackValue(property->obj()); | 1857 VisitForStackValue(property->obj()); |
| 1860 VisitForStackValue(property->key()); | 1858 VisitForStackValue(property->key()); |
| 1861 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); | 1859 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); |
| 1862 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); | 1860 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); |
| 1863 } else { | 1861 } else { |
| 1864 VisitForStackValue(property->obj()); | 1862 VisitForStackValue(property->obj()); |
| 1865 VisitForStackValue(property->key()); | 1863 VisitForStackValue(property->key()); |
| 1866 } | 1864 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1879 PrepareForBailout(expr->target(), TOS_REG); | 1877 PrepareForBailout(expr->target(), TOS_REG); |
| 1880 break; | 1878 break; |
| 1881 case NAMED_SUPER_PROPERTY: | 1879 case NAMED_SUPER_PROPERTY: |
| 1882 EmitNamedSuperPropertyLoad(property); | 1880 EmitNamedSuperPropertyLoad(property); |
| 1883 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1881 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1884 break; | 1882 break; |
| 1885 case NAMED_PROPERTY: | 1883 case NAMED_PROPERTY: |
| 1886 EmitNamedPropertyLoad(property); | 1884 EmitNamedPropertyLoad(property); |
| 1887 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1885 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1888 break; | 1886 break; |
| 1887 case KEYED_SUPER_PROPERTY: | |
| 1888 EmitKeyedSuperPropertyLoad(property); | |
| 1889 PrepareForBailoutForId(property->LoadId(), TOS_REG); | |
| 1890 break; | |
| 1889 case KEYED_PROPERTY: | 1891 case KEYED_PROPERTY: |
| 1890 EmitKeyedPropertyLoad(property); | 1892 EmitKeyedPropertyLoad(property); |
| 1891 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1893 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1892 break; | 1894 break; |
| 1893 } | 1895 } |
| 1894 } | 1896 } |
| 1895 | 1897 |
| 1896 Token::Value op = expr->binary_op(); | 1898 Token::Value op = expr->binary_op(); |
| 1897 __ push(eax); // Left operand goes on the stack. | 1899 __ push(eax); // Left operand goes on the stack. |
| 1898 VisitForAccumulatorValue(expr->value()); | 1900 VisitForAccumulatorValue(expr->value()); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1926 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 1928 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), |
| 1927 expr->op()); | 1929 expr->op()); |
| 1928 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1930 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 1929 context()->Plug(eax); | 1931 context()->Plug(eax); |
| 1930 break; | 1932 break; |
| 1931 case NAMED_PROPERTY: | 1933 case NAMED_PROPERTY: |
| 1932 EmitNamedPropertyAssignment(expr); | 1934 EmitNamedPropertyAssignment(expr); |
| 1933 break; | 1935 break; |
| 1934 case NAMED_SUPER_PROPERTY: | 1936 case NAMED_SUPER_PROPERTY: |
| 1935 EmitNamedSuperPropertyStore(property); | 1937 EmitNamedSuperPropertyStore(property); |
| 1936 context()->Plug(eax); | 1938 context()->Plug(result_register()); |
| 1939 break; | |
| 1940 case KEYED_SUPER_PROPERTY: | |
| 1941 EmitKeyedSuperPropertyStore(property); | |
| 1942 context()->Plug(result_register()); | |
| 1937 break; | 1943 break; |
| 1938 case KEYED_PROPERTY: | 1944 case KEYED_PROPERTY: |
| 1939 EmitKeyedPropertyAssignment(expr); | 1945 EmitKeyedPropertyAssignment(expr); |
| 1940 break; | 1946 break; |
| 1941 } | 1947 } |
| 1942 } | 1948 } |
| 1943 | 1949 |
| 1944 | 1950 |
| 1945 void FullCodeGenerator::VisitYield(Yield* expr) { | 1951 void FullCodeGenerator::VisitYield(Yield* expr) { |
| 1946 Comment cmnt(masm_, "[ Yield"); | 1952 Comment cmnt(masm_, "[ Yield"); |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2561 | 2567 |
| 2562 | 2568 |
| 2563 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2569 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2564 // Assignment to named property of super. | 2570 // Assignment to named property of super. |
| 2565 // eax : value | 2571 // eax : value |
| 2566 // stack : receiver ('this'), home_object | 2572 // stack : receiver ('this'), home_object |
| 2567 DCHECK(prop != NULL); | 2573 DCHECK(prop != NULL); |
| 2568 Literal* key = prop->key()->AsLiteral(); | 2574 Literal* key = prop->key()->AsLiteral(); |
| 2569 DCHECK(key != NULL); | 2575 DCHECK(key != NULL); |
| 2570 | 2576 |
| 2577 __ push(Immediate(key->value())); | |
| 2571 __ push(eax); | 2578 __ push(eax); |
| 2572 __ push(Immediate(key->value())); | |
| 2573 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2579 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
| 2574 : Runtime::kStoreToSuper_Sloppy), | 2580 : Runtime::kStoreToSuper_Sloppy), |
| 2575 4); | 2581 4); |
| 2576 } | 2582 } |
| 2577 | 2583 |
| 2578 | 2584 |
| 2585 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { | |
| 2586 // Assignment to named property of super. | |
| 2587 // eax : value | |
| 2588 // stack : receiver ('this'), home_object, key | |
| 2589 | |
| 2590 __ push(eax); | |
| 2591 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict | |
| 2592 : Runtime::kStoreKeyedToSuper_Sloppy), | |
| 2593 4); | |
| 2594 } | |
| 2595 | |
| 2596 | |
| 2579 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2597 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2580 // Assignment to a property, using a keyed store IC. | 2598 // Assignment to a property, using a keyed store IC. |
| 2581 // eax : value | 2599 // eax : value |
| 2582 // esp[0] : key | 2600 // esp[0] : key |
| 2583 // esp[kPointerSize] : receiver | 2601 // esp[kPointerSize] : receiver |
| 2584 | 2602 |
| 2585 __ pop(StoreDescriptor::NameRegister()); // Key. | 2603 __ pop(StoreDescriptor::NameRegister()); // Key. |
| 2586 __ pop(StoreDescriptor::ReceiverRegister()); | 2604 __ pop(StoreDescriptor::ReceiverRegister()); |
| 2587 DCHECK(StoreDescriptor::ValueRegister().is(eax)); | 2605 DCHECK(StoreDescriptor::ValueRegister().is(eax)); |
| 2588 // Record source code position before IC call. | 2606 // Record source code position before IC call. |
| (...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4378 } | 4396 } |
| 4379 } | 4397 } |
| 4380 | 4398 |
| 4381 | 4399 |
| 4382 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4400 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4383 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4401 DCHECK(expr->expression()->IsValidReferenceExpression()); |
| 4384 | 4402 |
| 4385 Comment cmnt(masm_, "[ CountOperation"); | 4403 Comment cmnt(masm_, "[ CountOperation"); |
| 4386 SetSourcePosition(expr->position()); | 4404 SetSourcePosition(expr->position()); |
| 4387 | 4405 |
| 4388 // Expression can only be a property, a global or a (parameter or local) | |
| 4389 // slot. | |
| 4390 enum LhsKind { | |
| 4391 VARIABLE, | |
| 4392 NAMED_PROPERTY, | |
| 4393 KEYED_PROPERTY, | |
| 4394 NAMED_SUPER_PROPERTY | |
| 4395 }; | |
| 4396 LhsKind assign_type = VARIABLE; | |
| 4397 Property* prop = expr->expression()->AsProperty(); | 4406 Property* prop = expr->expression()->AsProperty(); |
| 4398 // In case of a property we use the uninitialized expression context | 4407 LhsKind assign_type = GetAssignType(prop); |
| 4399 // of the key to detect a named property. | |
| 4400 if (prop != NULL) { | |
| 4401 assign_type = | |
| 4402 (prop->key()->IsPropertyName()) | |
| 4403 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
| 4404 : KEYED_PROPERTY; | |
| 4405 } | |
| 4406 | 4408 |
| 4407 // Evaluate expression and get value. | 4409 // Evaluate expression and get value. |
| 4408 if (assign_type == VARIABLE) { | 4410 if (assign_type == VARIABLE) { |
| 4409 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4411 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
| 4410 AccumulatorValueContext context(this); | 4412 AccumulatorValueContext context(this); |
| 4411 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4413 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
| 4412 } else { | 4414 } else { |
| 4413 // Reserve space for result of postfix operation. | 4415 // Reserve space for result of postfix operation. |
| 4414 if (expr->is_postfix() && !context()->IsEffect()) { | 4416 if (expr->is_postfix() && !context()->IsEffect()) { |
| 4415 __ push(Immediate(Smi::FromInt(0))); | 4417 __ push(Immediate(Smi::FromInt(0))); |
| 4416 } | 4418 } |
| 4417 if (assign_type == NAMED_PROPERTY) { | 4419 if (assign_type == NAMED_PROPERTY) { |
|
arv (Not doing code reviews)
2014/10/07 15:05:38
maybe switch here?
Dmitry Lomov (no reviews)
2014/10/07 15:53:37
Done.
| |
| 4418 // Put the object both on the stack and in the register. | 4420 // Put the object both on the stack and in the register. |
| 4419 VisitForStackValue(prop->obj()); | 4421 VisitForStackValue(prop->obj()); |
| 4420 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 4422 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 4421 EmitNamedPropertyLoad(prop); | 4423 EmitNamedPropertyLoad(prop); |
| 4422 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4424 } else if (assign_type == NAMED_SUPER_PROPERTY) { |
| 4423 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4425 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4424 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4426 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4425 __ push(result_register()); | 4427 __ push(result_register()); |
| 4426 __ push(MemOperand(esp, kPointerSize)); | 4428 __ push(MemOperand(esp, kPointerSize)); |
| 4427 __ push(result_register()); | 4429 __ push(result_register()); |
| 4428 EmitNamedSuperPropertyLoad(prop); | 4430 EmitNamedSuperPropertyLoad(prop); |
| 4431 } else if (assign_type == KEYED_SUPER_PROPERTY) { | |
| 4432 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | |
| 4433 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | |
| 4434 __ push(result_register()); | |
| 4435 VisitForAccumulatorValue(prop->key()); | |
| 4436 __ push(result_register()); | |
| 4437 __ push(MemOperand(esp, 2 * kPointerSize)); | |
| 4438 __ push(MemOperand(esp, 2 * kPointerSize)); | |
| 4439 __ push(result_register()); | |
| 4440 EmitKeyedSuperPropertyLoad(prop); | |
| 4429 } else { | 4441 } else { |
| 4430 VisitForStackValue(prop->obj()); | 4442 VisitForStackValue(prop->obj()); |
| 4431 VisitForStackValue(prop->key()); | 4443 VisitForStackValue(prop->key()); |
| 4432 __ mov(LoadDescriptor::ReceiverRegister(), | 4444 __ mov(LoadDescriptor::ReceiverRegister(), |
| 4433 Operand(esp, kPointerSize)); // Object. | 4445 Operand(esp, kPointerSize)); // Object. |
| 4434 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key. | 4446 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key. |
| 4435 EmitKeyedPropertyLoad(prop); | 4447 EmitKeyedPropertyLoad(prop); |
| 4436 } | 4448 } |
| 4437 } | 4449 } |
| 4438 | 4450 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 4463 break; | 4475 break; |
| 4464 case NAMED_PROPERTY: | 4476 case NAMED_PROPERTY: |
| 4465 __ mov(Operand(esp, kPointerSize), eax); | 4477 __ mov(Operand(esp, kPointerSize), eax); |
| 4466 break; | 4478 break; |
| 4467 case NAMED_SUPER_PROPERTY: | 4479 case NAMED_SUPER_PROPERTY: |
| 4468 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4480 __ mov(Operand(esp, 2 * kPointerSize), eax); |
| 4469 break; | 4481 break; |
| 4470 case KEYED_PROPERTY: | 4482 case KEYED_PROPERTY: |
| 4471 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4483 __ mov(Operand(esp, 2 * kPointerSize), eax); |
| 4472 break; | 4484 break; |
| 4485 case KEYED_SUPER_PROPERTY: | |
| 4486 __ mov(Operand(esp, 3 * kPointerSize), eax); | |
| 4487 break; | |
| 4473 } | 4488 } |
| 4474 } | 4489 } |
| 4475 } | 4490 } |
| 4476 | 4491 |
| 4477 if (expr->op() == Token::INC) { | 4492 if (expr->op() == Token::INC) { |
| 4478 __ add(eax, Immediate(Smi::FromInt(1))); | 4493 __ add(eax, Immediate(Smi::FromInt(1))); |
| 4479 } else { | 4494 } else { |
| 4480 __ sub(eax, Immediate(Smi::FromInt(1))); | 4495 __ sub(eax, Immediate(Smi::FromInt(1))); |
| 4481 } | 4496 } |
| 4482 __ j(no_overflow, &done, Label::kNear); | 4497 __ j(no_overflow, &done, Label::kNear); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 4504 break; | 4519 break; |
| 4505 case NAMED_PROPERTY: | 4520 case NAMED_PROPERTY: |
| 4506 __ mov(Operand(esp, kPointerSize), eax); | 4521 __ mov(Operand(esp, kPointerSize), eax); |
| 4507 break; | 4522 break; |
| 4508 case NAMED_SUPER_PROPERTY: | 4523 case NAMED_SUPER_PROPERTY: |
| 4509 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4524 __ mov(Operand(esp, 2 * kPointerSize), eax); |
| 4510 break; | 4525 break; |
| 4511 case KEYED_PROPERTY: | 4526 case KEYED_PROPERTY: |
| 4512 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4527 __ mov(Operand(esp, 2 * kPointerSize), eax); |
| 4513 break; | 4528 break; |
| 4529 case KEYED_SUPER_PROPERTY: | |
| 4530 __ mov(Operand(esp, 3 * kPointerSize), eax); | |
| 4531 break; | |
| 4514 } | 4532 } |
| 4515 } | 4533 } |
| 4516 } | 4534 } |
| 4517 | 4535 |
| 4518 // Record position before stub call. | 4536 // Record position before stub call. |
| 4519 SetSourcePosition(expr->position()); | 4537 SetSourcePosition(expr->position()); |
| 4520 | 4538 |
| 4521 // Call stub for +1/-1. | 4539 // Call stub for +1/-1. |
| 4522 __ bind(&stub_call); | 4540 __ bind(&stub_call); |
| 4523 __ mov(edx, eax); | 4541 __ mov(edx, eax); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4571 EmitNamedSuperPropertyStore(prop); | 4589 EmitNamedSuperPropertyStore(prop); |
| 4572 if (expr->is_postfix()) { | 4590 if (expr->is_postfix()) { |
| 4573 if (!context()->IsEffect()) { | 4591 if (!context()->IsEffect()) { |
| 4574 context()->PlugTOS(); | 4592 context()->PlugTOS(); |
| 4575 } | 4593 } |
| 4576 } else { | 4594 } else { |
| 4577 context()->Plug(eax); | 4595 context()->Plug(eax); |
| 4578 } | 4596 } |
| 4579 break; | 4597 break; |
| 4580 } | 4598 } |
| 4599 case KEYED_SUPER_PROPERTY: { | |
| 4600 EmitKeyedSuperPropertyStore(prop); | |
| 4601 if (expr->is_postfix()) { | |
| 4602 if (!context()->IsEffect()) { | |
| 4603 context()->PlugTOS(); | |
| 4604 } | |
| 4605 } else { | |
| 4606 context()->Plug(eax); | |
| 4607 } | |
| 4608 break; | |
| 4609 } | |
| 4581 case KEYED_PROPERTY: { | 4610 case KEYED_PROPERTY: { |
| 4582 __ pop(StoreDescriptor::NameRegister()); | 4611 __ pop(StoreDescriptor::NameRegister()); |
| 4583 __ pop(StoreDescriptor::ReceiverRegister()); | 4612 __ pop(StoreDescriptor::ReceiverRegister()); |
| 4584 Handle<Code> ic = | 4613 Handle<Code> ic = |
| 4585 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4614 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
| 4586 CallIC(ic, expr->CountStoreFeedbackId()); | 4615 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4587 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4616 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4588 if (expr->is_postfix()) { | 4617 if (expr->is_postfix()) { |
| 4589 // Result is on the stack | 4618 // Result is on the stack |
| 4590 if (!context()->IsEffect()) { | 4619 if (!context()->IsEffect()) { |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5032 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5061 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
| 5033 Assembler::target_address_at(call_target_address, | 5062 Assembler::target_address_at(call_target_address, |
| 5034 unoptimized_code)); | 5063 unoptimized_code)); |
| 5035 return OSR_AFTER_STACK_CHECK; | 5064 return OSR_AFTER_STACK_CHECK; |
| 5036 } | 5065 } |
| 5037 | 5066 |
| 5038 | 5067 |
| 5039 } } // namespace v8::internal | 5068 } } // namespace v8::internal |
| 5040 | 5069 |
| 5041 #endif // V8_TARGET_ARCH_IA32 | 5070 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |