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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 } else if (FLAG_debug_code) { | 235 } else if (FLAG_debug_code) { |
236 Label done; | 236 Label done; |
237 __ JumpIfInNewSpace(cp, r0, &done); | 237 __ JumpIfInNewSpace(cp, r0, &done); |
238 __ Abort(kExpectedNewSpaceObject); | 238 __ Abort(kExpectedNewSpaceObject); |
239 __ bind(&done); | 239 __ bind(&done); |
240 } | 240 } |
241 } | 241 } |
242 } | 242 } |
243 } | 243 } |
244 | 244 |
| 245 Variable* home_object_var = scope()->home_object_var(); |
| 246 if (home_object_var != nullptr) { |
| 247 __ Push(r1); |
| 248 } |
| 249 |
245 ArgumentsAccessStub::HasNewTarget has_new_target = | 250 ArgumentsAccessStub::HasNewTarget has_new_target = |
246 IsSubclassConstructor(info->function()->kind()) | 251 IsSubclassConstructor(info->function()->kind()) |
247 ? ArgumentsAccessStub::HAS_NEW_TARGET | 252 ? ArgumentsAccessStub::HAS_NEW_TARGET |
248 : ArgumentsAccessStub::NO_NEW_TARGET; | 253 : ArgumentsAccessStub::NO_NEW_TARGET; |
249 | 254 |
250 // Possibly allocate RestParameters | 255 // Possibly allocate RestParameters |
251 int rest_index; | 256 int rest_index; |
252 Variable* rest_param = scope()->rest_parameter(&rest_index); | 257 Variable* rest_param = scope()->rest_parameter(&rest_index); |
253 if (rest_param) { | 258 if (rest_param) { |
254 Comment cmnt(masm_, "[ Allocate rest parameter array"); | 259 Comment cmnt(masm_, "[ Allocate rest parameter array"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 305 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
301 } else { | 306 } else { |
302 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 307 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
303 } | 308 } |
304 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 309 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
305 __ CallStub(&stub); | 310 __ CallStub(&stub); |
306 | 311 |
307 SetVar(arguments, r0, r1, r2); | 312 SetVar(arguments, r0, r1, r2); |
308 } | 313 } |
309 | 314 |
| 315 // Possibly set up a local binding to the [[HomeObject]]. |
| 316 if (home_object_var != nullptr) { |
| 317 Comment cmnt(masm_, "[ Home object"); |
| 318 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 319 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 320 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); |
| 321 __ Move(LoadDescriptor::SlotRegister(), |
| 322 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); |
| 323 CallLoadIC(NOT_CONTEXTUAL); |
| 324 |
| 325 SetVar(home_object_var, r0, r1, r2); |
| 326 } |
| 327 |
310 if (FLAG_trace) { | 328 if (FLAG_trace) { |
311 __ CallRuntime(Runtime::kTraceEnter, 0); | 329 __ CallRuntime(Runtime::kTraceEnter, 0); |
312 } | 330 } |
313 | 331 |
314 // Visit the declarations and body unless there is an illegal | 332 // Visit the declarations and body unless there is an illegal |
315 // redeclaration. | 333 // redeclaration. |
316 if (scope()->HasIllegalRedeclaration()) { | 334 if (scope()->HasIllegalRedeclaration()) { |
317 Comment cmnt(masm_, "[ Declarations"); | 335 Comment cmnt(masm_, "[ Declarations"); |
318 scope()->VisitIllegalRedeclaration(this); | 336 scope()->VisitIllegalRedeclaration(this); |
319 | 337 |
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1318 context()->Plug(r0); | 1336 context()->Plug(r0); |
1319 } | 1337 } |
1320 | 1338 |
1321 | 1339 |
1322 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1340 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
1323 Comment cmnt(masm_, "[ VariableProxy"); | 1341 Comment cmnt(masm_, "[ VariableProxy"); |
1324 EmitVariableLoad(expr); | 1342 EmitVariableLoad(expr); |
1325 } | 1343 } |
1326 | 1344 |
1327 | 1345 |
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, | 1346 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
1350 int offset) { | 1347 int offset) { |
1351 if (NeedsHomeObject(initializer)) { | 1348 if (NeedsHomeObject(initializer)) { |
1352 __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); | 1349 __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
1353 __ mov(StoreDescriptor::NameRegister(), | 1350 __ mov(StoreDescriptor::NameRegister(), |
1354 Operand(isolate()->factory()->home_object_symbol())); | 1351 Operand(isolate()->factory()->home_object_symbol())); |
1355 __ ldr(StoreDescriptor::ValueRegister(), | 1352 __ ldr(StoreDescriptor::ValueRegister(), |
1356 MemOperand(sp, offset * kPointerSize)); | 1353 MemOperand(sp, offset * kPointerSize)); |
1357 CallStoreIC(); | 1354 CallStoreIC(); |
1358 } | 1355 } |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1973 if (expr->is_compound()) { | 1970 if (expr->is_compound()) { |
1974 // We need the receiver both on the stack and in the register. | 1971 // We need the receiver both on the stack and in the register. |
1975 VisitForStackValue(property->obj()); | 1972 VisitForStackValue(property->obj()); |
1976 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1973 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
1977 } else { | 1974 } else { |
1978 VisitForStackValue(property->obj()); | 1975 VisitForStackValue(property->obj()); |
1979 } | 1976 } |
1980 break; | 1977 break; |
1981 case NAMED_SUPER_PROPERTY: | 1978 case NAMED_SUPER_PROPERTY: |
1982 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1979 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1983 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1980 VisitForAccumulatorValue( |
| 1981 property->obj()->AsSuperReference()->home_object_var()); |
1984 __ Push(result_register()); | 1982 __ Push(result_register()); |
1985 if (expr->is_compound()) { | 1983 if (expr->is_compound()) { |
1986 const Register scratch = r1; | 1984 const Register scratch = r1; |
1987 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 1985 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
1988 __ Push(scratch); | 1986 __ Push(scratch); |
1989 __ Push(result_register()); | 1987 __ Push(result_register()); |
1990 } | 1988 } |
1991 break; | 1989 break; |
1992 case KEYED_SUPER_PROPERTY: | 1990 case KEYED_SUPER_PROPERTY: |
1993 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1991 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1994 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1992 VisitForStackValue( |
1995 __ Push(result_register()); | 1993 property->obj()->AsSuperReference()->home_object_var()); |
1996 VisitForAccumulatorValue(property->key()); | 1994 VisitForAccumulatorValue(property->key()); |
1997 __ Push(result_register()); | 1995 __ Push(result_register()); |
1998 if (expr->is_compound()) { | 1996 if (expr->is_compound()) { |
1999 const Register scratch = r1; | 1997 const Register scratch = r1; |
2000 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 1998 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
2001 __ Push(scratch); | 1999 __ Push(scratch); |
2002 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 2000 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
2003 __ Push(scratch); | 2001 __ Push(scratch); |
2004 __ Push(result_register()); | 2002 __ Push(result_register()); |
2005 } | 2003 } |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2627 __ Move(StoreDescriptor::ReceiverRegister(), r0); | 2625 __ Move(StoreDescriptor::ReceiverRegister(), r0); |
2628 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2626 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
2629 __ mov(StoreDescriptor::NameRegister(), | 2627 __ mov(StoreDescriptor::NameRegister(), |
2630 Operand(prop->key()->AsLiteral()->value())); | 2628 Operand(prop->key()->AsLiteral()->value())); |
2631 CallStoreIC(); | 2629 CallStoreIC(); |
2632 break; | 2630 break; |
2633 } | 2631 } |
2634 case NAMED_SUPER_PROPERTY: { | 2632 case NAMED_SUPER_PROPERTY: { |
2635 __ Push(r0); | 2633 __ Push(r0); |
2636 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2634 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2637 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2635 VisitForAccumulatorValue( |
| 2636 prop->obj()->AsSuperReference()->home_object_var()); |
2638 // stack: value, this; r0: home_object | 2637 // stack: value, this; r0: home_object |
2639 Register scratch = r2; | 2638 Register scratch = r2; |
2640 Register scratch2 = r3; | 2639 Register scratch2 = r3; |
2641 __ mov(scratch, result_register()); // home_object | 2640 __ mov(scratch, result_register()); // home_object |
2642 __ ldr(r0, MemOperand(sp, kPointerSize)); // value | 2641 __ ldr(r0, MemOperand(sp, kPointerSize)); // value |
2643 __ ldr(scratch2, MemOperand(sp, 0)); // this | 2642 __ ldr(scratch2, MemOperand(sp, 0)); // this |
2644 __ str(scratch2, MemOperand(sp, kPointerSize)); // this | 2643 __ str(scratch2, MemOperand(sp, kPointerSize)); // this |
2645 __ str(scratch, MemOperand(sp, 0)); // home_object | 2644 __ str(scratch, MemOperand(sp, 0)); // home_object |
2646 // stack: this, home_object; r0: value | 2645 // stack: this, home_object; r0: value |
2647 EmitNamedSuperPropertyStore(prop); | 2646 EmitNamedSuperPropertyStore(prop); |
2648 break; | 2647 break; |
2649 } | 2648 } |
2650 case KEYED_SUPER_PROPERTY: { | 2649 case KEYED_SUPER_PROPERTY: { |
2651 __ Push(r0); | 2650 __ Push(r0); |
2652 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2651 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2653 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2652 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
2654 __ Push(result_register()); | |
2655 VisitForAccumulatorValue(prop->key()); | 2653 VisitForAccumulatorValue(prop->key()); |
2656 Register scratch = r2; | 2654 Register scratch = r2; |
2657 Register scratch2 = r3; | 2655 Register scratch2 = r3; |
2658 __ ldr(scratch2, MemOperand(sp, 2 * kPointerSize)); // value | 2656 __ ldr(scratch2, MemOperand(sp, 2 * kPointerSize)); // value |
2659 // stack: value, this, home_object; r0: key, r3: value | 2657 // stack: value, this, home_object; r0: key, r3: value |
2660 __ ldr(scratch, MemOperand(sp, kPointerSize)); // this | 2658 __ ldr(scratch, MemOperand(sp, kPointerSize)); // this |
2661 __ str(scratch, MemOperand(sp, 2 * kPointerSize)); | 2659 __ str(scratch, MemOperand(sp, 2 * kPointerSize)); |
2662 __ ldr(scratch, MemOperand(sp, 0)); // home_object | 2660 __ ldr(scratch, MemOperand(sp, 0)); // home_object |
2663 __ str(scratch, MemOperand(sp, kPointerSize)); | 2661 __ str(scratch, MemOperand(sp, kPointerSize)); |
2664 __ str(r0, MemOperand(sp, 0)); | 2662 __ str(r0, MemOperand(sp, 0)); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2856 Comment cmnt(masm_, "[ Property"); | 2854 Comment cmnt(masm_, "[ Property"); |
2857 Expression* key = expr->key(); | 2855 Expression* key = expr->key(); |
2858 | 2856 |
2859 if (key->IsPropertyName()) { | 2857 if (key->IsPropertyName()) { |
2860 if (!expr->IsSuperAccess()) { | 2858 if (!expr->IsSuperAccess()) { |
2861 VisitForAccumulatorValue(expr->obj()); | 2859 VisitForAccumulatorValue(expr->obj()); |
2862 __ Move(LoadDescriptor::ReceiverRegister(), r0); | 2860 __ Move(LoadDescriptor::ReceiverRegister(), r0); |
2863 EmitNamedPropertyLoad(expr); | 2861 EmitNamedPropertyLoad(expr); |
2864 } else { | 2862 } else { |
2865 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2863 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2866 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2864 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2867 __ Push(result_register()); | |
2868 EmitNamedSuperPropertyLoad(expr); | 2865 EmitNamedSuperPropertyLoad(expr); |
2869 } | 2866 } |
2870 } else { | 2867 } else { |
2871 if (!expr->IsSuperAccess()) { | 2868 if (!expr->IsSuperAccess()) { |
2872 VisitForStackValue(expr->obj()); | 2869 VisitForStackValue(expr->obj()); |
2873 VisitForAccumulatorValue(expr->key()); | 2870 VisitForAccumulatorValue(expr->key()); |
2874 __ Move(LoadDescriptor::NameRegister(), r0); | 2871 __ Move(LoadDescriptor::NameRegister(), r0); |
2875 __ pop(LoadDescriptor::ReceiverRegister()); | 2872 __ pop(LoadDescriptor::ReceiverRegister()); |
2876 EmitKeyedPropertyLoad(expr); | 2873 EmitKeyedPropertyLoad(expr); |
2877 } else { | 2874 } else { |
2878 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2875 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2879 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2876 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2880 __ Push(result_register()); | |
2881 VisitForStackValue(expr->key()); | 2877 VisitForStackValue(expr->key()); |
2882 EmitKeyedSuperPropertyLoad(expr); | 2878 EmitKeyedSuperPropertyLoad(expr); |
2883 } | 2879 } |
2884 } | 2880 } |
2885 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2881 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2886 context()->Plug(r0); | 2882 context()->Plug(r0); |
2887 } | 2883 } |
2888 | 2884 |
2889 | 2885 |
2890 void FullCodeGenerator::CallIC(Handle<Code> code, | 2886 void FullCodeGenerator::CallIC(Handle<Code> code, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2936 DCHECK(callee->IsProperty()); | 2932 DCHECK(callee->IsProperty()); |
2937 Property* prop = callee->AsProperty(); | 2933 Property* prop = callee->AsProperty(); |
2938 DCHECK(prop->IsSuperAccess()); | 2934 DCHECK(prop->IsSuperAccess()); |
2939 | 2935 |
2940 SetSourcePosition(prop->position()); | 2936 SetSourcePosition(prop->position()); |
2941 Literal* key = prop->key()->AsLiteral(); | 2937 Literal* key = prop->key()->AsLiteral(); |
2942 DCHECK(!key->value()->IsSmi()); | 2938 DCHECK(!key->value()->IsSmi()); |
2943 // Load the function from the receiver. | 2939 // Load the function from the receiver. |
2944 const Register scratch = r1; | 2940 const Register scratch = r1; |
2945 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2941 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2946 EmitLoadHomeObject(super_ref); | 2942 VisitForStackValue(super_ref->home_object_var()); |
2947 __ Push(r0); | |
2948 VisitForAccumulatorValue(super_ref->this_var()); | 2943 VisitForAccumulatorValue(super_ref->this_var()); |
2949 __ Push(r0); | 2944 __ Push(r0); |
2950 __ Push(r0); | 2945 __ Push(r0); |
2951 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); | 2946 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); |
2952 __ Push(scratch); | 2947 __ Push(scratch); |
2953 __ Push(key->value()); | 2948 __ Push(key->value()); |
2954 | 2949 |
2955 // Stack here: | 2950 // Stack here: |
2956 // - home_object | 2951 // - home_object |
2957 // - this (receiver) | 2952 // - this (receiver) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2997 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2992 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
2998 Expression* callee = expr->expression(); | 2993 Expression* callee = expr->expression(); |
2999 DCHECK(callee->IsProperty()); | 2994 DCHECK(callee->IsProperty()); |
3000 Property* prop = callee->AsProperty(); | 2995 Property* prop = callee->AsProperty(); |
3001 DCHECK(prop->IsSuperAccess()); | 2996 DCHECK(prop->IsSuperAccess()); |
3002 | 2997 |
3003 SetSourcePosition(prop->position()); | 2998 SetSourcePosition(prop->position()); |
3004 // Load the function from the receiver. | 2999 // Load the function from the receiver. |
3005 const Register scratch = r1; | 3000 const Register scratch = r1; |
3006 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 3001 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
3007 EmitLoadHomeObject(super_ref); | 3002 VisitForStackValue(super_ref->home_object_var()); |
3008 __ Push(r0); | |
3009 VisitForAccumulatorValue(super_ref->this_var()); | 3003 VisitForAccumulatorValue(super_ref->this_var()); |
3010 __ Push(r0); | 3004 __ Push(r0); |
3011 __ Push(r0); | 3005 __ Push(r0); |
3012 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); | 3006 __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); |
3013 __ Push(scratch); | 3007 __ Push(scratch); |
3014 VisitForStackValue(prop->key()); | 3008 VisitForStackValue(prop->key()); |
3015 | 3009 |
3016 // Stack here: | 3010 // Stack here: |
3017 // - home_object | 3011 // - home_object |
3018 // - this (receiver) | 3012 // - this (receiver) |
(...skipping 1821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4840 case NAMED_PROPERTY: { | 4834 case NAMED_PROPERTY: { |
4841 // Put the object both on the stack and in the register. | 4835 // Put the object both on the stack and in the register. |
4842 VisitForStackValue(prop->obj()); | 4836 VisitForStackValue(prop->obj()); |
4843 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4837 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
4844 EmitNamedPropertyLoad(prop); | 4838 EmitNamedPropertyLoad(prop); |
4845 break; | 4839 break; |
4846 } | 4840 } |
4847 | 4841 |
4848 case NAMED_SUPER_PROPERTY: { | 4842 case NAMED_SUPER_PROPERTY: { |
4849 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4843 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4850 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4844 VisitForAccumulatorValue( |
| 4845 prop->obj()->AsSuperReference()->home_object_var()); |
4851 __ Push(result_register()); | 4846 __ Push(result_register()); |
4852 const Register scratch = r1; | 4847 const Register scratch = r1; |
4853 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 4848 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
4854 __ Push(scratch); | 4849 __ Push(scratch); |
4855 __ Push(result_register()); | 4850 __ Push(result_register()); |
4856 EmitNamedSuperPropertyLoad(prop); | 4851 EmitNamedSuperPropertyLoad(prop); |
4857 break; | 4852 break; |
4858 } | 4853 } |
4859 | 4854 |
4860 case KEYED_SUPER_PROPERTY: { | 4855 case KEYED_SUPER_PROPERTY: { |
4861 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4856 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4862 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4857 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
4863 __ Push(result_register()); | |
4864 VisitForAccumulatorValue(prop->key()); | 4858 VisitForAccumulatorValue(prop->key()); |
4865 __ Push(result_register()); | 4859 __ Push(result_register()); |
4866 const Register scratch = r1; | 4860 const Register scratch = r1; |
4867 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 4861 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
4868 __ Push(scratch); | 4862 __ Push(scratch); |
4869 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); | 4863 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
4870 __ Push(scratch); | 4864 __ Push(scratch); |
4871 __ Push(result_register()); | 4865 __ Push(result_register()); |
4872 EmitKeyedSuperPropertyLoad(prop); | 4866 EmitKeyedSuperPropertyLoad(prop); |
4873 break; | 4867 break; |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5519 | 5513 |
5520 DCHECK(interrupt_address == | 5514 DCHECK(interrupt_address == |
5521 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5515 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5522 return OSR_AFTER_STACK_CHECK; | 5516 return OSR_AFTER_STACK_CHECK; |
5523 } | 5517 } |
5524 | 5518 |
5525 | 5519 |
5526 } } // namespace v8::internal | 5520 } } // namespace v8::internal |
5527 | 5521 |
5528 #endif // V8_TARGET_ARCH_ARM | 5522 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |