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_ARM | 7 #if V8_TARGET_ARCH_ARM |
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 1865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1876 context()->Plug(r0); | 1876 context()->Plug(r0); |
1877 } | 1877 } |
1878 } | 1878 } |
1879 | 1879 |
1880 | 1880 |
1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1882 DCHECK(expr->target()->IsValidReferenceExpression()); | 1882 DCHECK(expr->target()->IsValidReferenceExpression()); |
1883 | 1883 |
1884 Comment cmnt(masm_, "[ Assignment"); | 1884 Comment cmnt(masm_, "[ Assignment"); |
1885 | 1885 |
1886 // Left-hand side can only be a property, a global or a (parameter or local) | |
1887 // slot. | |
1888 enum LhsKind { | |
1889 VARIABLE, | |
1890 NAMED_PROPERTY, | |
1891 KEYED_PROPERTY, | |
1892 NAMED_SUPER_PROPERTY | |
1893 }; | |
1894 LhsKind assign_type = VARIABLE; | |
1895 Property* property = expr->target()->AsProperty(); | 1886 Property* property = expr->target()->AsProperty(); |
1896 if (property != NULL) { | 1887 LhsKind assign_type = GetAssignType(property); |
1897 assign_type = (property->key()->IsPropertyName()) | |
1898 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
1899 : NAMED_PROPERTY) | |
1900 : KEYED_PROPERTY; | |
1901 } | |
1902 | 1888 |
1903 // Evaluate LHS expression. | 1889 // Evaluate LHS expression. |
1904 switch (assign_type) { | 1890 switch (assign_type) { |
1905 case VARIABLE: | 1891 case VARIABLE: |
1906 // Nothing to do here. | 1892 // Nothing to do here. |
1907 break; | 1893 break; |
1908 case NAMED_PROPERTY: | 1894 case NAMED_PROPERTY: |
1909 if (expr->is_compound()) { | 1895 if (expr->is_compound()) { |
1910 // We need the receiver both on the stack and in the register. | 1896 // We need the receiver both on the stack and in the register. |
1911 VisitForStackValue(property->obj()); | 1897 VisitForStackValue(property->obj()); |
1912 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1898 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
1913 } else { | 1899 } else { |
1914 VisitForStackValue(property->obj()); | 1900 VisitForStackValue(property->obj()); |
1915 } | 1901 } |
1916 break; | 1902 break; |
1917 case NAMED_SUPER_PROPERTY: | 1903 case NAMED_SUPER_PROPERTY: |
1918 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1904 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1919 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1905 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
1920 __ Push(result_register()); | 1906 __ Push(result_register()); |
1921 if (expr->is_compound()) { | 1907 if (expr->is_compound()) { |
1922 const Register scratch = r1; | 1908 const Register scratch = r1; |
1923 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 1909 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
1924 __ Push(scratch); | 1910 __ Push(scratch); |
1925 __ Push(result_register()); | 1911 __ Push(result_register()); |
1926 } | 1912 } |
1927 break; | 1913 break; |
| 1914 case KEYED_SUPER_PROPERTY: |
| 1915 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1916 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1917 __ Push(result_register()); |
| 1918 VisitForAccumulatorValue(property->key()); |
| 1919 __ Push(result_register()); |
| 1920 if (expr->is_compound()) { |
| 1921 const Register scratch = r1; |
| 1922 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1923 __ Push(scratch); |
| 1924 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1925 __ Push(scratch); |
| 1926 __ Push(result_register()); |
| 1927 } |
| 1928 break; |
1928 case KEYED_PROPERTY: | 1929 case KEYED_PROPERTY: |
1929 if (expr->is_compound()) { | 1930 if (expr->is_compound()) { |
1930 VisitForStackValue(property->obj()); | 1931 VisitForStackValue(property->obj()); |
1931 VisitForStackValue(property->key()); | 1932 VisitForStackValue(property->key()); |
1932 __ ldr(LoadDescriptor::ReceiverRegister(), | 1933 __ ldr(LoadDescriptor::ReceiverRegister(), |
1933 MemOperand(sp, 1 * kPointerSize)); | 1934 MemOperand(sp, 1 * kPointerSize)); |
1934 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 1935 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
1935 } else { | 1936 } else { |
1936 VisitForStackValue(property->obj()); | 1937 VisitForStackValue(property->obj()); |
1937 VisitForStackValue(property->key()); | 1938 VisitForStackValue(property->key()); |
(...skipping 11 matching lines...) Expand all Loading... |
1949 PrepareForBailout(expr->target(), TOS_REG); | 1950 PrepareForBailout(expr->target(), TOS_REG); |
1950 break; | 1951 break; |
1951 case NAMED_PROPERTY: | 1952 case NAMED_PROPERTY: |
1952 EmitNamedPropertyLoad(property); | 1953 EmitNamedPropertyLoad(property); |
1953 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1954 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1954 break; | 1955 break; |
1955 case NAMED_SUPER_PROPERTY: | 1956 case NAMED_SUPER_PROPERTY: |
1956 EmitNamedSuperPropertyLoad(property); | 1957 EmitNamedSuperPropertyLoad(property); |
1957 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1958 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1958 break; | 1959 break; |
| 1960 case KEYED_SUPER_PROPERTY: |
| 1961 EmitKeyedSuperPropertyLoad(property); |
| 1962 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1963 break; |
1959 case KEYED_PROPERTY: | 1964 case KEYED_PROPERTY: |
1960 EmitKeyedPropertyLoad(property); | 1965 EmitKeyedPropertyLoad(property); |
1961 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1966 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1962 break; | 1967 break; |
1963 } | 1968 } |
1964 } | 1969 } |
1965 | 1970 |
1966 Token::Value op = expr->binary_op(); | 1971 Token::Value op = expr->binary_op(); |
1967 __ push(r0); // Left operand goes on the stack. | 1972 __ push(r0); // Left operand goes on the stack. |
1968 VisitForAccumulatorValue(expr->value()); | 1973 VisitForAccumulatorValue(expr->value()); |
(...skipping 30 matching lines...) Expand all Loading... |
1999 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2004 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2000 context()->Plug(r0); | 2005 context()->Plug(r0); |
2001 break; | 2006 break; |
2002 case NAMED_PROPERTY: | 2007 case NAMED_PROPERTY: |
2003 EmitNamedPropertyAssignment(expr); | 2008 EmitNamedPropertyAssignment(expr); |
2004 break; | 2009 break; |
2005 case NAMED_SUPER_PROPERTY: | 2010 case NAMED_SUPER_PROPERTY: |
2006 EmitNamedSuperPropertyStore(property); | 2011 EmitNamedSuperPropertyStore(property); |
2007 context()->Plug(r0); | 2012 context()->Plug(r0); |
2008 break; | 2013 break; |
| 2014 case KEYED_SUPER_PROPERTY: |
| 2015 EmitKeyedSuperPropertyStore(property); |
| 2016 context()->Plug(r0); |
| 2017 break; |
2009 case KEYED_PROPERTY: | 2018 case KEYED_PROPERTY: |
2010 EmitKeyedPropertyAssignment(expr); | 2019 EmitKeyedPropertyAssignment(expr); |
2011 break; | 2020 break; |
2012 } | 2021 } |
2013 } | 2022 } |
2014 | 2023 |
2015 | 2024 |
2016 void FullCodeGenerator::VisitYield(Yield* expr) { | 2025 void FullCodeGenerator::VisitYield(Yield* expr) { |
2017 Comment cmnt(masm_, "[ Yield"); | 2026 Comment cmnt(masm_, "[ Yield"); |
2018 // Evaluate yielded value first; the initial iterator definition depends on | 2027 // Evaluate yielded value first; the initial iterator definition depends on |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2644 | 2653 |
2645 | 2654 |
2646 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2655 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
2647 // Assignment to named property of super. | 2656 // Assignment to named property of super. |
2648 // r0 : value | 2657 // r0 : value |
2649 // stack : receiver ('this'), home_object | 2658 // stack : receiver ('this'), home_object |
2650 DCHECK(prop != NULL); | 2659 DCHECK(prop != NULL); |
2651 Literal* key = prop->key()->AsLiteral(); | 2660 Literal* key = prop->key()->AsLiteral(); |
2652 DCHECK(key != NULL); | 2661 DCHECK(key != NULL); |
2653 | 2662 |
| 2663 __ Push(key->value()); |
2654 __ Push(r0); | 2664 __ Push(r0); |
2655 __ Push(key->value()); | |
2656 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2665 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
2657 : Runtime::kStoreToSuper_Sloppy), | 2666 : Runtime::kStoreToSuper_Sloppy), |
2658 4); | 2667 4); |
2659 } | 2668 } |
2660 | 2669 |
2661 | 2670 |
| 2671 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2672 // Assignment to named property of super. |
| 2673 // r0 : value |
| 2674 // stack : receiver ('this'), home_object, key |
| 2675 DCHECK(prop != NULL); |
| 2676 |
| 2677 __ Push(r0); |
| 2678 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict |
| 2679 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2680 4); |
| 2681 } |
| 2682 |
| 2683 |
2662 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2684 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2663 // Assignment to a property, using a keyed store IC. | 2685 // Assignment to a property, using a keyed store IC. |
2664 | 2686 |
2665 // Record source code position before IC call. | 2687 // Record source code position before IC call. |
2666 SetSourcePosition(expr->position()); | 2688 SetSourcePosition(expr->position()); |
2667 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); | 2689 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); |
2668 DCHECK(StoreDescriptor::ValueRegister().is(r0)); | 2690 DCHECK(StoreDescriptor::ValueRegister().is(r0)); |
2669 | 2691 |
2670 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2692 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
2671 CallIC(ic, expr->AssignmentFeedbackId()); | 2693 CallIC(ic, expr->AssignmentFeedbackId()); |
(...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4423 } | 4445 } |
4424 } | 4446 } |
4425 | 4447 |
4426 | 4448 |
4427 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4449 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
4428 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4450 DCHECK(expr->expression()->IsValidReferenceExpression()); |
4429 | 4451 |
4430 Comment cmnt(masm_, "[ CountOperation"); | 4452 Comment cmnt(masm_, "[ CountOperation"); |
4431 SetSourcePosition(expr->position()); | 4453 SetSourcePosition(expr->position()); |
4432 | 4454 |
4433 // Expression can only be a property, a global or a (parameter or local) | |
4434 // slot. | |
4435 enum LhsKind { | |
4436 VARIABLE, | |
4437 NAMED_PROPERTY, | |
4438 KEYED_PROPERTY, | |
4439 NAMED_SUPER_PROPERTY | |
4440 }; | |
4441 LhsKind assign_type = VARIABLE; | |
4442 Property* prop = expr->expression()->AsProperty(); | 4455 Property* prop = expr->expression()->AsProperty(); |
4443 // In case of a property we use the uninitialized expression context | 4456 LhsKind assign_type = GetAssignType(prop); |
4444 // of the key to detect a named property. | |
4445 if (prop != NULL) { | |
4446 assign_type = | |
4447 (prop->key()->IsPropertyName()) | |
4448 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
4449 : KEYED_PROPERTY; | |
4450 } | |
4451 | 4457 |
4452 // Evaluate expression and get value. | 4458 // Evaluate expression and get value. |
4453 if (assign_type == VARIABLE) { | 4459 if (assign_type == VARIABLE) { |
4454 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4460 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
4455 AccumulatorValueContext context(this); | 4461 AccumulatorValueContext context(this); |
4456 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4462 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
4457 } else { | 4463 } else { |
4458 // Reserve space for result of postfix operation. | 4464 // Reserve space for result of postfix operation. |
4459 if (expr->is_postfix() && !context()->IsEffect()) { | 4465 if (expr->is_postfix() && !context()->IsEffect()) { |
4460 __ mov(ip, Operand(Smi::FromInt(0))); | 4466 __ mov(ip, Operand(Smi::FromInt(0))); |
4461 __ push(ip); | 4467 __ push(ip); |
4462 } | 4468 } |
4463 if (assign_type == NAMED_PROPERTY) { | 4469 switch (assign_type) { |
4464 // Put the object both on the stack and in the register. | 4470 case NAMED_PROPERTY: { |
4465 VisitForStackValue(prop->obj()); | 4471 // Put the object both on the stack and in the register. |
4466 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4472 VisitForStackValue(prop->obj()); |
4467 EmitNamedPropertyLoad(prop); | 4473 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
4468 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4474 EmitNamedPropertyLoad(prop); |
4469 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4475 break; |
4470 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4476 } |
4471 __ Push(result_register()); | 4477 |
4472 const Register scratch = r1; | 4478 case NAMED_SUPER_PROPERTY: { |
4473 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 4479 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4474 __ Push(scratch); | 4480 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
4475 __ Push(result_register()); | 4481 __ Push(result_register()); |
4476 EmitNamedSuperPropertyLoad(prop); | 4482 const Register scratch = r1; |
4477 } else { | 4483 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
4478 VisitForStackValue(prop->obj()); | 4484 __ Push(scratch); |
4479 VisitForStackValue(prop->key()); | 4485 __ Push(result_register()); |
4480 __ ldr(LoadDescriptor::ReceiverRegister(), | 4486 EmitNamedSuperPropertyLoad(prop); |
4481 MemOperand(sp, 1 * kPointerSize)); | 4487 break; |
4482 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 4488 } |
4483 EmitKeyedPropertyLoad(prop); | 4489 |
| 4490 case KEYED_SUPER_PROPERTY: { |
| 4491 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4492 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4493 __ Push(result_register()); |
| 4494 VisitForAccumulatorValue(prop->key()); |
| 4495 __ Push(result_register()); |
| 4496 const Register scratch = r1; |
| 4497 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4498 __ Push(scratch); |
| 4499 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4500 __ Push(scratch); |
| 4501 __ Push(result_register()); |
| 4502 EmitKeyedSuperPropertyLoad(prop); |
| 4503 break; |
| 4504 } |
| 4505 |
| 4506 case KEYED_PROPERTY: { |
| 4507 VisitForStackValue(prop->obj()); |
| 4508 VisitForStackValue(prop->key()); |
| 4509 __ ldr(LoadDescriptor::ReceiverRegister(), |
| 4510 MemOperand(sp, 1 * kPointerSize)); |
| 4511 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
| 4512 EmitKeyedPropertyLoad(prop); |
| 4513 break; |
| 4514 } |
| 4515 |
| 4516 case VARIABLE: |
| 4517 UNREACHABLE(); |
4484 } | 4518 } |
4485 } | 4519 } |
4486 | 4520 |
4487 // We need a second deoptimization point after loading the value | 4521 // We need a second deoptimization point after loading the value |
4488 // in case evaluating the property load my have a side effect. | 4522 // in case evaluating the property load my have a side effect. |
4489 if (assign_type == VARIABLE) { | 4523 if (assign_type == VARIABLE) { |
4490 PrepareForBailout(expr->expression(), TOS_REG); | 4524 PrepareForBailout(expr->expression(), TOS_REG); |
4491 } else { | 4525 } else { |
4492 PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4526 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
4493 } | 4527 } |
(...skipping 19 matching lines...) Expand all Loading... |
4513 break; | 4547 break; |
4514 case NAMED_PROPERTY: | 4548 case NAMED_PROPERTY: |
4515 __ str(r0, MemOperand(sp, kPointerSize)); | 4549 __ str(r0, MemOperand(sp, kPointerSize)); |
4516 break; | 4550 break; |
4517 case NAMED_SUPER_PROPERTY: | 4551 case NAMED_SUPER_PROPERTY: |
4518 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4552 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
4519 break; | 4553 break; |
4520 case KEYED_PROPERTY: | 4554 case KEYED_PROPERTY: |
4521 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4555 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
4522 break; | 4556 break; |
| 4557 case KEYED_SUPER_PROPERTY: |
| 4558 __ str(r0, MemOperand(sp, 3 * kPointerSize)); |
| 4559 break; |
4523 } | 4560 } |
4524 } | 4561 } |
4525 } | 4562 } |
4526 | 4563 |
4527 __ add(r0, r0, Operand(Smi::FromInt(count_value)), SetCC); | 4564 __ add(r0, r0, Operand(Smi::FromInt(count_value)), SetCC); |
4528 __ b(vc, &done); | 4565 __ b(vc, &done); |
4529 // Call stub. Undo operation first. | 4566 // Call stub. Undo operation first. |
4530 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); | 4567 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); |
4531 __ jmp(&stub_call); | 4568 __ jmp(&stub_call); |
4532 __ bind(&slow); | 4569 __ bind(&slow); |
(...skipping 13 matching lines...) Expand all Loading... |
4546 break; | 4583 break; |
4547 case NAMED_PROPERTY: | 4584 case NAMED_PROPERTY: |
4548 __ str(r0, MemOperand(sp, kPointerSize)); | 4585 __ str(r0, MemOperand(sp, kPointerSize)); |
4549 break; | 4586 break; |
4550 case NAMED_SUPER_PROPERTY: | 4587 case NAMED_SUPER_PROPERTY: |
4551 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4588 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
4552 break; | 4589 break; |
4553 case KEYED_PROPERTY: | 4590 case KEYED_PROPERTY: |
4554 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4591 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
4555 break; | 4592 break; |
| 4593 case KEYED_SUPER_PROPERTY: |
| 4594 __ str(r0, MemOperand(sp, 3 * kPointerSize)); |
| 4595 break; |
4556 } | 4596 } |
4557 } | 4597 } |
4558 } | 4598 } |
4559 | 4599 |
4560 | 4600 |
4561 __ bind(&stub_call); | 4601 __ bind(&stub_call); |
4562 __ mov(r1, r0); | 4602 __ mov(r1, r0); |
4563 __ mov(r0, Operand(Smi::FromInt(count_value))); | 4603 __ mov(r0, Operand(Smi::FromInt(count_value))); |
4564 | 4604 |
4565 // Record position before stub call. | 4605 // Record position before stub call. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4612 EmitNamedSuperPropertyStore(prop); | 4652 EmitNamedSuperPropertyStore(prop); |
4613 if (expr->is_postfix()) { | 4653 if (expr->is_postfix()) { |
4614 if (!context()->IsEffect()) { | 4654 if (!context()->IsEffect()) { |
4615 context()->PlugTOS(); | 4655 context()->PlugTOS(); |
4616 } | 4656 } |
4617 } else { | 4657 } else { |
4618 context()->Plug(r0); | 4658 context()->Plug(r0); |
4619 } | 4659 } |
4620 break; | 4660 break; |
4621 } | 4661 } |
| 4662 case KEYED_SUPER_PROPERTY: { |
| 4663 EmitKeyedSuperPropertyStore(prop); |
| 4664 if (expr->is_postfix()) { |
| 4665 if (!context()->IsEffect()) { |
| 4666 context()->PlugTOS(); |
| 4667 } |
| 4668 } else { |
| 4669 context()->Plug(r0); |
| 4670 } |
| 4671 break; |
| 4672 } |
4622 case KEYED_PROPERTY: { | 4673 case KEYED_PROPERTY: { |
4623 __ Pop(StoreDescriptor::ReceiverRegister(), | 4674 __ Pop(StoreDescriptor::ReceiverRegister(), |
4624 StoreDescriptor::NameRegister()); | 4675 StoreDescriptor::NameRegister()); |
4625 Handle<Code> ic = | 4676 Handle<Code> ic = |
4626 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4677 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
4627 CallIC(ic, expr->CountStoreFeedbackId()); | 4678 CallIC(ic, expr->CountStoreFeedbackId()); |
4628 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4679 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4629 if (expr->is_postfix()) { | 4680 if (expr->is_postfix()) { |
4630 if (!context()->IsEffect()) { | 4681 if (!context()->IsEffect()) { |
4631 context()->PlugTOS(); | 4682 context()->PlugTOS(); |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5142 | 5193 |
5143 DCHECK(interrupt_address == | 5194 DCHECK(interrupt_address == |
5144 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5195 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5145 return OSR_AFTER_STACK_CHECK; | 5196 return OSR_AFTER_STACK_CHECK; |
5146 } | 5197 } |
5147 | 5198 |
5148 | 5199 |
5149 } } // namespace v8::internal | 5200 } } // namespace v8::internal |
5150 | 5201 |
5151 #endif // V8_TARGET_ARCH_ARM | 5202 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |