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

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

Issue 1154103005: Refactor lexical home object binding (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git rebase Created 5 years, 6 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
« no previous file with comments | « src/scopes.cc ('k') | src/x87/full-codegen-x87.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
242 // Possibly set up a local binding to the this function which is used in 237 // Possibly set up a local binding to the this function which is used in
243 // derived constructors with super calls. 238 // derived constructors with super calls.
244 Variable* this_function_var = scope()->this_function_var(); 239 Variable* this_function_var = scope()->this_function_var();
245 if (this_function_var != nullptr) { 240 if (this_function_var != nullptr) {
246 Comment cmnt(masm_, "[ This function"); 241 Comment cmnt(masm_, "[ This function");
247 SetVar(this_function_var, rdi, rbx, rdx); 242 SetVar(this_function_var, rdi, rbx, rdx);
248 } 243 }
249 244
250 Variable* new_target_var = scope()->new_target_var(); 245 Variable* new_target_var = scope()->new_target_var();
251 if (new_target_var != nullptr) { 246 if (new_target_var != nullptr) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; 313 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW;
319 } else { 314 } else {
320 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; 315 type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
321 } 316 }
322 ArgumentsAccessStub stub(isolate(), type, has_new_target); 317 ArgumentsAccessStub stub(isolate(), type, has_new_target);
323 __ CallStub(&stub); 318 __ CallStub(&stub);
324 319
325 SetVar(arguments, rax, rbx, rdx); 320 SetVar(arguments, rax, rbx, rdx);
326 } 321 }
327 322
328 // Possibly set up a local binding to the [[HomeObject]].
329 if (home_object_var != nullptr) {
330 Comment cmnt(masm_, "[ Home object");
331 __ Pop(LoadDescriptor::ReceiverRegister());
332 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
333 __ Move(LoadDescriptor::NameRegister(), home_object_symbol);
334 __ Move(LoadDescriptor::SlotRegister(),
335 SmiFromSlot(function()->HomeObjectFeedbackSlot()));
336 CallLoadIC(NOT_CONTEXTUAL);
337
338 SetVar(home_object_var, rax, rbx, rdx);
339 }
340
341 if (FLAG_trace) { 323 if (FLAG_trace) {
342 __ CallRuntime(Runtime::kTraceEnter, 0); 324 __ CallRuntime(Runtime::kTraceEnter, 0);
343 } 325 }
344 326
345 // Visit the declarations and body unless there is an illegal 327 // Visit the declarations and body unless there is an illegal
346 // redeclaration. 328 // redeclaration.
347 if (scope()->HasIllegalRedeclaration()) { 329 if (scope()->HasIllegalRedeclaration()) {
348 Comment cmnt(masm_, "[ Declarations"); 330 Comment cmnt(masm_, "[ Declarations");
349 scope()->VisitIllegalRedeclaration(this); 331 scope()->VisitIllegalRedeclaration(this);
350 332
(...skipping 1622 matching lines...) Expand 10 before | Expand all | Expand 10 after
1973 VisitForStackValue(property->obj()); 1955 VisitForStackValue(property->obj());
1974 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); 1956 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0));
1975 } else { 1957 } else {
1976 VisitForStackValue(property->obj()); 1958 VisitForStackValue(property->obj());
1977 } 1959 }
1978 break; 1960 break;
1979 case NAMED_SUPER_PROPERTY: 1961 case NAMED_SUPER_PROPERTY:
1980 VisitForStackValue( 1962 VisitForStackValue(
1981 property->obj()->AsSuperPropertyReference()->this_var()); 1963 property->obj()->AsSuperPropertyReference()->this_var());
1982 VisitForAccumulatorValue( 1964 VisitForAccumulatorValue(
1983 property->obj()->AsSuperPropertyReference()->home_object_var()); 1965 property->obj()->AsSuperPropertyReference()->home_object());
1984 __ Push(result_register()); 1966 __ Push(result_register());
1985 if (expr->is_compound()) { 1967 if (expr->is_compound()) {
1986 __ Push(MemOperand(rsp, kPointerSize)); 1968 __ Push(MemOperand(rsp, kPointerSize));
1987 __ Push(result_register()); 1969 __ Push(result_register());
1988 } 1970 }
1989 break; 1971 break;
1990 case KEYED_SUPER_PROPERTY: 1972 case KEYED_SUPER_PROPERTY:
1991 VisitForStackValue( 1973 VisitForStackValue(
1992 property->obj()->AsSuperPropertyReference()->this_var()); 1974 property->obj()->AsSuperPropertyReference()->this_var());
1993 VisitForStackValue( 1975 VisitForStackValue(
1994 property->obj()->AsSuperPropertyReference()->home_object_var()); 1976 property->obj()->AsSuperPropertyReference()->home_object());
1995 VisitForAccumulatorValue(property->key()); 1977 VisitForAccumulatorValue(property->key());
1996 __ Push(result_register()); 1978 __ Push(result_register());
1997 if (expr->is_compound()) { 1979 if (expr->is_compound()) {
1998 __ Push(MemOperand(rsp, 2 * kPointerSize)); 1980 __ Push(MemOperand(rsp, 2 * kPointerSize));
1999 __ Push(MemOperand(rsp, 2 * kPointerSize)); 1981 __ Push(MemOperand(rsp, 2 * kPointerSize));
2000 __ Push(result_register()); 1982 __ Push(result_register());
2001 } 1983 }
2002 break; 1984 break;
2003 case KEYED_PROPERTY: { 1985 case KEYED_PROPERTY: {
2004 if (expr->is_compound()) { 1986 if (expr->is_compound()) {
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
2578 __ Move(StoreDescriptor::NameRegister(), 2560 __ Move(StoreDescriptor::NameRegister(),
2579 prop->key()->AsLiteral()->value()); 2561 prop->key()->AsLiteral()->value());
2580 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); 2562 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
2581 CallStoreIC(); 2563 CallStoreIC();
2582 break; 2564 break;
2583 } 2565 }
2584 case NAMED_SUPER_PROPERTY: { 2566 case NAMED_SUPER_PROPERTY: {
2585 __ Push(rax); 2567 __ Push(rax);
2586 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2568 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2587 VisitForAccumulatorValue( 2569 VisitForAccumulatorValue(
2588 prop->obj()->AsSuperPropertyReference()->home_object_var()); 2570 prop->obj()->AsSuperPropertyReference()->home_object());
2589 // stack: value, this; rax: home_object 2571 // stack: value, this; rax: home_object
2590 Register scratch = rcx; 2572 Register scratch = rcx;
2591 Register scratch2 = rdx; 2573 Register scratch2 = rdx;
2592 __ Move(scratch, result_register()); // home_object 2574 __ Move(scratch, result_register()); // home_object
2593 __ movp(rax, MemOperand(rsp, kPointerSize)); // value 2575 __ movp(rax, MemOperand(rsp, kPointerSize)); // value
2594 __ movp(scratch2, MemOperand(rsp, 0)); // this 2576 __ movp(scratch2, MemOperand(rsp, 0)); // this
2595 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this 2577 __ movp(MemOperand(rsp, kPointerSize), scratch2); // this
2596 __ movp(MemOperand(rsp, 0), scratch); // home_object 2578 __ movp(MemOperand(rsp, 0), scratch); // home_object
2597 // stack: this, home_object; rax: value 2579 // stack: this, home_object; rax: value
2598 EmitNamedSuperPropertyStore(prop); 2580 EmitNamedSuperPropertyStore(prop);
2599 break; 2581 break;
2600 } 2582 }
2601 case KEYED_SUPER_PROPERTY: { 2583 case KEYED_SUPER_PROPERTY: {
2602 __ Push(rax); 2584 __ Push(rax);
2603 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 2585 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2604 VisitForStackValue( 2586 VisitForStackValue(
2605 prop->obj()->AsSuperPropertyReference()->home_object_var()); 2587 prop->obj()->AsSuperPropertyReference()->home_object());
2606 VisitForAccumulatorValue(prop->key()); 2588 VisitForAccumulatorValue(prop->key());
2607 Register scratch = rcx; 2589 Register scratch = rcx;
2608 Register scratch2 = rdx; 2590 Register scratch2 = rdx;
2609 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value 2591 __ movp(scratch2, MemOperand(rsp, 2 * kPointerSize)); // value
2610 // stack: value, this, home_object; rax: key, rdx: value 2592 // stack: value, this, home_object; rax: key, rdx: value
2611 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this 2593 __ movp(scratch, MemOperand(rsp, kPointerSize)); // this
2612 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch); 2594 __ movp(MemOperand(rsp, 2 * kPointerSize), scratch);
2613 __ movp(scratch, MemOperand(rsp, 0)); // home_object 2595 __ movp(scratch, MemOperand(rsp, 0)); // home_object
2614 __ movp(MemOperand(rsp, kPointerSize), scratch); 2596 __ movp(MemOperand(rsp, kPointerSize), scratch);
2615 __ movp(MemOperand(rsp, 0), rax); 2597 __ movp(MemOperand(rsp, 0), rax);
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2816 2798
2817 if (key->IsPropertyName()) { 2799 if (key->IsPropertyName()) {
2818 if (!expr->IsSuperAccess()) { 2800 if (!expr->IsSuperAccess()) {
2819 VisitForAccumulatorValue(expr->obj()); 2801 VisitForAccumulatorValue(expr->obj());
2820 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); 2802 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister()));
2821 __ movp(LoadDescriptor::ReceiverRegister(), rax); 2803 __ movp(LoadDescriptor::ReceiverRegister(), rax);
2822 EmitNamedPropertyLoad(expr); 2804 EmitNamedPropertyLoad(expr);
2823 } else { 2805 } else {
2824 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); 2806 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var());
2825 VisitForStackValue( 2807 VisitForStackValue(
2826 expr->obj()->AsSuperPropertyReference()->home_object_var()); 2808 expr->obj()->AsSuperPropertyReference()->home_object());
2827 EmitNamedSuperPropertyLoad(expr); 2809 EmitNamedSuperPropertyLoad(expr);
2828 } 2810 }
2829 } else { 2811 } else {
2830 if (!expr->IsSuperAccess()) { 2812 if (!expr->IsSuperAccess()) {
2831 VisitForStackValue(expr->obj()); 2813 VisitForStackValue(expr->obj());
2832 VisitForAccumulatorValue(expr->key()); 2814 VisitForAccumulatorValue(expr->key());
2833 __ Move(LoadDescriptor::NameRegister(), rax); 2815 __ Move(LoadDescriptor::NameRegister(), rax);
2834 __ Pop(LoadDescriptor::ReceiverRegister()); 2816 __ Pop(LoadDescriptor::ReceiverRegister());
2835 EmitKeyedPropertyLoad(expr); 2817 EmitKeyedPropertyLoad(expr);
2836 } else { 2818 } else {
2837 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var()); 2819 VisitForStackValue(expr->obj()->AsSuperPropertyReference()->this_var());
2838 VisitForStackValue( 2820 VisitForStackValue(
2839 expr->obj()->AsSuperPropertyReference()->home_object_var()); 2821 expr->obj()->AsSuperPropertyReference()->home_object());
2840 VisitForStackValue(expr->key()); 2822 VisitForStackValue(expr->key());
2841 EmitKeyedSuperPropertyLoad(expr); 2823 EmitKeyedSuperPropertyLoad(expr);
2842 } 2824 }
2843 } 2825 }
2844 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2826 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2845 context()->Plug(rax); 2827 context()->Plug(rax);
2846 } 2828 }
2847 2829
2848 2830
2849 void FullCodeGenerator::CallIC(Handle<Code> code, 2831 void FullCodeGenerator::CallIC(Handle<Code> code,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2888 Expression* callee = expr->expression(); 2870 Expression* callee = expr->expression();
2889 DCHECK(callee->IsProperty()); 2871 DCHECK(callee->IsProperty());
2890 Property* prop = callee->AsProperty(); 2872 Property* prop = callee->AsProperty();
2891 DCHECK(prop->IsSuperAccess()); 2873 DCHECK(prop->IsSuperAccess());
2892 2874
2893 SetSourcePosition(prop->position()); 2875 SetSourcePosition(prop->position());
2894 Literal* key = prop->key()->AsLiteral(); 2876 Literal* key = prop->key()->AsLiteral();
2895 DCHECK(!key->value()->IsSmi()); 2877 DCHECK(!key->value()->IsSmi());
2896 // Load the function from the receiver. 2878 // Load the function from the receiver.
2897 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); 2879 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
2898 VisitForStackValue(super_ref->home_object_var()); 2880 VisitForStackValue(super_ref->home_object());
2899 VisitForAccumulatorValue(super_ref->this_var()); 2881 VisitForAccumulatorValue(super_ref->this_var());
2900 __ Push(rax); 2882 __ Push(rax);
2901 __ Push(rax); 2883 __ Push(rax);
2902 __ Push(Operand(rsp, kPointerSize * 2)); 2884 __ Push(Operand(rsp, kPointerSize * 2));
2903 __ Push(key->value()); 2885 __ Push(key->value());
2904 2886
2905 // Stack here: 2887 // Stack here:
2906 // - home_object 2888 // - home_object
2907 // - this (receiver) 2889 // - this (receiver)
2908 // - this (receiver) <-- LoadFromSuper will pop here and below. 2890 // - this (receiver) <-- LoadFromSuper will pop here and below.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 2927
2946 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { 2928 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
2947 Expression* callee = expr->expression(); 2929 Expression* callee = expr->expression();
2948 DCHECK(callee->IsProperty()); 2930 DCHECK(callee->IsProperty());
2949 Property* prop = callee->AsProperty(); 2931 Property* prop = callee->AsProperty();
2950 DCHECK(prop->IsSuperAccess()); 2932 DCHECK(prop->IsSuperAccess());
2951 2933
2952 SetSourcePosition(prop->position()); 2934 SetSourcePosition(prop->position());
2953 // Load the function from the receiver. 2935 // Load the function from the receiver.
2954 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference(); 2936 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
2955 VisitForStackValue(super_ref->home_object_var()); 2937 VisitForStackValue(super_ref->home_object());
2956 VisitForAccumulatorValue(super_ref->this_var()); 2938 VisitForAccumulatorValue(super_ref->this_var());
2957 __ Push(rax); 2939 __ Push(rax);
2958 __ Push(rax); 2940 __ Push(rax);
2959 __ Push(Operand(rsp, kPointerSize * 2)); 2941 __ Push(Operand(rsp, kPointerSize * 2));
2960 VisitForStackValue(prop->key()); 2942 VisitForStackValue(prop->key());
2961 2943
2962 // Stack here: 2944 // Stack here:
2963 // - home_object 2945 // - home_object
2964 // - this (receiver) 2946 // - this (receiver)
2965 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. 2947 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
(...skipping 1899 matching lines...) Expand 10 before | Expand all | Expand 10 after
4865 case NAMED_PROPERTY: { 4847 case NAMED_PROPERTY: {
4866 VisitForStackValue(prop->obj()); 4848 VisitForStackValue(prop->obj());
4867 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); 4849 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0));
4868 EmitNamedPropertyLoad(prop); 4850 EmitNamedPropertyLoad(prop);
4869 break; 4851 break;
4870 } 4852 }
4871 4853
4872 case NAMED_SUPER_PROPERTY: { 4854 case NAMED_SUPER_PROPERTY: {
4873 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 4855 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
4874 VisitForAccumulatorValue( 4856 VisitForAccumulatorValue(
4875 prop->obj()->AsSuperPropertyReference()->home_object_var()); 4857 prop->obj()->AsSuperPropertyReference()->home_object());
4876 __ Push(result_register()); 4858 __ Push(result_register());
4877 __ Push(MemOperand(rsp, kPointerSize)); 4859 __ Push(MemOperand(rsp, kPointerSize));
4878 __ Push(result_register()); 4860 __ Push(result_register());
4879 EmitNamedSuperPropertyLoad(prop); 4861 EmitNamedSuperPropertyLoad(prop);
4880 break; 4862 break;
4881 } 4863 }
4882 4864
4883 case KEYED_SUPER_PROPERTY: { 4865 case KEYED_SUPER_PROPERTY: {
4884 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var()); 4866 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
4885 VisitForStackValue( 4867 VisitForStackValue(
4886 prop->obj()->AsSuperPropertyReference()->home_object_var()); 4868 prop->obj()->AsSuperPropertyReference()->home_object());
4887 VisitForAccumulatorValue(prop->key()); 4869 VisitForAccumulatorValue(prop->key());
4888 __ Push(result_register()); 4870 __ Push(result_register());
4889 __ Push(MemOperand(rsp, 2 * kPointerSize)); 4871 __ Push(MemOperand(rsp, 2 * kPointerSize));
4890 __ Push(MemOperand(rsp, 2 * kPointerSize)); 4872 __ Push(MemOperand(rsp, 2 * kPointerSize));
4891 __ Push(result_register()); 4873 __ Push(result_register());
4892 EmitKeyedSuperPropertyLoad(prop); 4874 EmitKeyedSuperPropertyLoad(prop);
4893 break; 4875 break;
4894 } 4876 }
4895 4877
4896 case KEYED_PROPERTY: { 4878 case KEYED_PROPERTY: {
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
5499 Assembler::target_address_at(call_target_address, 5481 Assembler::target_address_at(call_target_address,
5500 unoptimized_code)); 5482 unoptimized_code));
5501 return OSR_AFTER_STACK_CHECK; 5483 return OSR_AFTER_STACK_CHECK;
5502 } 5484 }
5503 5485
5504 5486
5505 } // namespace internal 5487 } // namespace internal
5506 } // namespace v8 5488 } // namespace v8
5507 5489
5508 #endif // V8_TARGET_ARCH_X64 5490 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/scopes.cc ('k') | src/x87/full-codegen-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698