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_X87 | 7 #if V8_TARGET_ARCH_X87 |
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 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1800 context()->Plug(eax); | 1800 context()->Plug(eax); |
1801 } | 1801 } |
1802 } | 1802 } |
1803 | 1803 |
1804 | 1804 |
1805 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1805 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1806 DCHECK(expr->target()->IsValidReferenceExpression()); | 1806 DCHECK(expr->target()->IsValidReferenceExpression()); |
1807 | 1807 |
1808 Comment cmnt(masm_, "[ Assignment"); | 1808 Comment cmnt(masm_, "[ Assignment"); |
1809 | 1809 |
1810 // Left-hand side can only be a property, a global or a (parameter or local) | |
1811 // slot. | |
1812 enum LhsKind { | |
1813 VARIABLE, | |
1814 NAMED_PROPERTY, | |
1815 KEYED_PROPERTY, | |
1816 NAMED_SUPER_PROPERTY | |
1817 }; | |
1818 LhsKind assign_type = VARIABLE; | |
1819 Property* property = expr->target()->AsProperty(); | 1810 Property* property = expr->target()->AsProperty(); |
1820 if (property != NULL) { | 1811 LhsKind assign_type = GetAssignType(property); |
1821 assign_type = (property->key()->IsPropertyName()) | |
1822 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
1823 : NAMED_PROPERTY) | |
1824 : KEYED_PROPERTY; | |
1825 } | |
1826 | 1812 |
1827 // Evaluate LHS expression. | 1813 // Evaluate LHS expression. |
1828 switch (assign_type) { | 1814 switch (assign_type) { |
1829 case VARIABLE: | 1815 case VARIABLE: |
1830 // Nothing to do here. | 1816 // Nothing to do here. |
1831 break; | 1817 break; |
1832 case NAMED_SUPER_PROPERTY: | 1818 case NAMED_SUPER_PROPERTY: |
1833 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1819 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1834 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1820 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
1835 __ push(result_register()); | 1821 __ push(result_register()); |
1836 if (expr->is_compound()) { | 1822 if (expr->is_compound()) { |
1837 __ push(MemOperand(esp, kPointerSize)); | 1823 __ push(MemOperand(esp, kPointerSize)); |
1838 __ push(result_register()); | 1824 __ push(result_register()); |
1839 } | 1825 } |
1840 break; | 1826 break; |
1841 case NAMED_PROPERTY: | 1827 case NAMED_PROPERTY: |
1842 if (expr->is_compound()) { | 1828 if (expr->is_compound()) { |
1843 // We need the receiver both on the stack and in the register. | 1829 // We need the receiver both on the stack and in the register. |
1844 VisitForStackValue(property->obj()); | 1830 VisitForStackValue(property->obj()); |
1845 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1831 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
1846 } else { | 1832 } else { |
1847 VisitForStackValue(property->obj()); | 1833 VisitForStackValue(property->obj()); |
1848 } | 1834 } |
1849 break; | 1835 break; |
| 1836 case KEYED_SUPER_PROPERTY: |
| 1837 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1838 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1839 __ Push(result_register()); |
| 1840 VisitForAccumulatorValue(property->key()); |
| 1841 __ Push(result_register()); |
| 1842 if (expr->is_compound()) { |
| 1843 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 1844 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 1845 __ push(result_register()); |
| 1846 } |
| 1847 break; |
1850 case KEYED_PROPERTY: { | 1848 case KEYED_PROPERTY: { |
1851 if (expr->is_compound()) { | 1849 if (expr->is_compound()) { |
1852 VisitForStackValue(property->obj()); | 1850 VisitForStackValue(property->obj()); |
1853 VisitForStackValue(property->key()); | 1851 VisitForStackValue(property->key()); |
1854 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); | 1852 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); |
1855 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); | 1853 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); |
1856 } else { | 1854 } else { |
1857 VisitForStackValue(property->obj()); | 1855 VisitForStackValue(property->obj()); |
1858 VisitForStackValue(property->key()); | 1856 VisitForStackValue(property->key()); |
1859 } | 1857 } |
(...skipping 12 matching lines...) Expand all Loading... |
1872 PrepareForBailout(expr->target(), TOS_REG); | 1870 PrepareForBailout(expr->target(), TOS_REG); |
1873 break; | 1871 break; |
1874 case NAMED_SUPER_PROPERTY: | 1872 case NAMED_SUPER_PROPERTY: |
1875 EmitNamedSuperPropertyLoad(property); | 1873 EmitNamedSuperPropertyLoad(property); |
1876 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1874 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1877 break; | 1875 break; |
1878 case NAMED_PROPERTY: | 1876 case NAMED_PROPERTY: |
1879 EmitNamedPropertyLoad(property); | 1877 EmitNamedPropertyLoad(property); |
1880 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1878 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1881 break; | 1879 break; |
| 1880 case KEYED_SUPER_PROPERTY: |
| 1881 EmitKeyedSuperPropertyLoad(property); |
| 1882 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1883 break; |
1882 case KEYED_PROPERTY: | 1884 case KEYED_PROPERTY: |
1883 EmitKeyedPropertyLoad(property); | 1885 EmitKeyedPropertyLoad(property); |
1884 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1886 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1885 break; | 1887 break; |
1886 } | 1888 } |
1887 } | 1889 } |
1888 | 1890 |
1889 Token::Value op = expr->binary_op(); | 1891 Token::Value op = expr->binary_op(); |
1890 __ push(eax); // Left operand goes on the stack. | 1892 __ push(eax); // Left operand goes on the stack. |
1891 VisitForAccumulatorValue(expr->value()); | 1893 VisitForAccumulatorValue(expr->value()); |
(...skipping 27 matching lines...) Expand all Loading... |
1919 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 1921 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), |
1920 expr->op()); | 1922 expr->op()); |
1921 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1923 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
1922 context()->Plug(eax); | 1924 context()->Plug(eax); |
1923 break; | 1925 break; |
1924 case NAMED_PROPERTY: | 1926 case NAMED_PROPERTY: |
1925 EmitNamedPropertyAssignment(expr); | 1927 EmitNamedPropertyAssignment(expr); |
1926 break; | 1928 break; |
1927 case NAMED_SUPER_PROPERTY: | 1929 case NAMED_SUPER_PROPERTY: |
1928 EmitNamedSuperPropertyStore(property); | 1930 EmitNamedSuperPropertyStore(property); |
1929 context()->Plug(eax); | 1931 context()->Plug(result_register()); |
| 1932 break; |
| 1933 case KEYED_SUPER_PROPERTY: |
| 1934 EmitKeyedSuperPropertyStore(property); |
| 1935 context()->Plug(result_register()); |
1930 break; | 1936 break; |
1931 case KEYED_PROPERTY: | 1937 case KEYED_PROPERTY: |
1932 EmitKeyedPropertyAssignment(expr); | 1938 EmitKeyedPropertyAssignment(expr); |
1933 break; | 1939 break; |
1934 } | 1940 } |
1935 } | 1941 } |
1936 | 1942 |
1937 | 1943 |
1938 void FullCodeGenerator::VisitYield(Yield* expr) { | 1944 void FullCodeGenerator::VisitYield(Yield* expr) { |
1939 Comment cmnt(masm_, "[ Yield"); | 1945 Comment cmnt(masm_, "[ Yield"); |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2554 | 2560 |
2555 | 2561 |
2556 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2562 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
2557 // Assignment to named property of super. | 2563 // Assignment to named property of super. |
2558 // eax : value | 2564 // eax : value |
2559 // stack : receiver ('this'), home_object | 2565 // stack : receiver ('this'), home_object |
2560 DCHECK(prop != NULL); | 2566 DCHECK(prop != NULL); |
2561 Literal* key = prop->key()->AsLiteral(); | 2567 Literal* key = prop->key()->AsLiteral(); |
2562 DCHECK(key != NULL); | 2568 DCHECK(key != NULL); |
2563 | 2569 |
| 2570 __ push(Immediate(key->value())); |
2564 __ push(eax); | 2571 __ push(eax); |
2565 __ push(Immediate(key->value())); | |
2566 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2572 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
2567 : Runtime::kStoreToSuper_Sloppy), | 2573 : Runtime::kStoreToSuper_Sloppy), |
2568 4); | 2574 4); |
2569 } | 2575 } |
2570 | 2576 |
2571 | 2577 |
| 2578 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2579 // Assignment to named property of super. |
| 2580 // eax : value |
| 2581 // stack : receiver ('this'), home_object, key |
| 2582 |
| 2583 __ push(eax); |
| 2584 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict |
| 2585 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2586 4); |
| 2587 } |
| 2588 |
| 2589 |
2572 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2590 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2573 // Assignment to a property, using a keyed store IC. | 2591 // Assignment to a property, using a keyed store IC. |
2574 // eax : value | 2592 // eax : value |
2575 // esp[0] : key | 2593 // esp[0] : key |
2576 // esp[kPointerSize] : receiver | 2594 // esp[kPointerSize] : receiver |
2577 | 2595 |
2578 __ pop(StoreDescriptor::NameRegister()); // Key. | 2596 __ pop(StoreDescriptor::NameRegister()); // Key. |
2579 __ pop(StoreDescriptor::ReceiverRegister()); | 2597 __ pop(StoreDescriptor::ReceiverRegister()); |
2580 DCHECK(StoreDescriptor::ValueRegister().is(eax)); | 2598 DCHECK(StoreDescriptor::ValueRegister().is(eax)); |
2581 // Record source code position before IC call. | 2599 // Record source code position before IC call. |
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4370 } | 4388 } |
4371 } | 4389 } |
4372 | 4390 |
4373 | 4391 |
4374 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4392 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
4375 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4393 DCHECK(expr->expression()->IsValidReferenceExpression()); |
4376 | 4394 |
4377 Comment cmnt(masm_, "[ CountOperation"); | 4395 Comment cmnt(masm_, "[ CountOperation"); |
4378 SetSourcePosition(expr->position()); | 4396 SetSourcePosition(expr->position()); |
4379 | 4397 |
4380 // Expression can only be a property, a global or a (parameter or local) | |
4381 // slot. | |
4382 enum LhsKind { | |
4383 VARIABLE, | |
4384 NAMED_PROPERTY, | |
4385 KEYED_PROPERTY, | |
4386 NAMED_SUPER_PROPERTY | |
4387 }; | |
4388 LhsKind assign_type = VARIABLE; | |
4389 Property* prop = expr->expression()->AsProperty(); | 4398 Property* prop = expr->expression()->AsProperty(); |
4390 // In case of a property we use the uninitialized expression context | 4399 LhsKind assign_type = GetAssignType(prop); |
4391 // of the key to detect a named property. | |
4392 if (prop != NULL) { | |
4393 assign_type = | |
4394 (prop->key()->IsPropertyName()) | |
4395 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
4396 : KEYED_PROPERTY; | |
4397 } | |
4398 | 4400 |
4399 // Evaluate expression and get value. | 4401 // Evaluate expression and get value. |
4400 if (assign_type == VARIABLE) { | 4402 if (assign_type == VARIABLE) { |
4401 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4403 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
4402 AccumulatorValueContext context(this); | 4404 AccumulatorValueContext context(this); |
4403 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4405 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
4404 } else { | 4406 } else { |
4405 // Reserve space for result of postfix operation. | 4407 // Reserve space for result of postfix operation. |
4406 if (expr->is_postfix() && !context()->IsEffect()) { | 4408 if (expr->is_postfix() && !context()->IsEffect()) { |
4407 __ push(Immediate(Smi::FromInt(0))); | 4409 __ push(Immediate(Smi::FromInt(0))); |
4408 } | 4410 } |
4409 if (assign_type == NAMED_PROPERTY) { | 4411 switch (assign_type) { |
4410 // Put the object both on the stack and in the register. | 4412 case NAMED_PROPERTY: { |
4411 VisitForStackValue(prop->obj()); | 4413 // Put the object both on the stack and in the register. |
4412 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 4414 VisitForStackValue(prop->obj()); |
4413 EmitNamedPropertyLoad(prop); | 4415 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
4414 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4416 EmitNamedPropertyLoad(prop); |
4415 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4417 break; |
4416 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4418 } |
4417 __ push(result_register()); | 4419 |
4418 __ push(MemOperand(esp, kPointerSize)); | 4420 case NAMED_SUPER_PROPERTY: { |
4419 __ push(result_register()); | 4421 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4420 EmitNamedSuperPropertyLoad(prop); | 4422 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
4421 } else { | 4423 __ push(result_register()); |
4422 VisitForStackValue(prop->obj()); | 4424 __ push(MemOperand(esp, kPointerSize)); |
4423 VisitForStackValue(prop->key()); | 4425 __ push(result_register()); |
4424 __ mov(LoadDescriptor::ReceiverRegister(), | 4426 EmitNamedSuperPropertyLoad(prop); |
4425 Operand(esp, kPointerSize)); // Object. | 4427 break; |
4426 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key. | 4428 } |
4427 EmitKeyedPropertyLoad(prop); | 4429 |
| 4430 case KEYED_SUPER_PROPERTY: { |
| 4431 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4432 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4433 __ push(result_register()); |
| 4434 VisitForAccumulatorValue(prop->key()); |
| 4435 __ push(result_register()); |
| 4436 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 4437 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 4438 __ push(result_register()); |
| 4439 EmitKeyedSuperPropertyLoad(prop); |
| 4440 break; |
| 4441 } |
| 4442 |
| 4443 case KEYED_PROPERTY: { |
| 4444 VisitForStackValue(prop->obj()); |
| 4445 VisitForStackValue(prop->key()); |
| 4446 __ mov(LoadDescriptor::ReceiverRegister(), |
| 4447 Operand(esp, kPointerSize)); // Object. |
| 4448 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key. |
| 4449 EmitKeyedPropertyLoad(prop); |
| 4450 break; |
| 4451 } |
| 4452 |
| 4453 case VARIABLE: |
| 4454 UNREACHABLE(); |
4428 } | 4455 } |
4429 } | 4456 } |
4430 | 4457 |
4431 // We need a second deoptimization point after loading the value | 4458 // We need a second deoptimization point after loading the value |
4432 // in case evaluating the property load my have a side effect. | 4459 // in case evaluating the property load my have a side effect. |
4433 if (assign_type == VARIABLE) { | 4460 if (assign_type == VARIABLE) { |
4434 PrepareForBailout(expr->expression(), TOS_REG); | 4461 PrepareForBailout(expr->expression(), TOS_REG); |
4435 } else { | 4462 } else { |
4436 PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4463 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
4437 } | 4464 } |
(...skipping 17 matching lines...) Expand all Loading... |
4455 break; | 4482 break; |
4456 case NAMED_PROPERTY: | 4483 case NAMED_PROPERTY: |
4457 __ mov(Operand(esp, kPointerSize), eax); | 4484 __ mov(Operand(esp, kPointerSize), eax); |
4458 break; | 4485 break; |
4459 case NAMED_SUPER_PROPERTY: | 4486 case NAMED_SUPER_PROPERTY: |
4460 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4487 __ mov(Operand(esp, 2 * kPointerSize), eax); |
4461 break; | 4488 break; |
4462 case KEYED_PROPERTY: | 4489 case KEYED_PROPERTY: |
4463 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4490 __ mov(Operand(esp, 2 * kPointerSize), eax); |
4464 break; | 4491 break; |
| 4492 case KEYED_SUPER_PROPERTY: |
| 4493 __ mov(Operand(esp, 3 * kPointerSize), eax); |
| 4494 break; |
4465 } | 4495 } |
4466 } | 4496 } |
4467 } | 4497 } |
4468 | 4498 |
4469 if (expr->op() == Token::INC) { | 4499 if (expr->op() == Token::INC) { |
4470 __ add(eax, Immediate(Smi::FromInt(1))); | 4500 __ add(eax, Immediate(Smi::FromInt(1))); |
4471 } else { | 4501 } else { |
4472 __ sub(eax, Immediate(Smi::FromInt(1))); | 4502 __ sub(eax, Immediate(Smi::FromInt(1))); |
4473 } | 4503 } |
4474 __ j(no_overflow, &done, Label::kNear); | 4504 __ j(no_overflow, &done, Label::kNear); |
(...skipping 21 matching lines...) Expand all Loading... |
4496 break; | 4526 break; |
4497 case NAMED_PROPERTY: | 4527 case NAMED_PROPERTY: |
4498 __ mov(Operand(esp, kPointerSize), eax); | 4528 __ mov(Operand(esp, kPointerSize), eax); |
4499 break; | 4529 break; |
4500 case NAMED_SUPER_PROPERTY: | 4530 case NAMED_SUPER_PROPERTY: |
4501 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4531 __ mov(Operand(esp, 2 * kPointerSize), eax); |
4502 break; | 4532 break; |
4503 case KEYED_PROPERTY: | 4533 case KEYED_PROPERTY: |
4504 __ mov(Operand(esp, 2 * kPointerSize), eax); | 4534 __ mov(Operand(esp, 2 * kPointerSize), eax); |
4505 break; | 4535 break; |
| 4536 case KEYED_SUPER_PROPERTY: |
| 4537 __ mov(Operand(esp, 3 * kPointerSize), eax); |
| 4538 break; |
4506 } | 4539 } |
4507 } | 4540 } |
4508 } | 4541 } |
4509 | 4542 |
4510 // Record position before stub call. | 4543 // Record position before stub call. |
4511 SetSourcePosition(expr->position()); | 4544 SetSourcePosition(expr->position()); |
4512 | 4545 |
4513 // Call stub for +1/-1. | 4546 // Call stub for +1/-1. |
4514 __ bind(&stub_call); | 4547 __ bind(&stub_call); |
4515 __ mov(edx, eax); | 4548 __ mov(edx, eax); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4563 EmitNamedSuperPropertyStore(prop); | 4596 EmitNamedSuperPropertyStore(prop); |
4564 if (expr->is_postfix()) { | 4597 if (expr->is_postfix()) { |
4565 if (!context()->IsEffect()) { | 4598 if (!context()->IsEffect()) { |
4566 context()->PlugTOS(); | 4599 context()->PlugTOS(); |
4567 } | 4600 } |
4568 } else { | 4601 } else { |
4569 context()->Plug(eax); | 4602 context()->Plug(eax); |
4570 } | 4603 } |
4571 break; | 4604 break; |
4572 } | 4605 } |
| 4606 case KEYED_SUPER_PROPERTY: { |
| 4607 EmitKeyedSuperPropertyStore(prop); |
| 4608 if (expr->is_postfix()) { |
| 4609 if (!context()->IsEffect()) { |
| 4610 context()->PlugTOS(); |
| 4611 } |
| 4612 } else { |
| 4613 context()->Plug(eax); |
| 4614 } |
| 4615 break; |
| 4616 } |
4573 case KEYED_PROPERTY: { | 4617 case KEYED_PROPERTY: { |
4574 __ pop(StoreDescriptor::NameRegister()); | 4618 __ pop(StoreDescriptor::NameRegister()); |
4575 __ pop(StoreDescriptor::ReceiverRegister()); | 4619 __ pop(StoreDescriptor::ReceiverRegister()); |
4576 Handle<Code> ic = | 4620 Handle<Code> ic = |
4577 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4621 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
4578 CallIC(ic, expr->CountStoreFeedbackId()); | 4622 CallIC(ic, expr->CountStoreFeedbackId()); |
4579 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4623 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4580 if (expr->is_postfix()) { | 4624 if (expr->is_postfix()) { |
4581 // Result is on the stack | 4625 // Result is on the stack |
4582 if (!context()->IsEffect()) { | 4626 if (!context()->IsEffect()) { |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5024 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5068 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
5025 Assembler::target_address_at(call_target_address, | 5069 Assembler::target_address_at(call_target_address, |
5026 unoptimized_code)); | 5070 unoptimized_code)); |
5027 return OSR_AFTER_STACK_CHECK; | 5071 return OSR_AFTER_STACK_CHECK; |
5028 } | 5072 } |
5029 | 5073 |
5030 | 5074 |
5031 } } // namespace v8::internal | 5075 } } // namespace v8::internal |
5032 | 5076 |
5033 #endif // V8_TARGET_ARCH_X87 | 5077 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |