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_X87 | 7 #if V8_TARGET_ARCH_X87 |
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 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 } else if (FLAG_debug_code) { | 228 } else if (FLAG_debug_code) { |
229 Label done; | 229 Label done; |
230 __ JumpIfInNewSpace(esi, eax, &done, Label::kNear); | 230 __ JumpIfInNewSpace(esi, eax, &done, Label::kNear); |
231 __ Abort(kExpectedNewSpaceObject); | 231 __ Abort(kExpectedNewSpaceObject); |
232 __ bind(&done); | 232 __ bind(&done); |
233 } | 233 } |
234 } | 234 } |
235 } | 235 } |
236 } | 236 } |
237 | 237 |
| 238 Variable* home_object_var = scope()->home_object_var(); |
| 239 if (home_object_var != nullptr) { |
| 240 __ push(edi); |
| 241 } |
| 242 |
238 ArgumentsAccessStub::HasNewTarget has_new_target = | 243 ArgumentsAccessStub::HasNewTarget has_new_target = |
239 IsSubclassConstructor(info->function()->kind()) | 244 IsSubclassConstructor(info->function()->kind()) |
240 ? ArgumentsAccessStub::HAS_NEW_TARGET | 245 ? ArgumentsAccessStub::HAS_NEW_TARGET |
241 : ArgumentsAccessStub::NO_NEW_TARGET; | 246 : ArgumentsAccessStub::NO_NEW_TARGET; |
242 | 247 |
243 // Possibly allocate RestParameters | 248 // Possibly allocate RestParameters |
244 int rest_index; | 249 int rest_index; |
245 Variable* rest_param = scope()->rest_parameter(&rest_index); | 250 Variable* rest_param = scope()->rest_parameter(&rest_index); |
246 if (rest_param) { | 251 if (rest_param) { |
247 Comment cmnt(masm_, "[ Allocate rest parameter array"); | 252 Comment cmnt(masm_, "[ Allocate rest parameter array"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 } else { | 298 } else { |
294 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 299 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
295 } | 300 } |
296 | 301 |
297 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 302 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
298 __ CallStub(&stub); | 303 __ CallStub(&stub); |
299 | 304 |
300 SetVar(arguments, eax, ebx, edx); | 305 SetVar(arguments, eax, ebx, edx); |
301 } | 306 } |
302 | 307 |
| 308 // Possibly set up a local binding to the [[HomeObject]]. |
| 309 if (home_object_var != nullptr) { |
| 310 Comment cmnt(masm_, "[ Home object"); |
| 311 __ pop(LoadDescriptor::ReceiverRegister()); |
| 312 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 313 __ mov(LoadDescriptor::NameRegister(), Immediate(home_object_symbol)); |
| 314 __ mov(LoadDescriptor::SlotRegister(), |
| 315 Immediate(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); |
| 316 CallLoadIC(NOT_CONTEXTUAL); |
| 317 |
| 318 SetVar(home_object_var, eax, ebx, edx); |
| 319 } |
| 320 |
303 if (FLAG_trace) { | 321 if (FLAG_trace) { |
304 __ CallRuntime(Runtime::kTraceEnter, 0); | 322 __ CallRuntime(Runtime::kTraceEnter, 0); |
305 } | 323 } |
306 | 324 |
307 // Visit the declarations and body unless there is an illegal | 325 // Visit the declarations and body unless there is an illegal |
308 // redeclaration. | 326 // redeclaration. |
309 if (scope()->HasIllegalRedeclaration()) { | 327 if (scope()->HasIllegalRedeclaration()) { |
310 Comment cmnt(masm_, "[ Declarations"); | 328 Comment cmnt(masm_, "[ Declarations"); |
311 scope()->VisitIllegalRedeclaration(this); | 329 scope()->VisitIllegalRedeclaration(this); |
312 | 330 |
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 context()->Plug(eax); | 1255 context()->Plug(eax); |
1238 } | 1256 } |
1239 | 1257 |
1240 | 1258 |
1241 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1259 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
1242 Comment cmnt(masm_, "[ VariableProxy"); | 1260 Comment cmnt(masm_, "[ VariableProxy"); |
1243 EmitVariableLoad(expr); | 1261 EmitVariableLoad(expr); |
1244 } | 1262 } |
1245 | 1263 |
1246 | 1264 |
1247 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
1248 Comment cnmt(masm_, "[ SuperReference "); | |
1249 | |
1250 __ mov(LoadDescriptor::ReceiverRegister(), | |
1251 Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); | |
1252 | |
1253 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
1254 __ mov(LoadDescriptor::NameRegister(), home_object_symbol); | |
1255 | |
1256 __ mov(LoadDescriptor::SlotRegister(), | |
1257 Immediate(SmiFromSlot(expr->HomeObjectFeedbackSlot()))); | |
1258 CallLoadIC(NOT_CONTEXTUAL); | |
1259 | |
1260 __ cmp(eax, isolate()->factory()->undefined_value()); | |
1261 Label done; | |
1262 __ j(not_equal, &done); | |
1263 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
1264 __ bind(&done); | |
1265 } | |
1266 | |
1267 | |
1268 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1265 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
1269 int offset) { | 1266 int offset) { |
1270 if (NeedsHomeObject(initializer)) { | 1267 if (NeedsHomeObject(initializer)) { |
1271 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1268 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
1272 __ mov(StoreDescriptor::NameRegister(), | 1269 __ mov(StoreDescriptor::NameRegister(), |
1273 Immediate(isolate()->factory()->home_object_symbol())); | 1270 Immediate(isolate()->factory()->home_object_symbol())); |
1274 __ mov(StoreDescriptor::ValueRegister(), | 1271 __ mov(StoreDescriptor::ValueRegister(), |
1275 Operand(esp, offset * kPointerSize)); | 1272 Operand(esp, offset * kPointerSize)); |
1276 CallStoreIC(); | 1273 CallStoreIC(); |
1277 } | 1274 } |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 Property* property = expr->target()->AsProperty(); | 1884 Property* property = expr->target()->AsProperty(); |
1888 LhsKind assign_type = GetAssignType(property); | 1885 LhsKind assign_type = GetAssignType(property); |
1889 | 1886 |
1890 // Evaluate LHS expression. | 1887 // Evaluate LHS expression. |
1891 switch (assign_type) { | 1888 switch (assign_type) { |
1892 case VARIABLE: | 1889 case VARIABLE: |
1893 // Nothing to do here. | 1890 // Nothing to do here. |
1894 break; | 1891 break; |
1895 case NAMED_SUPER_PROPERTY: | 1892 case NAMED_SUPER_PROPERTY: |
1896 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1893 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1897 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1894 VisitForAccumulatorValue( |
| 1895 property->obj()->AsSuperReference()->home_object_var()); |
1898 __ push(result_register()); | 1896 __ push(result_register()); |
1899 if (expr->is_compound()) { | 1897 if (expr->is_compound()) { |
1900 __ push(MemOperand(esp, kPointerSize)); | 1898 __ push(MemOperand(esp, kPointerSize)); |
1901 __ push(result_register()); | 1899 __ push(result_register()); |
1902 } | 1900 } |
1903 break; | 1901 break; |
1904 case NAMED_PROPERTY: | 1902 case NAMED_PROPERTY: |
1905 if (expr->is_compound()) { | 1903 if (expr->is_compound()) { |
1906 // We need the receiver both on the stack and in the register. | 1904 // We need the receiver both on the stack and in the register. |
1907 VisitForStackValue(property->obj()); | 1905 VisitForStackValue(property->obj()); |
1908 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1906 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
1909 } else { | 1907 } else { |
1910 VisitForStackValue(property->obj()); | 1908 VisitForStackValue(property->obj()); |
1911 } | 1909 } |
1912 break; | 1910 break; |
1913 case KEYED_SUPER_PROPERTY: | 1911 case KEYED_SUPER_PROPERTY: |
1914 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1912 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1915 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1913 VisitForStackValue( |
1916 __ Push(result_register()); | 1914 property->obj()->AsSuperReference()->home_object_var()); |
1917 VisitForAccumulatorValue(property->key()); | 1915 VisitForAccumulatorValue(property->key()); |
1918 __ Push(result_register()); | 1916 __ Push(result_register()); |
1919 if (expr->is_compound()) { | 1917 if (expr->is_compound()) { |
1920 __ push(MemOperand(esp, 2 * kPointerSize)); | 1918 __ push(MemOperand(esp, 2 * kPointerSize)); |
1921 __ push(MemOperand(esp, 2 * kPointerSize)); | 1919 __ push(MemOperand(esp, 2 * kPointerSize)); |
1922 __ push(result_register()); | 1920 __ push(result_register()); |
1923 } | 1921 } |
1924 break; | 1922 break; |
1925 case KEYED_PROPERTY: { | 1923 case KEYED_PROPERTY: { |
1926 if (expr->is_compound()) { | 1924 if (expr->is_compound()) { |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2529 __ Move(StoreDescriptor::ReceiverRegister(), eax); | 2527 __ Move(StoreDescriptor::ReceiverRegister(), eax); |
2530 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2528 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
2531 __ mov(StoreDescriptor::NameRegister(), | 2529 __ mov(StoreDescriptor::NameRegister(), |
2532 prop->key()->AsLiteral()->value()); | 2530 prop->key()->AsLiteral()->value()); |
2533 CallStoreIC(); | 2531 CallStoreIC(); |
2534 break; | 2532 break; |
2535 } | 2533 } |
2536 case NAMED_SUPER_PROPERTY: { | 2534 case NAMED_SUPER_PROPERTY: { |
2537 __ push(eax); | 2535 __ push(eax); |
2538 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2536 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2539 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2537 VisitForAccumulatorValue( |
| 2538 prop->obj()->AsSuperReference()->home_object_var()); |
2540 // stack: value, this; eax: home_object | 2539 // stack: value, this; eax: home_object |
2541 Register scratch = ecx; | 2540 Register scratch = ecx; |
2542 Register scratch2 = edx; | 2541 Register scratch2 = edx; |
2543 __ mov(scratch, result_register()); // home_object | 2542 __ mov(scratch, result_register()); // home_object |
2544 __ mov(eax, MemOperand(esp, kPointerSize)); // value | 2543 __ mov(eax, MemOperand(esp, kPointerSize)); // value |
2545 __ mov(scratch2, MemOperand(esp, 0)); // this | 2544 __ mov(scratch2, MemOperand(esp, 0)); // this |
2546 __ mov(MemOperand(esp, kPointerSize), scratch2); // this | 2545 __ mov(MemOperand(esp, kPointerSize), scratch2); // this |
2547 __ mov(MemOperand(esp, 0), scratch); // home_object | 2546 __ mov(MemOperand(esp, 0), scratch); // home_object |
2548 // stack: this, home_object. eax: value | 2547 // stack: this, home_object. eax: value |
2549 EmitNamedSuperPropertyStore(prop); | 2548 EmitNamedSuperPropertyStore(prop); |
2550 break; | 2549 break; |
2551 } | 2550 } |
2552 case KEYED_SUPER_PROPERTY: { | 2551 case KEYED_SUPER_PROPERTY: { |
2553 __ push(eax); | 2552 __ push(eax); |
2554 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2553 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2555 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2554 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
2556 __ push(result_register()); | |
2557 VisitForAccumulatorValue(prop->key()); | 2555 VisitForAccumulatorValue(prop->key()); |
2558 Register scratch = ecx; | 2556 Register scratch = ecx; |
2559 Register scratch2 = edx; | 2557 Register scratch2 = edx; |
2560 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value | 2558 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value |
2561 // stack: value, this, home_object; eax: key, edx: value | 2559 // stack: value, this, home_object; eax: key, edx: value |
2562 __ mov(scratch, MemOperand(esp, kPointerSize)); // this | 2560 __ mov(scratch, MemOperand(esp, kPointerSize)); // this |
2563 __ mov(MemOperand(esp, 2 * kPointerSize), scratch); | 2561 __ mov(MemOperand(esp, 2 * kPointerSize), scratch); |
2564 __ mov(scratch, MemOperand(esp, 0)); // home_object | 2562 __ mov(scratch, MemOperand(esp, 0)); // home_object |
2565 __ mov(MemOperand(esp, kPointerSize), scratch); | 2563 __ mov(MemOperand(esp, kPointerSize), scratch); |
2566 __ mov(MemOperand(esp, 0), eax); | 2564 __ mov(MemOperand(esp, 0), eax); |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2757 Comment cmnt(masm_, "[ Property"); | 2755 Comment cmnt(masm_, "[ Property"); |
2758 Expression* key = expr->key(); | 2756 Expression* key = expr->key(); |
2759 | 2757 |
2760 if (key->IsPropertyName()) { | 2758 if (key->IsPropertyName()) { |
2761 if (!expr->IsSuperAccess()) { | 2759 if (!expr->IsSuperAccess()) { |
2762 VisitForAccumulatorValue(expr->obj()); | 2760 VisitForAccumulatorValue(expr->obj()); |
2763 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); | 2761 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); |
2764 EmitNamedPropertyLoad(expr); | 2762 EmitNamedPropertyLoad(expr); |
2765 } else { | 2763 } else { |
2766 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2764 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2767 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2765 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2768 __ push(result_register()); | |
2769 EmitNamedSuperPropertyLoad(expr); | 2766 EmitNamedSuperPropertyLoad(expr); |
2770 } | 2767 } |
2771 } else { | 2768 } else { |
2772 if (!expr->IsSuperAccess()) { | 2769 if (!expr->IsSuperAccess()) { |
2773 VisitForStackValue(expr->obj()); | 2770 VisitForStackValue(expr->obj()); |
2774 VisitForAccumulatorValue(expr->key()); | 2771 VisitForAccumulatorValue(expr->key()); |
2775 __ pop(LoadDescriptor::ReceiverRegister()); // Object. | 2772 __ pop(LoadDescriptor::ReceiverRegister()); // Object. |
2776 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. | 2773 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. |
2777 EmitKeyedPropertyLoad(expr); | 2774 EmitKeyedPropertyLoad(expr); |
2778 } else { | 2775 } else { |
2779 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2776 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2780 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2777 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2781 __ push(result_register()); | |
2782 VisitForStackValue(expr->key()); | 2778 VisitForStackValue(expr->key()); |
2783 EmitKeyedSuperPropertyLoad(expr); | 2779 EmitKeyedSuperPropertyLoad(expr); |
2784 } | 2780 } |
2785 } | 2781 } |
2786 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2782 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2787 context()->Plug(eax); | 2783 context()->Plug(eax); |
2788 } | 2784 } |
2789 | 2785 |
2790 | 2786 |
2791 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 Loading... |
2830 Expression* callee = expr->expression(); | 2826 Expression* callee = expr->expression(); |
2831 DCHECK(callee->IsProperty()); | 2827 DCHECK(callee->IsProperty()); |
2832 Property* prop = callee->AsProperty(); | 2828 Property* prop = callee->AsProperty(); |
2833 DCHECK(prop->IsSuperAccess()); | 2829 DCHECK(prop->IsSuperAccess()); |
2834 | 2830 |
2835 SetSourcePosition(prop->position()); | 2831 SetSourcePosition(prop->position()); |
2836 Literal* key = prop->key()->AsLiteral(); | 2832 Literal* key = prop->key()->AsLiteral(); |
2837 DCHECK(!key->value()->IsSmi()); | 2833 DCHECK(!key->value()->IsSmi()); |
2838 // Load the function from the receiver. | 2834 // Load the function from the receiver. |
2839 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2835 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
2840 EmitLoadHomeObject(super_ref); | 2836 VisitForStackValue(super_ref->home_object_var()); |
2841 __ push(eax); | |
2842 VisitForAccumulatorValue(super_ref->this_var()); | 2837 VisitForAccumulatorValue(super_ref->this_var()); |
2843 __ push(eax); | 2838 __ push(eax); |
2844 __ push(eax); | 2839 __ push(eax); |
2845 __ push(Operand(esp, kPointerSize * 2)); | 2840 __ push(Operand(esp, kPointerSize * 2)); |
2846 __ push(Immediate(key->value())); | 2841 __ push(Immediate(key->value())); |
2847 // Stack here: | 2842 // Stack here: |
2848 // - home_object | 2843 // - home_object |
2849 // - this (receiver) | 2844 // - this (receiver) |
2850 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2845 // - this (receiver) <-- LoadFromSuper will pop here and below. |
2851 // - home_object | 2846 // - home_object |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2887 | 2882 |
2888 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2883 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
2889 Expression* callee = expr->expression(); | 2884 Expression* callee = expr->expression(); |
2890 DCHECK(callee->IsProperty()); | 2885 DCHECK(callee->IsProperty()); |
2891 Property* prop = callee->AsProperty(); | 2886 Property* prop = callee->AsProperty(); |
2892 DCHECK(prop->IsSuperAccess()); | 2887 DCHECK(prop->IsSuperAccess()); |
2893 | 2888 |
2894 SetSourcePosition(prop->position()); | 2889 SetSourcePosition(prop->position()); |
2895 // Load the function from the receiver. | 2890 // Load the function from the receiver. |
2896 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2891 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
2897 EmitLoadHomeObject(super_ref); | 2892 VisitForStackValue(super_ref->home_object_var()); |
2898 __ push(eax); | |
2899 VisitForAccumulatorValue(super_ref->this_var()); | 2893 VisitForAccumulatorValue(super_ref->this_var()); |
2900 __ push(eax); | 2894 __ push(eax); |
2901 __ push(eax); | 2895 __ push(eax); |
2902 __ push(Operand(esp, kPointerSize * 2)); | 2896 __ push(Operand(esp, kPointerSize * 2)); |
2903 VisitForStackValue(prop->key()); | 2897 VisitForStackValue(prop->key()); |
2904 // Stack here: | 2898 // Stack here: |
2905 // - home_object | 2899 // - home_object |
2906 // - this (receiver) | 2900 // - this (receiver) |
2907 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2901 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
2908 // - home_object | 2902 // - home_object |
(...skipping 1850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4759 case NAMED_PROPERTY: { | 4753 case NAMED_PROPERTY: { |
4760 // Put the object both on the stack and in the register. | 4754 // Put the object both on the stack and in the register. |
4761 VisitForStackValue(prop->obj()); | 4755 VisitForStackValue(prop->obj()); |
4762 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 4756 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
4763 EmitNamedPropertyLoad(prop); | 4757 EmitNamedPropertyLoad(prop); |
4764 break; | 4758 break; |
4765 } | 4759 } |
4766 | 4760 |
4767 case NAMED_SUPER_PROPERTY: { | 4761 case NAMED_SUPER_PROPERTY: { |
4768 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4762 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4769 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4763 VisitForAccumulatorValue( |
| 4764 prop->obj()->AsSuperReference()->home_object_var()); |
4770 __ push(result_register()); | 4765 __ push(result_register()); |
4771 __ push(MemOperand(esp, kPointerSize)); | 4766 __ push(MemOperand(esp, kPointerSize)); |
4772 __ push(result_register()); | 4767 __ push(result_register()); |
4773 EmitNamedSuperPropertyLoad(prop); | 4768 EmitNamedSuperPropertyLoad(prop); |
4774 break; | 4769 break; |
4775 } | 4770 } |
4776 | 4771 |
4777 case KEYED_SUPER_PROPERTY: { | 4772 case KEYED_SUPER_PROPERTY: { |
4778 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4773 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4779 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4774 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
4780 __ push(result_register()); | |
4781 VisitForAccumulatorValue(prop->key()); | 4775 VisitForAccumulatorValue(prop->key()); |
4782 __ push(result_register()); | 4776 __ push(result_register()); |
4783 __ push(MemOperand(esp, 2 * kPointerSize)); | 4777 __ push(MemOperand(esp, 2 * kPointerSize)); |
4784 __ push(MemOperand(esp, 2 * kPointerSize)); | 4778 __ push(MemOperand(esp, 2 * kPointerSize)); |
4785 __ push(result_register()); | 4779 __ push(result_register()); |
4786 EmitKeyedSuperPropertyLoad(prop); | 4780 EmitKeyedSuperPropertyLoad(prop); |
4787 break; | 4781 break; |
4788 } | 4782 } |
4789 | 4783 |
4790 case KEYED_PROPERTY: { | 4784 case KEYED_PROPERTY: { |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5378 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5372 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
5379 Assembler::target_address_at(call_target_address, | 5373 Assembler::target_address_at(call_target_address, |
5380 unoptimized_code)); | 5374 unoptimized_code)); |
5381 return OSR_AFTER_STACK_CHECK; | 5375 return OSR_AFTER_STACK_CHECK; |
5382 } | 5376 } |
5383 | 5377 |
5384 | 5378 |
5385 } } // namespace v8::internal | 5379 } } // namespace v8::internal |
5386 | 5380 |
5387 #endif // V8_TARGET_ARCH_X87 | 5381 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |