Chromium Code Reviews| Index: src/x64/full-codegen-x64.cc |
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
| index 463fbdc0dc5e125993c1a37f99beb64366482afe..01a5ad0a679ed8d727208f524c19005b01f1d41a 100644 |
| --- a/src/x64/full-codegen-x64.cc |
| +++ b/src/x64/full-codegen-x64.cc |
| @@ -301,6 +301,25 @@ void FullCodeGenerator::Generate() { |
| SetVar(arguments, rax, rbx, rdx); |
| } |
| + // Possibly set up a local binding to the [[HomeObject]]. |
| + Variable* home_object_var = scope()->home_object_var(); |
| + if (home_object_var != nullptr) { |
| + Comment cmnt(masm_, "[ Home object"); |
| + if (function_in_register) { |
| + __ 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
|
| + } else { |
| + __ movp(LoadDescriptor::ReceiverRegister(), |
| + Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); |
| + } |
| + Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| + __ Move(LoadDescriptor::NameRegister(), home_object_symbol); |
| + __ Move(LoadDescriptor::SlotRegister(), |
| + SmiFromSlot(function()->HomeObjectFeedbackSlot())); |
| + CallLoadIC(NOT_CONTEXTUAL); |
| + |
| + SetVar(home_object_var, rax, rbx, rdx); |
| + } |
| + |
| if (FLAG_trace) { |
| __ CallRuntime(Runtime::kTraceEnter, 0); |
| } |
| @@ -1285,27 +1304,6 @@ void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
| } |
| -void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { |
| - Comment cnmt(masm_, "[ SuperReference "); |
| - |
| - __ movp(LoadDescriptor::ReceiverRegister(), |
| - Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); |
| - |
| - Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| - __ Move(LoadDescriptor::NameRegister(), home_object_symbol); |
| - |
| - __ Move(LoadDescriptor::SlotRegister(), |
| - SmiFromSlot(expr->HomeObjectFeedbackSlot())); |
| - CallLoadIC(NOT_CONTEXTUAL); |
| - |
| - __ Cmp(rax, isolate()->factory()->undefined_value()); |
| - Label done; |
| - __ j(not_equal, &done); |
| - __ CallRuntime(Runtime::kThrowNonMethodError, 0); |
| - __ bind(&done); |
| -} |
| - |
| - |
| void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
| int offset) { |
| if (NeedsHomeObject(initializer)) { |
| @@ -1916,7 +1914,8 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| break; |
| case NAMED_SUPER_PROPERTY: |
| VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| + VisitForAccumulatorValue( |
| + property->obj()->AsSuperReference()->home_object_var()); |
| __ Push(result_register()); |
| if (expr->is_compound()) { |
| __ Push(MemOperand(rsp, kPointerSize)); |
| @@ -1925,8 +1924,8 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| break; |
| case KEYED_SUPER_PROPERTY: |
| VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| - __ Push(result_register()); |
| + VisitForStackValue( |
| + property->obj()->AsSuperReference()->home_object_var()); |
| VisitForAccumulatorValue(property->key()); |
| __ Push(result_register()); |
| if (expr->is_compound()) { |
| @@ -2517,7 +2516,8 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) { |
| case NAMED_SUPER_PROPERTY: { |
| __ Push(rax); |
| VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| + VisitForAccumulatorValue( |
| + prop->obj()->AsSuperReference()->home_object_var()); |
| // stack: value, this; rax: home_object |
| Register scratch = rcx; |
| Register scratch2 = rdx; |
| @@ -2533,8 +2533,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) { |
| case KEYED_SUPER_PROPERTY: { |
| __ Push(rax); |
| VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| - __ Push(result_register()); |
| + VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| VisitForAccumulatorValue(prop->key()); |
| Register scratch = rcx; |
| Register scratch2 = rdx; |
| @@ -2742,8 +2741,7 @@ void FullCodeGenerator::VisitProperty(Property* expr) { |
| EmitNamedPropertyLoad(expr); |
| } else { |
| VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(expr->obj()->AsSuperReference()); |
| - __ Push(result_register()); |
| + VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| EmitNamedSuperPropertyLoad(expr); |
| } |
| } else { |
| @@ -2755,8 +2753,7 @@ void FullCodeGenerator::VisitProperty(Property* expr) { |
| EmitKeyedPropertyLoad(expr); |
| } else { |
| VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(expr->obj()->AsSuperReference()); |
| - __ Push(result_register()); |
| + VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| VisitForStackValue(expr->key()); |
| EmitKeyedSuperPropertyLoad(expr); |
| } |
| @@ -2815,8 +2812,7 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) { |
| DCHECK(!key->value()->IsSmi()); |
| // Load the function from the receiver. |
| SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| - EmitLoadHomeObject(super_ref); |
| - __ Push(rax); |
| + VisitForStackValue(super_ref->home_object_var()); |
| VisitForAccumulatorValue(super_ref->this_var()); |
| __ Push(rax); |
| __ Push(rax); |
| @@ -2873,8 +2869,7 @@ void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
| SetSourcePosition(prop->position()); |
| // Load the function from the receiver. |
| SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| - EmitLoadHomeObject(super_ref); |
| - __ Push(rax); |
| + VisitForStackValue(super_ref->home_object_var()); |
| VisitForAccumulatorValue(super_ref->this_var()); |
| __ Push(rax); |
| __ Push(rax); |
| @@ -4768,7 +4763,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| case NAMED_SUPER_PROPERTY: { |
| VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| + VisitForAccumulatorValue( |
| + prop->obj()->AsSuperReference()->home_object_var()); |
| __ Push(result_register()); |
| __ Push(MemOperand(rsp, kPointerSize)); |
| __ Push(result_register()); |
| @@ -4778,8 +4774,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| case KEYED_SUPER_PROPERTY: { |
| VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| - EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| - __ Push(result_register()); |
| + VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| VisitForAccumulatorValue(prop->key()); |
| __ Push(result_register()); |
| __ Push(MemOperand(rsp, 2 * kPointerSize)); |