Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: src/x64/full-codegen-x64.cc

Issue 1135243004: [es6] Support super.property in eval and arrow functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Try feedback slot Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 Variable* home_object_var = scope()->home_object_var();
305 if (home_object_var != nullptr) {
306 Comment cmnt(masm_, "[ Home object");
307 if (function_in_register) {
308 __ movp(LoadDescriptor::ReceiverRegister(), rdi);
309 } else {
310 __ movp(LoadDescriptor::ReceiverRegister(),
311 Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
312 }
313 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
314 __ Move(LoadDescriptor::NameRegister(), home_object_symbol);
315
316 if (FLAG_vector_ics) {
317 __ Move(VectorLoadICDescriptor::SlotRegister(),
318 SmiFromSlot(function()->HomeObjectFeedbackSlot()));
319 }
320 CallLoadIC(NOT_CONTEXTUAL);
321
322 SetVar(home_object_var, rax, rbx, rdx);
323 }
324
325
304 if (FLAG_trace) { 326 if (FLAG_trace) {
305 __ CallRuntime(Runtime::kTraceEnter, 0); 327 __ CallRuntime(Runtime::kTraceEnter, 0);
306 } 328 }
307 329
308 // Visit the declarations and body unless there is an illegal 330 // Visit the declarations and body unless there is an illegal
309 // redeclaration. 331 // redeclaration.
310 if (scope()->HasIllegalRedeclaration()) { 332 if (scope()->HasIllegalRedeclaration()) {
311 Comment cmnt(masm_, "[ Declarations"); 333 Comment cmnt(masm_, "[ Declarations");
312 scope()->VisitIllegalRedeclaration(this); 334 scope()->VisitIllegalRedeclaration(this);
313 335
(...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 context()->Plug(rax); 1300 context()->Plug(rax);
1279 } 1301 }
1280 1302
1281 1303
1282 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { 1304 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
1283 Comment cmnt(masm_, "[ VariableProxy"); 1305 Comment cmnt(masm_, "[ VariableProxy");
1284 EmitVariableLoad(expr); 1306 EmitVariableLoad(expr);
1285 } 1307 }
1286 1308
1287 1309
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 if (FLAG_vector_ics) {
1298 __ Move(VectorLoadICDescriptor::SlotRegister(),
1299 SmiFromSlot(expr->HomeObjectFeedbackSlot()));
1300 CallLoadIC(NOT_CONTEXTUAL);
1301 } else {
1302 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
1303 }
1304
1305
1306 __ Cmp(rax, isolate()->factory()->undefined_value());
1307 Label done;
1308 __ j(not_equal, &done);
1309 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1310 __ bind(&done);
1311 }
1312
1313
1314 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, 1310 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
1315 int offset) { 1311 int offset) {
1316 if (NeedsHomeObject(initializer)) { 1312 if (NeedsHomeObject(initializer)) {
1317 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); 1313 __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0));
1318 __ Move(StoreDescriptor::NameRegister(), 1314 __ Move(StoreDescriptor::NameRegister(),
1319 isolate()->factory()->home_object_symbol()); 1315 isolate()->factory()->home_object_symbol());
1320 __ movp(StoreDescriptor::ValueRegister(), 1316 __ movp(StoreDescriptor::ValueRegister(),
1321 Operand(rsp, offset * kPointerSize)); 1317 Operand(rsp, offset * kPointerSize));
1322 CallStoreIC(); 1318 CallStoreIC();
1323 } 1319 }
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 if (expr->is_compound()) { 1914 if (expr->is_compound()) {
1919 // We need the receiver both on the stack and in the register. 1915 // We need the receiver both on the stack and in the register.
1920 VisitForStackValue(property->obj()); 1916 VisitForStackValue(property->obj());
1921 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); 1917 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0));
1922 } else { 1918 } else {
1923 VisitForStackValue(property->obj()); 1919 VisitForStackValue(property->obj());
1924 } 1920 }
1925 break; 1921 break;
1926 case NAMED_SUPER_PROPERTY: 1922 case NAMED_SUPER_PROPERTY:
1927 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1923 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1928 EmitLoadHomeObject(property->obj()->AsSuperReference()); 1924 VisitForAccumulatorValue(
1925 property->obj()->AsSuperReference()->home_object_var());
1929 __ Push(result_register()); 1926 __ Push(result_register());
1930 if (expr->is_compound()) { 1927 if (expr->is_compound()) {
1931 __ Push(MemOperand(rsp, kPointerSize)); 1928 __ Push(MemOperand(rsp, kPointerSize));
1932 __ Push(result_register()); 1929 __ Push(result_register());
1933 } 1930 }
1934 break; 1931 break;
1935 case KEYED_SUPER_PROPERTY: 1932 case KEYED_SUPER_PROPERTY:
1936 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1933 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1937 EmitLoadHomeObject(property->obj()->AsSuperReference()); 1934 VisitForStackValue(
1938 __ Push(result_register()); 1935 property->obj()->AsSuperReference()->home_object_var());
1939 VisitForAccumulatorValue(property->key()); 1936 VisitForAccumulatorValue(property->key());
1940 __ Push(result_register()); 1937 __ Push(result_register());
1941 if (expr->is_compound()) { 1938 if (expr->is_compound()) {
1942 __ Push(MemOperand(rsp, 2 * kPointerSize)); 1939 __ Push(MemOperand(rsp, 2 * kPointerSize));
1943 __ Push(MemOperand(rsp, 2 * kPointerSize)); 1940 __ Push(MemOperand(rsp, 2 * kPointerSize));
1944 __ Push(result_register()); 1941 __ Push(result_register());
1945 } 1942 }
1946 break; 1943 break;
1947 case KEYED_PROPERTY: { 1944 case KEYED_PROPERTY: {
1948 if (expr->is_compound()) { 1945 if (expr->is_compound()) {
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
2533 __ Move(StoreDescriptor::ReceiverRegister(), rax); 2530 __ Move(StoreDescriptor::ReceiverRegister(), rax);
2534 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. 2531 __ Pop(StoreDescriptor::ValueRegister()); // Restore value.
2535 __ Move(StoreDescriptor::NameRegister(), 2532 __ Move(StoreDescriptor::NameRegister(),
2536 prop->key()->AsLiteral()->value()); 2533 prop->key()->AsLiteral()->value());
2537 CallStoreIC(); 2534 CallStoreIC();
2538 break; 2535 break;
2539 } 2536 }
2540 case NAMED_SUPER_PROPERTY: { 2537 case NAMED_SUPER_PROPERTY: {
2541 __ Push(rax); 2538 __ Push(rax);
2542 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2539 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2543 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 2540 VisitForAccumulatorValue(
2541 prop->obj()->AsSuperReference()->home_object_var());
2544 // stack: value, this; rax: home_object 2542 // stack: value, this; rax: home_object
2545 Register scratch = rcx; 2543 Register scratch = rcx;
2546 Register scratch2 = rdx; 2544 Register scratch2 = rdx;
2547 __ Move(scratch, result_register()); // home_object 2545 __ Move(scratch, result_register()); // home_object
2548 __ movp(rax, MemOperand(rsp, kPointerSize)); // value 2546 __ movp(rax, MemOperand(rsp, kPointerSize)); // value
2549 __ movp(scratch2, MemOperand(rsp, 0)); // this 2547 __ movp(scratch2, MemOperand(rsp, 0)); // this
2550 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this 2548 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this
2551 __ movp(MemOperand(rsp, 0), scratch); // home_object 2549 __ movp(MemOperand(rsp, 0), scratch); // home_object
2552 // stack: this, home_object; rax: value 2550 // stack: this, home_object; rax: value
2553 EmitNamedSuperPropertyStore(prop); 2551 EmitNamedSuperPropertyStore(prop);
2554 break; 2552 break;
2555 } 2553 }
2556 case KEYED_SUPER_PROPERTY: { 2554 case KEYED_SUPER_PROPERTY: {
2557 __ Push(rax); 2555 __ Push(rax);
2558 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2556 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2559 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 2557 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var());
2560 __ Push(result_register());
2561 VisitForAccumulatorValue(prop->key()); 2558 VisitForAccumulatorValue(prop->key());
2562 Register scratch = rcx; 2559 Register scratch = rcx;
2563 Register scratch2 = rdx; 2560 Register scratch2 = rdx;
2564 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value 2561 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value
2565 // stack: value, this, home_object; rax: key, rdx: value 2562 // stack: value, this, home_object; rax: key, rdx: value
2566 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this 2563 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this
2567 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch); 2564 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch);
2568 __ movp(scratch, MemOperand(rsp, 0)); // home_object 2565 __ movp(scratch, MemOperand(rsp, 0)); // home_object
2569 __ movp(MemOperand(rsp, kPointerSize), scratch); 2566 __ movp(MemOperand(rsp, kPointerSize), scratch);
2570 __ movp(MemOperand(rsp, 0), rax); 2567 __ movp(MemOperand(rsp, 0), rax);
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
2758 Expression* key = expr->key(); 2755 Expression* key = expr->key();
2759 2756
2760 if (key->IsPropertyName()) { 2757 if (key->IsPropertyName()) {
2761 if (!expr->IsSuperAccess()) { 2758 if (!expr->IsSuperAccess()) {
2762 VisitForAccumulatorValue(expr->obj()); 2759 VisitForAccumulatorValue(expr->obj());
2763 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); 2760 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister()));
2764 __ movp(LoadDescriptor::ReceiverRegister(), rax); 2761 __ movp(LoadDescriptor::ReceiverRegister(), rax);
2765 EmitNamedPropertyLoad(expr); 2762 EmitNamedPropertyLoad(expr);
2766 } else { 2763 } else {
2767 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2764 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2768 EmitLoadHomeObject(expr->obj()->AsSuperReference()); 2765 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var());
2769 __ Push(result_register());
2770 EmitNamedSuperPropertyLoad(expr); 2766 EmitNamedSuperPropertyLoad(expr);
2771 } 2767 }
2772 } else { 2768 } else {
2773 if (!expr->IsSuperAccess()) { 2769 if (!expr->IsSuperAccess()) {
2774 VisitForStackValue(expr->obj()); 2770 VisitForStackValue(expr->obj());
2775 VisitForAccumulatorValue(expr->key()); 2771 VisitForAccumulatorValue(expr->key());
2776 __ Move(LoadDescriptor::NameRegister(), rax); 2772 __ Move(LoadDescriptor::NameRegister(), rax);
2777 __ Pop(LoadDescriptor::ReceiverRegister()); 2773 __ Pop(LoadDescriptor::ReceiverRegister());
2778 EmitKeyedPropertyLoad(expr); 2774 EmitKeyedPropertyLoad(expr);
2779 } else { 2775 } else {
2780 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2776 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2781 EmitLoadHomeObject(expr->obj()->AsSuperReference()); 2777 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var());
2782 __ Push(result_register());
2783 VisitForStackValue(expr->key()); 2778 VisitForStackValue(expr->key());
2784 EmitKeyedSuperPropertyLoad(expr); 2779 EmitKeyedSuperPropertyLoad(expr);
2785 } 2780 }
2786 } 2781 }
2787 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2782 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2788 context()->Plug(rax); 2783 context()->Plug(rax);
2789 } 2784 }
2790 2785
2791 2786
2792 void FullCodeGenerator::CallIC(Handle<Code> code, 2787 void FullCodeGenerator::CallIC(Handle<Code> code,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2831 Expression* callee = expr->expression(); 2826 Expression* callee = expr->expression();
2832 DCHECK(callee->IsProperty()); 2827 DCHECK(callee->IsProperty());
2833 Property* prop = callee->AsProperty(); 2828 Property* prop = callee->AsProperty();
2834 DCHECK(prop->IsSuperAccess()); 2829 DCHECK(prop->IsSuperAccess());
2835 2830
2836 SetSourcePosition(prop->position()); 2831 SetSourcePosition(prop->position());
2837 Literal* key = prop->key()->AsLiteral(); 2832 Literal* key = prop->key()->AsLiteral();
2838 DCHECK(!key->value()->IsSmi()); 2833 DCHECK(!key->value()->IsSmi());
2839 // Load the function from the receiver. 2834 // Load the function from the receiver.
2840 SuperReference* super_ref = prop->obj()->AsSuperReference(); 2835 SuperReference* super_ref = prop->obj()->AsSuperReference();
2841 EmitLoadHomeObject(super_ref); 2836 VisitForStackValue(super_ref->home_object_var());
2842 __ Push(rax);
2843 VisitForAccumulatorValue(super_ref->this_var()); 2837 VisitForAccumulatorValue(super_ref->this_var());
2844 __ Push(rax); 2838 __ Push(rax);
2845 __ Push(rax); 2839 __ Push(rax);
2846 __ Push(Operand(rsp, kPointerSize * 2)); 2840 __ Push(Operand(rsp, kPointerSize * 2));
2847 __ Push(key->value()); 2841 __ Push(key->value());
2848 2842
2849 // Stack here: 2843 // Stack here:
2850 // - home_object 2844 // - home_object
2851 // - this (receiver) 2845 // - this (receiver)
2852 // - this (receiver) <-- LoadFromSuper will pop here and below. 2846 // - this (receiver) <-- LoadFromSuper will pop here and below.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2889 2883
2890 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { 2884 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
2891 Expression* callee = expr->expression(); 2885 Expression* callee = expr->expression();
2892 DCHECK(callee->IsProperty()); 2886 DCHECK(callee->IsProperty());
2893 Property* prop = callee->AsProperty(); 2887 Property* prop = callee->AsProperty();
2894 DCHECK(prop->IsSuperAccess()); 2888 DCHECK(prop->IsSuperAccess());
2895 2889
2896 SetSourcePosition(prop->position()); 2890 SetSourcePosition(prop->position());
2897 // Load the function from the receiver. 2891 // Load the function from the receiver.
2898 SuperReference* super_ref = prop->obj()->AsSuperReference(); 2892 SuperReference* super_ref = prop->obj()->AsSuperReference();
2899 EmitLoadHomeObject(super_ref); 2893 VisitForStackValue(super_ref->home_object_var());
2900 __ Push(rax);
2901 VisitForAccumulatorValue(super_ref->this_var()); 2894 VisitForAccumulatorValue(super_ref->this_var());
2902 __ Push(rax); 2895 __ Push(rax);
2903 __ Push(rax); 2896 __ Push(rax);
2904 __ Push(Operand(rsp, kPointerSize * 2)); 2897 __ Push(Operand(rsp, kPointerSize * 2));
2905 VisitForStackValue(prop->key()); 2898 VisitForStackValue(prop->key());
2906 2899
2907 // Stack here: 2900 // Stack here:
2908 // - home_object 2901 // - home_object
2909 // - this (receiver) 2902 // - this (receiver)
2910 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. 2903 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
(...skipping 1877 matching lines...) Expand 10 before | Expand all | Expand 10 after
4788 switch (assign_type) { 4781 switch (assign_type) {
4789 case NAMED_PROPERTY: { 4782 case NAMED_PROPERTY: {
4790 VisitForStackValue(prop->obj()); 4783 VisitForStackValue(prop->obj());
4791 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); 4784 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0));
4792 EmitNamedPropertyLoad(prop); 4785 EmitNamedPropertyLoad(prop);
4793 break; 4786 break;
4794 } 4787 }
4795 4788
4796 case NAMED_SUPER_PROPERTY: { 4789 case NAMED_SUPER_PROPERTY: {
4797 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4790 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4798 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 4791 VisitForAccumulatorValue(
4792 prop->obj()->AsSuperReference()->home_object_var());
4799 __ Push(result_register()); 4793 __ Push(result_register());
4800 __ Push(MemOperand(rsp, kPointerSize)); 4794 __ Push(MemOperand(rsp, kPointerSize));
4801 __ Push(result_register()); 4795 __ Push(result_register());
4802 EmitNamedSuperPropertyLoad(prop); 4796 EmitNamedSuperPropertyLoad(prop);
4803 break; 4797 break;
4804 } 4798 }
4805 4799
4806 case KEYED_SUPER_PROPERTY: { 4800 case KEYED_SUPER_PROPERTY: {
4807 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4801 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4808 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 4802 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var());
4809 __ Push(result_register());
4810 VisitForAccumulatorValue(prop->key()); 4803 VisitForAccumulatorValue(prop->key());
4811 __ Push(result_register()); 4804 __ Push(result_register());
4812 __ Push(MemOperand(rsp, 2 * kPointerSize)); 4805 __ Push(MemOperand(rsp, 2 * kPointerSize));
4813 __ Push(MemOperand(rsp, 2 * kPointerSize)); 4806 __ Push(MemOperand(rsp, 2 * kPointerSize));
4814 __ Push(result_register()); 4807 __ Push(result_register());
4815 EmitKeyedSuperPropertyLoad(prop); 4808 EmitKeyedSuperPropertyLoad(prop);
4816 break; 4809 break;
4817 } 4810 }
4818 4811
4819 case KEYED_PROPERTY: { 4812 case KEYED_PROPERTY: {
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
5395 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), 5388 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(),
5396 Assembler::target_address_at(call_target_address, 5389 Assembler::target_address_at(call_target_address,
5397 unoptimized_code)); 5390 unoptimized_code));
5398 return OSR_AFTER_STACK_CHECK; 5391 return OSR_AFTER_STACK_CHECK;
5399 } 5392 }
5400 5393
5401 5394
5402 } } // namespace v8::internal 5395 } } // namespace v8::internal
5403 5396
5404 #endif // V8_TARGET_ARCH_X64 5397 #endif // V8_TARGET_ARCH_X64
OLDNEW
« src/ast-numbering.cc ('K') | « src/scopes.cc ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698