Chromium Code Reviews| 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 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 294 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
| 295 } else { | 295 } else { |
| 296 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 296 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| 297 } | 297 } |
| 298 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 298 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
| 299 __ CallStub(&stub); | 299 __ CallStub(&stub); |
| 300 | 300 |
| 301 SetVar(arguments, rax, rbx, rdx); | 301 SetVar(arguments, rax, rbx, rdx); |
| 302 } | 302 } |
| 303 | 303 |
| 304 // Possibly set up a local binding to the [[HomeObject]]. | |
| 305 Variable* home_object_var = scope()->home_object_var(); | |
| 306 if (home_object_var != nullptr) { | |
| 307 Comment cmnt(masm_, "[ Home object"); | |
| 308 if (function_in_register) { | |
| 309 __ movp(LoadDescriptor::ReceiverRegister(), rdi); | |
|
arv (Not doing code reviews)
2015/05/21 19:42:42
Caitlin, I think the problem is that rdi no longer
caitp (gmail)
2015/05/21 19:47:51
interesting --- so, I would expect `rdi` to be sav
caitp (gmail)
2015/05/21 20:32:35
TIL rdi is not caller-saved on x86/x86_64. Maybe i
| |
| 310 } else { | |
| 311 __ movp(LoadDescriptor::ReceiverRegister(), | |
| 312 Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | |
| 313 } | |
| 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 |