| 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 300 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
| 301 } else { | 301 } else { |
| 302 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 302 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| 303 } | 303 } |
| 304 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 304 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
| 305 __ CallStub(&stub); | 305 __ CallStub(&stub); |
| 306 | 306 |
| 307 SetVar(arguments, r0, r1, r2); | 307 SetVar(arguments, r0, r1, r2); |
| 308 } | 308 } |
| 309 | 309 |
| 310 // Possibly set up a local binding to the [[HomeObject]]. |
| 311 Variable* home_object_var = scope()->home_object_var(); |
| 312 if (home_object_var != nullptr) { |
| 313 Comment cmnt(masm_, "[ Home object"); |
| 314 if (function_in_register) { |
| 315 __ Move(LoadDescriptor::ReceiverRegister(), r1); |
| 316 } else { |
| 317 __ ldr(LoadDescriptor::ReceiverRegister(), |
| 318 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| 319 } |
| 320 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 321 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); |
| 322 __ mov(LoadDescriptor::SlotRegister(), |
| 323 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); |
| 324 CallLoadIC(NOT_CONTEXTUAL); |
| 325 |
| 326 SetVar(home_object_var, r0, r1, r2); |
| 327 } |
| 328 |
| 310 if (FLAG_trace) { | 329 if (FLAG_trace) { |
| 311 __ CallRuntime(Runtime::kTraceEnter, 0); | 330 __ CallRuntime(Runtime::kTraceEnter, 0); |
| 312 } | 331 } |
| 313 | 332 |
| 314 // Visit the declarations and body unless there is an illegal | 333 // Visit the declarations and body unless there is an illegal |
| 315 // redeclaration. | 334 // redeclaration. |
| 316 if (scope()->HasIllegalRedeclaration()) { | 335 if (scope()->HasIllegalRedeclaration()) { |
| 317 Comment cmnt(masm_, "[ Declarations"); | 336 Comment cmnt(masm_, "[ Declarations"); |
| 318 scope()->VisitIllegalRedeclaration(this); | 337 scope()->VisitIllegalRedeclaration(this); |
| 319 | 338 |
| (...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1318 context()->Plug(r0); | 1337 context()->Plug(r0); |
| 1319 } | 1338 } |
| 1320 | 1339 |
| 1321 | 1340 |
| 1322 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1341 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
| 1323 Comment cmnt(masm_, "[ VariableProxy"); | 1342 Comment cmnt(masm_, "[ VariableProxy"); |
| 1324 EmitVariableLoad(expr); | 1343 EmitVariableLoad(expr); |
| 1325 } | 1344 } |
| 1326 | 1345 |
| 1327 | 1346 |
| 1328 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
| 1329 Comment cnmt(masm_, "[ SuperReference "); | |
| 1330 | |
| 1331 __ ldr(LoadDescriptor::ReceiverRegister(), | |
| 1332 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | |
| 1333 | |
| 1334 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
| 1335 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); | |
| 1336 | |
| 1337 __ mov(LoadDescriptor::SlotRegister(), | |
| 1338 Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot()))); | |
| 1339 CallLoadIC(NOT_CONTEXTUAL); | |
| 1340 | |
| 1341 __ cmp(r0, Operand(isolate()->factory()->undefined_value())); | |
| 1342 Label done; | |
| 1343 __ b(ne, &done); | |
| 1344 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
| 1345 __ bind(&done); | |
| 1346 } | |
| 1347 | |
| 1348 | |
| 1349 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1347 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
| 1350 int offset) { | 1348 int offset) { |
| 1351 if (NeedsHomeObject(initializer)) { | 1349 if (NeedsHomeObject(initializer)) { |
| 1352 __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); | 1350 __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
| 1353 __ mov(StoreDescriptor::NameRegister(), | 1351 __ mov(StoreDescriptor::NameRegister(), |
| 1354 Operand(isolate()->factory()->home_object_symbol())); | 1352 Operand(isolate()->factory()->home_object_symbol())); |
| 1355 __ ldr(StoreDescriptor::ValueRegister(), | 1353 __ ldr(StoreDescriptor::ValueRegister(), |
| 1356 MemOperand(sp, offset * kPointerSize)); | 1354 MemOperand(sp, offset * kPointerSize)); |
| 1357 CallStoreIC(); | 1355 CallStoreIC(); |
| 1358 } | 1356 } |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1950 if (expr->is_compound()) { | 1948 if (expr->is_compound()) { |
| 1951 // We need the receiver both on the stack and in the register. | 1949 // We need the receiver both on the stack and in the register. |
| 1952 VisitForStackValue(property->obj()); | 1950 VisitForStackValue(property->obj()); |
| 1953 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1951 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 1954 } else { | 1952 } else { |
| 1955 VisitForStackValue(property->obj()); | 1953 VisitForStackValue(property->obj()); |
| 1956 } | 1954 } |
| 1957 break; | 1955 break; |
| 1958 case NAMED_SUPER_PROPERTY: | 1956 case NAMED_SUPER_PROPERTY: |
| 1959 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1957 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1960 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1958 VisitForAccumulatorValue( |
| 1959 property->obj()->AsSuperReference()->home_object_var()); |
| 1961 __ Push(result_register()); | 1960 __ Push(result_register()); |
| 1962 if (expr->is_compound()) { | 1961 if (expr->is_compound()) { |
| 1963 const Register scratch = r1; | 1962 const Register scratch = r1; |
| 1964 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 1963 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
| 1965 __ Push(scratch); | 1964 __ Push(scratch); |
| 1966 __ Push(result_register()); | 1965 __ Push(result_register()); |
| 1967 } | 1966 } |
| 1968 break; | 1967 break; |
| 1969 case KEYED_SUPER_PROPERTY: | 1968 case KEYED_SUPER_PROPERTY: |
| 1970 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1969 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1971 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1970 VisitForStackValue( |
| 1972 __ Push(result_register()); | 1971 property->obj()->AsSuperReference()->home_object_var()); |
| 1973 VisitForAccumulatorValue(property->key()); | 1972 VisitForAccumulatorValue(property->key()); |
| 1974 __ Push(result_register()); | 1973 __ Push(result_register()); |
| 1975 if (expr->is_compound()) { | 1974 if (expr->is_compound()) { |
| 1976 const Register scratch = r1; | 1975 const Register scratch = r1; |
| 1977 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 1976 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1978 __ Push(scratch); | 1977 __ Push(scratch); |
| 1979 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 1978 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1980 __ Push(scratch); | 1979 __ Push(scratch); |
| 1981 __ Push(result_register()); | 1980 __ Push(result_register()); |
| 1982 } | 1981 } |
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2604 __ Move(StoreDescriptor::ReceiverRegister(), r0); | 2603 __ Move(StoreDescriptor::ReceiverRegister(), r0); |
| 2605 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2604 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2606 __ mov(StoreDescriptor::NameRegister(), | 2605 __ mov(StoreDescriptor::NameRegister(), |
| 2607 Operand(prop->key()->AsLiteral()->value())); | 2606 Operand(prop->key()->AsLiteral()->value())); |
| 2608 CallStoreIC(); | 2607 CallStoreIC(); |
| 2609 break; | 2608 break; |
| 2610 } | 2609 } |
| 2611 case NAMED_SUPER_PROPERTY: { | 2610 case NAMED_SUPER_PROPERTY: { |
| 2612 __ Push(r0); | 2611 __ Push(r0); |
| 2613 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2612 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2614 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2613 VisitForAccumulatorValue( |
| 2614 prop->obj()->AsSuperReference()->home_object_var()); |
| 2615 // stack: value, this; r0: home_object | 2615 // stack: value, this; r0: home_object |
| 2616 Register scratch = r2; | 2616 Register scratch = r2; |
| 2617 Register scratch2 = r3; | 2617 Register scratch2 = r3; |
| 2618 __ mov(scratch, result_register()); // home_object | 2618 __ mov(scratch, result_register()); // home_object |
| 2619 __ ldr(r0, MemOperand(sp, kPointerSize)); // value | 2619 __ ldr(r0, MemOperand(sp, kPointerSize)); // value |
| 2620 __ ldr(scratch2, MemOperand(sp, 0)); // this | 2620 __ ldr(scratch2, MemOperand(sp, 0)); // this |
| 2621 __ str(scratch2, MemOperand(sp, kPointerSize)); // this | 2621 __ str(scratch2, MemOperand(sp, kPointerSize)); // this |
| 2622 __ str(scratch, MemOperand(sp, 0)); // home_object | 2622 __ str(scratch, MemOperand(sp, 0)); // home_object |
| 2623 // stack: this, home_object; r0: value | 2623 // stack: this, home_object; r0: value |
| 2624 EmitNamedSuperPropertyStore(prop); | 2624 EmitNamedSuperPropertyStore(prop); |
| 2625 break; | 2625 break; |
| 2626 } | 2626 } |
| 2627 case KEYED_SUPER_PROPERTY: { | 2627 case KEYED_SUPER_PROPERTY: { |
| 2628 __ Push(r0); | 2628 __ Push(r0); |
| 2629 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2629 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2630 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2630 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 2631 __ Push(result_register()); | |
| 2632 VisitForAccumulatorValue(prop->key()); | 2631 VisitForAccumulatorValue(prop->key()); |
| 2633 Register scratch = r2; | 2632 Register scratch = r2; |
| 2634 Register scratch2 = r3; | 2633 Register scratch2 = r3; |
| 2635 __ ldr(scratch2, MemOperand(sp, 2 * kPointerSize)); // value | 2634 __ ldr(scratch2, MemOperand(sp, 2 * kPointerSize)); // value |
| 2636 // stack: value, this, home_object; r0: key, r3: value | 2635 // stack: value, this, home_object; r0: key, r3: value |
| 2637 __ ldr(scratch, MemOperand(sp, kPointerSize)); // this | 2636 __ ldr(scratch, MemOperand(sp, kPointerSize)); // this |
| 2638 __ str(scratch, MemOperand(sp, 2 * kPointerSize)); | 2637 __ str(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 2639 __ ldr(scratch, MemOperand(sp, 0)); // home_object | 2638 __ ldr(scratch, MemOperand(sp, 0)); // home_object |
| 2640 __ str(scratch, MemOperand(sp, kPointerSize)); | 2639 __ str(scratch, MemOperand(sp, kPointerSize)); |
| 2641 __ str(r0, MemOperand(sp, 0)); | 2640 __ str(r0, MemOperand(sp, 0)); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2833 Comment cmnt(masm_, "[ Property"); | 2832 Comment cmnt(masm_, "[ Property"); |
| 2834 Expression* key = expr->key(); | 2833 Expression* key = expr->key(); |
| 2835 | 2834 |
| 2836 if (key->IsPropertyName()) { | 2835 if (key->IsPropertyName()) { |
| 2837 if (!expr->IsSuperAccess()) { | 2836 if (!expr->IsSuperAccess()) { |
| 2838 VisitForAccumulatorValue(expr->obj()); | 2837 VisitForAccumulatorValue(expr->obj()); |
| 2839 __ Move(LoadDescriptor::ReceiverRegister(), r0); | 2838 __ Move(LoadDescriptor::ReceiverRegister(), r0); |
| 2840 EmitNamedPropertyLoad(expr); | 2839 EmitNamedPropertyLoad(expr); |
| 2841 } else { | 2840 } else { |
| 2842 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2841 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2843 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2842 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2844 __ Push(result_register()); | |
| 2845 EmitNamedSuperPropertyLoad(expr); | 2843 EmitNamedSuperPropertyLoad(expr); |
| 2846 } | 2844 } |
| 2847 } else { | 2845 } else { |
| 2848 if (!expr->IsSuperAccess()) { | 2846 if (!expr->IsSuperAccess()) { |
| 2849 VisitForStackValue(expr->obj()); | 2847 VisitForStackValue(expr->obj()); |
| 2850 VisitForAccumulatorValue(expr->key()); | 2848 VisitForAccumulatorValue(expr->key()); |
| 2851 __ Move(LoadDescriptor::NameRegister(), r0); | 2849 __ Move(LoadDescriptor::NameRegister(), r0); |
| 2852 __ pop(LoadDescriptor::ReceiverRegister()); | 2850 __ pop(LoadDescriptor::ReceiverRegister()); |
| 2853 EmitKeyedPropertyLoad(expr); | 2851 EmitKeyedPropertyLoad(expr); |
| 2854 } else { | 2852 } else { |
| 2855 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2853 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2856 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2854 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2857 __ Push(result_register()); | |
| 2858 VisitForStackValue(expr->key()); | 2855 VisitForStackValue(expr->key()); |
| 2859 EmitKeyedSuperPropertyLoad(expr); | 2856 EmitKeyedSuperPropertyLoad(expr); |
| 2860 } | 2857 } |
| 2861 } | 2858 } |
| 2862 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2859 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2863 context()->Plug(r0); | 2860 context()->Plug(r0); |
| 2864 } | 2861 } |
| 2865 | 2862 |
| 2866 | 2863 |
| 2867 void FullCodeGenerator::CallIC(Handle<Code> code, | 2864 void FullCodeGenerator::CallIC(Handle<Code> code, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2913 DCHECK(callee->IsProperty()); | 2910 DCHECK(callee->IsProperty()); |
| 2914 Property* prop = callee->AsProperty(); | 2911 Property* prop = callee->AsProperty(); |
| 2915 DCHECK(prop->IsSuperAccess()); | 2912 DCHECK(prop->IsSuperAccess()); |
| 2916 | 2913 |
| 2917 SetSourcePosition(prop->position()); | 2914 SetSourcePosition(prop->position()); |
| 2918 Literal* key = prop->key()->AsLiteral(); | 2915 Literal* key = prop->key()->AsLiteral(); |
| 2919 DCHECK(!key->value()->IsSmi()); | 2916 DCHECK(!key->value()->IsSmi()); |
| 2920 // Load the function from the receiver. | 2917 // Load the function from the receiver. |
| 2921 const Register scratch = r1; | 2918 const Register scratch = r1; |
| 2922 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2919 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| 2923 EmitLoadHomeObject(super_ref); | 2920 VisitForStackValue(super_ref->home_object_var()); |
| 2924 __ Push(r0); | |
| 2925 VisitForAccumulatorValue(super_ref->this_var()); | 2921 VisitForAccumulatorValue(super_ref->this_var()); |
| 2926 __ Push(r0); | 2922 __ Push(r0); |
| 2927 __ Push(r0); | 2923 __ Push(r0); |
| 2928 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); | 2924 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); |
| 2929 __ Push(scratch); | 2925 __ Push(scratch); |
| 2930 __ Push(key->value()); | 2926 __ Push(key->value()); |
| 2931 | 2927 |
| 2932 // Stack here: | 2928 // Stack here: |
| 2933 // - home_object | 2929 // - home_object |
| 2934 // - this (receiver) | 2930 // - this (receiver) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2974 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2970 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
| 2975 Expression* callee = expr->expression(); | 2971 Expression* callee = expr->expression(); |
| 2976 DCHECK(callee->IsProperty()); | 2972 DCHECK(callee->IsProperty()); |
| 2977 Property* prop = callee->AsProperty(); | 2973 Property* prop = callee->AsProperty(); |
| 2978 DCHECK(prop->IsSuperAccess()); | 2974 DCHECK(prop->IsSuperAccess()); |
| 2979 | 2975 |
| 2980 SetSourcePosition(prop->position()); | 2976 SetSourcePosition(prop->position()); |
| 2981 // Load the function from the receiver. | 2977 // Load the function from the receiver. |
| 2982 const Register scratch = r1; | 2978 const Register scratch = r1; |
| 2983 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2979 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| 2984 EmitLoadHomeObject(super_ref); | 2980 VisitForStackValue(super_ref->home_object_var()); |
| 2985 __ Push(r0); | |
| 2986 VisitForAccumulatorValue(super_ref->this_var()); | 2981 VisitForAccumulatorValue(super_ref->this_var()); |
| 2987 __ Push(r0); | 2982 __ Push(r0); |
| 2988 __ Push(r0); | 2983 __ Push(r0); |
| 2989 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); | 2984 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); |
| 2990 __ Push(scratch); | 2985 __ Push(scratch); |
| 2991 VisitForStackValue(prop->key()); | 2986 VisitForStackValue(prop->key()); |
| 2992 | 2987 |
| 2993 // Stack here: | 2988 // Stack here: |
| 2994 // - home_object | 2989 // - home_object |
| 2995 // - this (receiver) | 2990 // - this (receiver) |
| (...skipping 1821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4817 case NAMED_PROPERTY: { | 4812 case NAMED_PROPERTY: { |
| 4818 // Put the object both on the stack and in the register. | 4813 // Put the object both on the stack and in the register. |
| 4819 VisitForStackValue(prop->obj()); | 4814 VisitForStackValue(prop->obj()); |
| 4820 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4815 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 4821 EmitNamedPropertyLoad(prop); | 4816 EmitNamedPropertyLoad(prop); |
| 4822 break; | 4817 break; |
| 4823 } | 4818 } |
| 4824 | 4819 |
| 4825 case NAMED_SUPER_PROPERTY: { | 4820 case NAMED_SUPER_PROPERTY: { |
| 4826 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4821 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4827 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4822 VisitForAccumulatorValue( |
| 4823 prop->obj()->AsSuperReference()->home_object_var()); |
| 4828 __ Push(result_register()); | 4824 __ Push(result_register()); |
| 4829 const Register scratch = r1; | 4825 const Register scratch = r1; |
| 4830 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 4826 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
| 4831 __ Push(scratch); | 4827 __ Push(scratch); |
| 4832 __ Push(result_register()); | 4828 __ Push(result_register()); |
| 4833 EmitNamedSuperPropertyLoad(prop); | 4829 EmitNamedSuperPropertyLoad(prop); |
| 4834 break; | 4830 break; |
| 4835 } | 4831 } |
| 4836 | 4832 |
| 4837 case KEYED_SUPER_PROPERTY: { | 4833 case KEYED_SUPER_PROPERTY: { |
| 4838 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4834 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4839 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4835 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 4840 __ Push(result_register()); | |
| 4841 VisitForAccumulatorValue(prop->key()); | 4836 VisitForAccumulatorValue(prop->key()); |
| 4842 __ Push(result_register()); | 4837 __ Push(result_register()); |
| 4843 const Register scratch = r1; | 4838 const Register scratch = r1; |
| 4844 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 4839 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4845 __ Push(scratch); | 4840 __ Push(scratch); |
| 4846 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 4841 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4847 __ Push(scratch); | 4842 __ Push(scratch); |
| 4848 __ Push(result_register()); | 4843 __ Push(result_register()); |
| 4849 EmitKeyedSuperPropertyLoad(prop); | 4844 EmitKeyedSuperPropertyLoad(prop); |
| 4850 break; | 4845 break; |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5484 | 5479 |
| 5485 DCHECK(interrupt_address == | 5480 DCHECK(interrupt_address == |
| 5486 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5481 isolate->builtins()->OsrAfterStackCheck()->entry()); |
| 5487 return OSR_AFTER_STACK_CHECK; | 5482 return OSR_AFTER_STACK_CHECK; |
| 5488 } | 5483 } |
| 5489 | 5484 |
| 5490 | 5485 |
| 5491 } } // namespace v8::internal | 5486 } } // namespace v8::internal |
| 5492 | 5487 |
| 5493 #endif // V8_TARGET_ARCH_ARM | 5488 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |