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_X64 | 7 #if V8_TARGET_ARCH_X64 |
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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 } else if (FLAG_debug_code) { | 227 } else if (FLAG_debug_code) { |
228 Label done; | 228 Label done; |
229 __ JumpIfInNewSpace(rsi, rax, &done, Label::kNear); | 229 __ JumpIfInNewSpace(rsi, rax, &done, Label::kNear); |
230 __ Abort(kExpectedNewSpaceObject); | 230 __ Abort(kExpectedNewSpaceObject); |
231 __ bind(&done); | 231 __ bind(&done); |
232 } | 232 } |
233 } | 233 } |
234 } | 234 } |
235 } | 235 } |
236 | 236 |
| 237 Variable* home_object_var = scope()->home_object_var(); |
| 238 if (home_object_var != nullptr) { |
| 239 __ Push(rdi); |
| 240 } |
| 241 |
237 ArgumentsAccessStub::HasNewTarget has_new_target = | 242 ArgumentsAccessStub::HasNewTarget has_new_target = |
238 IsSubclassConstructor(info->function()->kind()) | 243 IsSubclassConstructor(info->function()->kind()) |
239 ? ArgumentsAccessStub::HAS_NEW_TARGET | 244 ? ArgumentsAccessStub::HAS_NEW_TARGET |
240 : ArgumentsAccessStub::NO_NEW_TARGET; | 245 : ArgumentsAccessStub::NO_NEW_TARGET; |
241 | 246 |
242 // Possibly allocate RestParameters | 247 // Possibly allocate RestParameters |
243 int rest_index; | 248 int rest_index; |
244 Variable* rest_param = scope()->rest_parameter(&rest_index); | 249 Variable* rest_param = scope()->rest_parameter(&rest_index); |
245 if (rest_param) { | 250 if (rest_param) { |
246 Comment cmnt(masm_, "[ Allocate rest parameter array"); | 251 Comment cmnt(masm_, "[ Allocate rest parameter array"); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 299 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
295 } else { | 300 } else { |
296 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 301 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
297 } | 302 } |
298 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 303 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
299 __ CallStub(&stub); | 304 __ CallStub(&stub); |
300 | 305 |
301 SetVar(arguments, rax, rbx, rdx); | 306 SetVar(arguments, rax, rbx, rdx); |
302 } | 307 } |
303 | 308 |
| 309 // Possibly set up a local binding to the [[HomeObject]]. |
| 310 // Variable* home_object_var = scope()->home_object_var(); |
| 311 if (home_object_var != nullptr) { |
| 312 Comment cmnt(masm_, "[ Home object"); |
| 313 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 314 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 315 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); |
| 316 __ Move(LoadDescriptor::SlotRegister(), |
| 317 SmiFromSlot(function()->HomeObjectFeedbackSlot())); |
| 318 CallLoadIC(NOT_CONTEXTUAL); |
| 319 |
| 320 SetVar(home_object_var, rax, rbx, rdx); |
| 321 } |
| 322 |
304 if (FLAG_trace) { | 323 if (FLAG_trace) { |
305 __ CallRuntime(Runtime::kTraceEnter, 0); | 324 __ CallRuntime(Runtime::kTraceEnter, 0); |
306 } | 325 } |
307 | 326 |
308 // Visit the declarations and body unless there is an illegal | 327 // Visit the declarations and body unless there is an illegal |
309 // redeclaration. | 328 // redeclaration. |
310 if (scope()->HasIllegalRedeclaration()) { | 329 if (scope()->HasIllegalRedeclaration()) { |
311 Comment cmnt(masm_, "[ Declarations"); | 330 Comment cmnt(masm_, "[ Declarations"); |
312 scope()->VisitIllegalRedeclaration(this); | 331 scope()->VisitIllegalRedeclaration(this); |
313 | 332 |
(...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 context()->Plug(rax); | 1297 context()->Plug(rax); |
1279 } | 1298 } |
1280 | 1299 |
1281 | 1300 |
1282 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1301 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
1283 Comment cmnt(masm_, "[ VariableProxy"); | 1302 Comment cmnt(masm_, "[ VariableProxy"); |
1284 EmitVariableLoad(expr); | 1303 EmitVariableLoad(expr); |
1285 } | 1304 } |
1286 | 1305 |
1287 | 1306 |
1288 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
1289 Comment cnmt(masm_, "[ SuperReference "); | |
1290 | |
1291 __ movp(LoadDescriptor::ReceiverRegister(), | |
1292 Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | |
1293 | |
1294 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
1295 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); | |
1296 | |
1297 __ Move(LoadDescriptor::SlotRegister(), | |
1298 SmiFromSlot(expr->HomeObjectFeedbackSlot())); | |
1299 CallLoadIC(NOT_CONTEXTUAL); | |
1300 | |
1301 __ Cmp(rax, isolate()->factory()->undefined_value()); | |
1302 Label done; | |
1303 __ j(not_equal, &done); | |
1304 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
1305 __ bind(&done); | |
1306 } | |
1307 | |
1308 | |
1309 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1307 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
1310 int offset) { | 1308 int offset) { |
1311 if (NeedsHomeObject(initializer)) { | 1309 if (NeedsHomeObject(initializer)) { |
1312 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1310 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
1313 __ Move(StoreDescriptor::NameRegister(), | 1311 __ Move(StoreDescriptor::NameRegister(), |
1314 isolate()->factory()->home_object_symbol()); | 1312 isolate()->factory()->home_object_symbol()); |
1315 __ movp(StoreDescriptor::ValueRegister(), | 1313 __ movp(StoreDescriptor::ValueRegister(), |
1316 Operand(rsp, offset * kPointerSize)); | 1314 Operand(rsp, offset * kPointerSize)); |
1317 CallStoreIC(); | 1315 CallStoreIC(); |
1318 } | 1316 } |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1909 if (expr->is_compound()) { | 1907 if (expr->is_compound()) { |
1910 // We need the receiver both on the stack and in the register. | 1908 // We need the receiver both on the stack and in the register. |
1911 VisitForStackValue(property->obj()); | 1909 VisitForStackValue(property->obj()); |
1912 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1910 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
1913 } else { | 1911 } else { |
1914 VisitForStackValue(property->obj()); | 1912 VisitForStackValue(property->obj()); |
1915 } | 1913 } |
1916 break; | 1914 break; |
1917 case NAMED_SUPER_PROPERTY: | 1915 case NAMED_SUPER_PROPERTY: |
1918 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1916 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1919 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1917 VisitForAccumulatorValue( |
| 1918 property->obj()->AsSuperReference()->home_object_var()); |
1920 __ Push(result_register()); | 1919 __ Push(result_register()); |
1921 if (expr->is_compound()) { | 1920 if (expr->is_compound()) { |
1922 __ Push(MemOperand(rsp, kPointerSize)); | 1921 __ Push(MemOperand(rsp, kPointerSize)); |
1923 __ Push(result_register()); | 1922 __ Push(result_register()); |
1924 } | 1923 } |
1925 break; | 1924 break; |
1926 case KEYED_SUPER_PROPERTY: | 1925 case KEYED_SUPER_PROPERTY: |
1927 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1926 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1928 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1927 VisitForStackValue( |
1929 __ Push(result_register()); | 1928 property->obj()->AsSuperReference()->home_object_var()); |
1930 VisitForAccumulatorValue(property->key()); | 1929 VisitForAccumulatorValue(property->key()); |
1931 __ Push(result_register()); | 1930 __ Push(result_register()); |
1932 if (expr->is_compound()) { | 1931 if (expr->is_compound()) { |
1933 __ Push(MemOperand(rsp, 2 * kPointerSize)); | 1932 __ Push(MemOperand(rsp, 2 * kPointerSize)); |
1934 __ Push(MemOperand(rsp, 2 * kPointerSize)); | 1933 __ Push(MemOperand(rsp, 2 * kPointerSize)); |
1935 __ Push(result_register()); | 1934 __ Push(result_register()); |
1936 } | 1935 } |
1937 break; | 1936 break; |
1938 case KEYED_PROPERTY: { | 1937 case KEYED_PROPERTY: { |
1939 if (expr->is_compound()) { | 1938 if (expr->is_compound()) { |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2510 __ Move(StoreDescriptor::ReceiverRegister(), rax); | 2509 __ Move(StoreDescriptor::ReceiverRegister(), rax); |
2511 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2510 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
2512 __ Move(StoreDescriptor::NameRegister(), | 2511 __ Move(StoreDescriptor::NameRegister(), |
2513 prop->key()->AsLiteral()->value()); | 2512 prop->key()->AsLiteral()->value()); |
2514 CallStoreIC(); | 2513 CallStoreIC(); |
2515 break; | 2514 break; |
2516 } | 2515 } |
2517 case NAMED_SUPER_PROPERTY: { | 2516 case NAMED_SUPER_PROPERTY: { |
2518 __ Push(rax); | 2517 __ Push(rax); |
2519 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2518 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2520 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2519 VisitForAccumulatorValue( |
| 2520 prop->obj()->AsSuperReference()->home_object_var()); |
2521 // stack: value, this; rax: home_object | 2521 // stack: value, this; rax: home_object |
2522 Register scratch = rcx; | 2522 Register scratch = rcx; |
2523 Register scratch2 = rdx; | 2523 Register scratch2 = rdx; |
2524 __ Move(scratch, result_register()); // home_object | 2524 __ Move(scratch, result_register()); // home_object |
2525 __ movp(rax, MemOperand(rsp, kPointerSize)); // value | 2525 __ movp(rax, MemOperand(rsp, kPointerSize)); // value |
2526 __ movp(scratch2, MemOperand(rsp, 0)); // this | 2526 __ movp(scratch2, MemOperand(rsp, 0)); // this |
2527 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this | 2527 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this |
2528 __ movp(MemOperand(rsp, 0), scratch); // home_object | 2528 __ movp(MemOperand(rsp, 0), scratch); // home_object |
2529 // stack: this, home_object; rax: value | 2529 // stack: this, home_object; rax: value |
2530 EmitNamedSuperPropertyStore(prop); | 2530 EmitNamedSuperPropertyStore(prop); |
2531 break; | 2531 break; |
2532 } | 2532 } |
2533 case KEYED_SUPER_PROPERTY: { | 2533 case KEYED_SUPER_PROPERTY: { |
2534 __ Push(rax); | 2534 __ Push(rax); |
2535 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2535 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2536 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2536 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
2537 __ Push(result_register()); | |
2538 VisitForAccumulatorValue(prop->key()); | 2537 VisitForAccumulatorValue(prop->key()); |
2539 Register scratch = rcx; | 2538 Register scratch = rcx; |
2540 Register scratch2 = rdx; | 2539 Register scratch2 = rdx; |
2541 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value | 2540 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value |
2542 // stack: value, this, home_object; rax: key, rdx: value | 2541 // stack: value, this, home_object; rax: key, rdx: value |
2543 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this | 2542 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this |
2544 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch); | 2543 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch); |
2545 __ movp(scratch, MemOperand(rsp, 0)); // home_object | 2544 __ movp(scratch, MemOperand(rsp, 0)); // home_object |
2546 __ movp(MemOperand(rsp, kPointerSize), scratch); | 2545 __ movp(MemOperand(rsp, kPointerSize), scratch); |
2547 __ movp(MemOperand(rsp, 0), rax); | 2546 __ movp(MemOperand(rsp, 0), rax); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2735 Expression* key = expr->key(); | 2734 Expression* key = expr->key(); |
2736 | 2735 |
2737 if (key->IsPropertyName()) { | 2736 if (key->IsPropertyName()) { |
2738 if (!expr->IsSuperAccess()) { | 2737 if (!expr->IsSuperAccess()) { |
2739 VisitForAccumulatorValue(expr->obj()); | 2738 VisitForAccumulatorValue(expr->obj()); |
2740 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); | 2739 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); |
2741 __ movp(LoadDescriptor::ReceiverRegister(), rax); | 2740 __ movp(LoadDescriptor::ReceiverRegister(), rax); |
2742 EmitNamedPropertyLoad(expr); | 2741 EmitNamedPropertyLoad(expr); |
2743 } else { | 2742 } else { |
2744 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2743 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2745 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2744 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2746 __ Push(result_register()); | |
2747 EmitNamedSuperPropertyLoad(expr); | 2745 EmitNamedSuperPropertyLoad(expr); |
2748 } | 2746 } |
2749 } else { | 2747 } else { |
2750 if (!expr->IsSuperAccess()) { | 2748 if (!expr->IsSuperAccess()) { |
2751 VisitForStackValue(expr->obj()); | 2749 VisitForStackValue(expr->obj()); |
2752 VisitForAccumulatorValue(expr->key()); | 2750 VisitForAccumulatorValue(expr->key()); |
2753 __ Move(LoadDescriptor::NameRegister(), rax); | 2751 __ Move(LoadDescriptor::NameRegister(), rax); |
2754 __ Pop(LoadDescriptor::ReceiverRegister()); | 2752 __ Pop(LoadDescriptor::ReceiverRegister()); |
2755 EmitKeyedPropertyLoad(expr); | 2753 EmitKeyedPropertyLoad(expr); |
2756 } else { | 2754 } else { |
2757 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2755 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2758 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2756 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2759 __ Push(result_register()); | |
2760 VisitForStackValue(expr->key()); | 2757 VisitForStackValue(expr->key()); |
2761 EmitKeyedSuperPropertyLoad(expr); | 2758 EmitKeyedSuperPropertyLoad(expr); |
2762 } | 2759 } |
2763 } | 2760 } |
2764 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2761 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2765 context()->Plug(rax); | 2762 context()->Plug(rax); |
2766 } | 2763 } |
2767 | 2764 |
2768 | 2765 |
2769 void FullCodeGenerator::CallIC(Handle<Code> code, | 2766 void FullCodeGenerator::CallIC(Handle<Code> code, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2808 Expression* callee = expr->expression(); | 2805 Expression* callee = expr->expression(); |
2809 DCHECK(callee->IsProperty()); | 2806 DCHECK(callee->IsProperty()); |
2810 Property* prop = callee->AsProperty(); | 2807 Property* prop = callee->AsProperty(); |
2811 DCHECK(prop->IsSuperAccess()); | 2808 DCHECK(prop->IsSuperAccess()); |
2812 | 2809 |
2813 SetSourcePosition(prop->position()); | 2810 SetSourcePosition(prop->position()); |
2814 Literal* key = prop->key()->AsLiteral(); | 2811 Literal* key = prop->key()->AsLiteral(); |
2815 DCHECK(!key->value()->IsSmi()); | 2812 DCHECK(!key->value()->IsSmi()); |
2816 // Load the function from the receiver. | 2813 // Load the function from the receiver. |
2817 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2814 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2818 EmitLoadHomeObject(super_ref); | 2815 VisitForStackValue(super_ref->home_object_var()); |
2819 __ Push(rax); | |
2820 VisitForAccumulatorValue(super_ref->this_var()); | 2816 VisitForAccumulatorValue(super_ref->this_var()); |
2821 __ Push(rax); | 2817 __ Push(rax); |
2822 __ Push(rax); | 2818 __ Push(rax); |
2823 __ Push(Operand(rsp, kPointerSize * 2)); | 2819 __ Push(Operand(rsp, kPointerSize * 2)); |
2824 __ Push(key->value()); | 2820 __ Push(key->value()); |
2825 | 2821 |
2826 // Stack here: | 2822 // Stack here: |
2827 // - home_object | 2823 // - home_object |
2828 // - this (receiver) | 2824 // - this (receiver) |
2829 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2825 // - this (receiver) <-- LoadFromSuper will pop here and below. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2866 | 2862 |
2867 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2863 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
2868 Expression* callee = expr->expression(); | 2864 Expression* callee = expr->expression(); |
2869 DCHECK(callee->IsProperty()); | 2865 DCHECK(callee->IsProperty()); |
2870 Property* prop = callee->AsProperty(); | 2866 Property* prop = callee->AsProperty(); |
2871 DCHECK(prop->IsSuperAccess()); | 2867 DCHECK(prop->IsSuperAccess()); |
2872 | 2868 |
2873 SetSourcePosition(prop->position()); | 2869 SetSourcePosition(prop->position()); |
2874 // Load the function from the receiver. | 2870 // Load the function from the receiver. |
2875 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2871 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2876 EmitLoadHomeObject(super_ref); | 2872 VisitForStackValue(super_ref->home_object_var()); |
2877 __ Push(rax); | |
2878 VisitForAccumulatorValue(super_ref->this_var()); | 2873 VisitForAccumulatorValue(super_ref->this_var()); |
2879 __ Push(rax); | 2874 __ Push(rax); |
2880 __ Push(rax); | 2875 __ Push(rax); |
2881 __ Push(Operand(rsp, kPointerSize * 2)); | 2876 __ Push(Operand(rsp, kPointerSize * 2)); |
2882 VisitForStackValue(prop->key()); | 2877 VisitForStackValue(prop->key()); |
2883 | 2878 |
2884 // Stack here: | 2879 // Stack here: |
2885 // - home_object | 2880 // - home_object |
2886 // - this (receiver) | 2881 // - this (receiver) |
2887 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2882 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
(...skipping 1873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4761 switch (assign_type) { | 4756 switch (assign_type) { |
4762 case NAMED_PROPERTY: { | 4757 case NAMED_PROPERTY: { |
4763 VisitForStackValue(prop->obj()); | 4758 VisitForStackValue(prop->obj()); |
4764 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 4759 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
4765 EmitNamedPropertyLoad(prop); | 4760 EmitNamedPropertyLoad(prop); |
4766 break; | 4761 break; |
4767 } | 4762 } |
4768 | 4763 |
4769 case NAMED_SUPER_PROPERTY: { | 4764 case NAMED_SUPER_PROPERTY: { |
4770 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4765 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4771 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4766 VisitForAccumulatorValue( |
| 4767 prop->obj()->AsSuperReference()->home_object_var()); |
4772 __ Push(result_register()); | 4768 __ Push(result_register()); |
4773 __ Push(MemOperand(rsp, kPointerSize)); | 4769 __ Push(MemOperand(rsp, kPointerSize)); |
4774 __ Push(result_register()); | 4770 __ Push(result_register()); |
4775 EmitNamedSuperPropertyLoad(prop); | 4771 EmitNamedSuperPropertyLoad(prop); |
4776 break; | 4772 break; |
4777 } | 4773 } |
4778 | 4774 |
4779 case KEYED_SUPER_PROPERTY: { | 4775 case KEYED_SUPER_PROPERTY: { |
4780 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4776 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4781 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4777 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
4782 __ Push(result_register()); | |
4783 VisitForAccumulatorValue(prop->key()); | 4778 VisitForAccumulatorValue(prop->key()); |
4784 __ Push(result_register()); | 4779 __ Push(result_register()); |
4785 __ Push(MemOperand(rsp, 2 * kPointerSize)); | 4780 __ Push(MemOperand(rsp, 2 * kPointerSize)); |
4786 __ Push(MemOperand(rsp, 2 * kPointerSize)); | 4781 __ Push(MemOperand(rsp, 2 * kPointerSize)); |
4787 __ Push(result_register()); | 4782 __ Push(result_register()); |
4788 EmitKeyedSuperPropertyLoad(prop); | 4783 EmitKeyedSuperPropertyLoad(prop); |
4789 break; | 4784 break; |
4790 } | 4785 } |
4791 | 4786 |
4792 case KEYED_PROPERTY: { | 4787 case KEYED_PROPERTY: { |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5367 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5362 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
5368 Assembler::target_address_at(call_target_address, | 5363 Assembler::target_address_at(call_target_address, |
5369 unoptimized_code)); | 5364 unoptimized_code)); |
5370 return OSR_AFTER_STACK_CHECK; | 5365 return OSR_AFTER_STACK_CHECK; |
5371 } | 5366 } |
5372 | 5367 |
5373 | 5368 |
5374 } } // namespace v8::internal | 5369 } } // namespace v8::internal |
5375 | 5370 |
5376 #endif // V8_TARGET_ARCH_X64 | 5371 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |