| 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_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 } else { | 296 } else { |
| 297 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 297 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| 298 } | 298 } |
| 299 | 299 |
| 300 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 300 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
| 301 __ CallStub(&stub); | 301 __ CallStub(&stub); |
| 302 | 302 |
| 303 SetVar(arguments, eax, ebx, edx); | 303 SetVar(arguments, eax, ebx, edx); |
| 304 } | 304 } |
| 305 | 305 |
| 306 // Possibly set up a local binding to the [[HomeObject]]. |
| 307 Variable* home_object_var = scope()->home_object_var(); |
| 308 if (home_object_var != nullptr) { |
| 309 Comment cmnt(masm_, "[ Home object"); |
| 310 if (function_in_register) { |
| 311 __ mov(LoadDescriptor::ReceiverRegister(), edi); |
| 312 } else { |
| 313 __ mov(LoadDescriptor::ReceiverRegister(), |
| 314 Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
| 315 } |
| 316 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 317 __ mov(LoadDescriptor::NameRegister(), Immediate(home_object_symbol)); |
| 318 __ mov(LoadDescriptor::SlotRegister(), |
| 319 Immediate(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); |
| 320 CallLoadIC(NOT_CONTEXTUAL); |
| 321 |
| 322 SetVar(home_object_var, eax, ebx, edx); |
| 323 } |
| 324 |
| 306 if (FLAG_trace) { | 325 if (FLAG_trace) { |
| 307 __ CallRuntime(Runtime::kTraceEnter, 0); | 326 __ CallRuntime(Runtime::kTraceEnter, 0); |
| 308 } | 327 } |
| 309 | 328 |
| 310 // Visit the declarations and body unless there is an illegal | 329 // Visit the declarations and body unless there is an illegal |
| 311 // redeclaration. | 330 // redeclaration. |
| 312 if (scope()->HasIllegalRedeclaration()) { | 331 if (scope()->HasIllegalRedeclaration()) { |
| 313 Comment cmnt(masm_, "[ Declarations"); | 332 Comment cmnt(masm_, "[ Declarations"); |
| 314 scope()->VisitIllegalRedeclaration(this); | 333 scope()->VisitIllegalRedeclaration(this); |
| 315 | 334 |
| (...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1244 context()->Plug(eax); | 1263 context()->Plug(eax); |
| 1245 } | 1264 } |
| 1246 | 1265 |
| 1247 | 1266 |
| 1248 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1267 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
| 1249 Comment cmnt(masm_, "[ VariableProxy"); | 1268 Comment cmnt(masm_, "[ VariableProxy"); |
| 1250 EmitVariableLoad(expr); | 1269 EmitVariableLoad(expr); |
| 1251 } | 1270 } |
| 1252 | 1271 |
| 1253 | 1272 |
| 1254 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
| 1255 Comment cnmt(masm_, "[ SuperReference "); | |
| 1256 | |
| 1257 __ mov(LoadDescriptor::ReceiverRegister(), | |
| 1258 Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); | |
| 1259 | |
| 1260 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
| 1261 __ mov(LoadDescriptor::NameRegister(), home_object_symbol); | |
| 1262 | |
| 1263 __ mov(LoadDescriptor::SlotRegister(), | |
| 1264 Immediate(SmiFromSlot(expr->HomeObjectFeedbackSlot()))); | |
| 1265 CallLoadIC(NOT_CONTEXTUAL); | |
| 1266 | |
| 1267 __ cmp(eax, isolate()->factory()->undefined_value()); | |
| 1268 Label done; | |
| 1269 __ j(not_equal, &done); | |
| 1270 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
| 1271 __ bind(&done); | |
| 1272 } | |
| 1273 | |
| 1274 | |
| 1275 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1273 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
| 1276 int offset) { | 1274 int offset) { |
| 1277 if (NeedsHomeObject(initializer)) { | 1275 if (NeedsHomeObject(initializer)) { |
| 1278 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1276 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 1279 __ mov(StoreDescriptor::NameRegister(), | 1277 __ mov(StoreDescriptor::NameRegister(), |
| 1280 Immediate(isolate()->factory()->home_object_symbol())); | 1278 Immediate(isolate()->factory()->home_object_symbol())); |
| 1281 __ mov(StoreDescriptor::ValueRegister(), | 1279 __ mov(StoreDescriptor::ValueRegister(), |
| 1282 Operand(esp, offset * kPointerSize)); | 1280 Operand(esp, offset * kPointerSize)); |
| 1283 CallStoreIC(); | 1281 CallStoreIC(); |
| 1284 } | 1282 } |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 Property* property = expr->target()->AsProperty(); | 1866 Property* property = expr->target()->AsProperty(); |
| 1869 LhsKind assign_type = GetAssignType(property); | 1867 LhsKind assign_type = GetAssignType(property); |
| 1870 | 1868 |
| 1871 // Evaluate LHS expression. | 1869 // Evaluate LHS expression. |
| 1872 switch (assign_type) { | 1870 switch (assign_type) { |
| 1873 case VARIABLE: | 1871 case VARIABLE: |
| 1874 // Nothing to do here. | 1872 // Nothing to do here. |
| 1875 break; | 1873 break; |
| 1876 case NAMED_SUPER_PROPERTY: | 1874 case NAMED_SUPER_PROPERTY: |
| 1877 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1875 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1878 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1876 VisitForAccumulatorValue( |
| 1877 property->obj()->AsSuperReference()->home_object_var()); |
| 1879 __ push(result_register()); | 1878 __ push(result_register()); |
| 1880 if (expr->is_compound()) { | 1879 if (expr->is_compound()) { |
| 1881 __ push(MemOperand(esp, kPointerSize)); | 1880 __ push(MemOperand(esp, kPointerSize)); |
| 1882 __ push(result_register()); | 1881 __ push(result_register()); |
| 1883 } | 1882 } |
| 1884 break; | 1883 break; |
| 1885 case NAMED_PROPERTY: | 1884 case NAMED_PROPERTY: |
| 1886 if (expr->is_compound()) { | 1885 if (expr->is_compound()) { |
| 1887 // We need the receiver both on the stack and in the register. | 1886 // We need the receiver both on the stack and in the register. |
| 1888 VisitForStackValue(property->obj()); | 1887 VisitForStackValue(property->obj()); |
| 1889 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1888 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 1890 } else { | 1889 } else { |
| 1891 VisitForStackValue(property->obj()); | 1890 VisitForStackValue(property->obj()); |
| 1892 } | 1891 } |
| 1893 break; | 1892 break; |
| 1894 case KEYED_SUPER_PROPERTY: | 1893 case KEYED_SUPER_PROPERTY: |
| 1895 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1894 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1896 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1895 VisitForStackValue( |
| 1897 __ Push(result_register()); | 1896 property->obj()->AsSuperReference()->home_object_var()); |
| 1898 VisitForAccumulatorValue(property->key()); | 1897 VisitForAccumulatorValue(property->key()); |
| 1899 __ Push(result_register()); | 1898 __ Push(result_register()); |
| 1900 if (expr->is_compound()) { | 1899 if (expr->is_compound()) { |
| 1901 __ push(MemOperand(esp, 2 * kPointerSize)); | 1900 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 1902 __ push(MemOperand(esp, 2 * kPointerSize)); | 1901 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 1903 __ push(result_register()); | 1902 __ push(result_register()); |
| 1904 } | 1903 } |
| 1905 break; | 1904 break; |
| 1906 case KEYED_PROPERTY: { | 1905 case KEYED_PROPERTY: { |
| 1907 if (expr->is_compound()) { | 1906 if (expr->is_compound()) { |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 __ Move(StoreDescriptor::ReceiverRegister(), eax); | 2509 __ Move(StoreDescriptor::ReceiverRegister(), eax); |
| 2511 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2510 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2512 __ mov(StoreDescriptor::NameRegister(), | 2511 __ mov(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(eax); | 2517 __ push(eax); |
| 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; eax: home_object | 2521 // stack: value, this; eax: home_object |
| 2522 Register scratch = ecx; | 2522 Register scratch = ecx; |
| 2523 Register scratch2 = edx; | 2523 Register scratch2 = edx; |
| 2524 __ mov(scratch, result_register()); // home_object | 2524 __ mov(scratch, result_register()); // home_object |
| 2525 __ mov(eax, MemOperand(esp, kPointerSize)); // value | 2525 __ mov(eax, MemOperand(esp, kPointerSize)); // value |
| 2526 __ mov(scratch2, MemOperand(esp, 0)); // this | 2526 __ mov(scratch2, MemOperand(esp, 0)); // this |
| 2527 __ mov(MemOperand(esp, kPointerSize), scratch2); // this | 2527 __ mov(MemOperand(esp, kPointerSize), scratch2); // this |
| 2528 __ mov(MemOperand(esp, 0), scratch); // home_object | 2528 __ mov(MemOperand(esp, 0), scratch); // home_object |
| 2529 // stack: this, home_object. eax: value | 2529 // stack: this, home_object. eax: 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(eax); | 2534 __ push(eax); |
| 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 = ecx; | 2538 Register scratch = ecx; |
| 2540 Register scratch2 = edx; | 2539 Register scratch2 = edx; |
| 2541 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value | 2540 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value |
| 2542 // stack: value, this, home_object; eax: key, edx: value | 2541 // stack: value, this, home_object; eax: key, edx: value |
| 2543 __ mov(scratch, MemOperand(esp, kPointerSize)); // this | 2542 __ mov(scratch, MemOperand(esp, kPointerSize)); // this |
| 2544 __ mov(MemOperand(esp, 2 * kPointerSize), scratch); | 2543 __ mov(MemOperand(esp, 2 * kPointerSize), scratch); |
| 2545 __ mov(scratch, MemOperand(esp, 0)); // home_object | 2544 __ mov(scratch, MemOperand(esp, 0)); // home_object |
| 2546 __ mov(MemOperand(esp, kPointerSize), scratch); | 2545 __ mov(MemOperand(esp, kPointerSize), scratch); |
| 2547 __ mov(MemOperand(esp, 0), eax); | 2546 __ mov(MemOperand(esp, 0), eax); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2738 Comment cmnt(masm_, "[ Property"); | 2737 Comment cmnt(masm_, "[ Property"); |
| 2739 Expression* key = expr->key(); | 2738 Expression* key = expr->key(); |
| 2740 | 2739 |
| 2741 if (key->IsPropertyName()) { | 2740 if (key->IsPropertyName()) { |
| 2742 if (!expr->IsSuperAccess()) { | 2741 if (!expr->IsSuperAccess()) { |
| 2743 VisitForAccumulatorValue(expr->obj()); | 2742 VisitForAccumulatorValue(expr->obj()); |
| 2744 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); | 2743 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); |
| 2745 EmitNamedPropertyLoad(expr); | 2744 EmitNamedPropertyLoad(expr); |
| 2746 } else { | 2745 } else { |
| 2747 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2746 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2748 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2747 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2749 __ push(result_register()); | |
| 2750 EmitNamedSuperPropertyLoad(expr); | 2748 EmitNamedSuperPropertyLoad(expr); |
| 2751 } | 2749 } |
| 2752 } else { | 2750 } else { |
| 2753 if (!expr->IsSuperAccess()) { | 2751 if (!expr->IsSuperAccess()) { |
| 2754 VisitForStackValue(expr->obj()); | 2752 VisitForStackValue(expr->obj()); |
| 2755 VisitForAccumulatorValue(expr->key()); | 2753 VisitForAccumulatorValue(expr->key()); |
| 2756 __ pop(LoadDescriptor::ReceiverRegister()); // Object. | 2754 __ pop(LoadDescriptor::ReceiverRegister()); // Object. |
| 2757 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. | 2755 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. |
| 2758 EmitKeyedPropertyLoad(expr); | 2756 EmitKeyedPropertyLoad(expr); |
| 2759 } else { | 2757 } else { |
| 2760 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2758 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2761 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2759 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2762 __ push(result_register()); | |
| 2763 VisitForStackValue(expr->key()); | 2760 VisitForStackValue(expr->key()); |
| 2764 EmitKeyedSuperPropertyLoad(expr); | 2761 EmitKeyedSuperPropertyLoad(expr); |
| 2765 } | 2762 } |
| 2766 } | 2763 } |
| 2767 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2764 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2768 context()->Plug(eax); | 2765 context()->Plug(eax); |
| 2769 } | 2766 } |
| 2770 | 2767 |
| 2771 | 2768 |
| 2772 void FullCodeGenerator::CallIC(Handle<Code> code, | 2769 void FullCodeGenerator::CallIC(Handle<Code> code, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2811 Expression* callee = expr->expression(); | 2808 Expression* callee = expr->expression(); |
| 2812 DCHECK(callee->IsProperty()); | 2809 DCHECK(callee->IsProperty()); |
| 2813 Property* prop = callee->AsProperty(); | 2810 Property* prop = callee->AsProperty(); |
| 2814 DCHECK(prop->IsSuperAccess()); | 2811 DCHECK(prop->IsSuperAccess()); |
| 2815 | 2812 |
| 2816 SetSourcePosition(prop->position()); | 2813 SetSourcePosition(prop->position()); |
| 2817 Literal* key = prop->key()->AsLiteral(); | 2814 Literal* key = prop->key()->AsLiteral(); |
| 2818 DCHECK(!key->value()->IsSmi()); | 2815 DCHECK(!key->value()->IsSmi()); |
| 2819 // Load the function from the receiver. | 2816 // Load the function from the receiver. |
| 2820 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2817 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2821 EmitLoadHomeObject(super_ref); | 2818 VisitForStackValue(super_ref->home_object_var()); |
| 2822 __ push(eax); | |
| 2823 VisitForAccumulatorValue(super_ref->this_var()); | 2819 VisitForAccumulatorValue(super_ref->this_var()); |
| 2824 __ push(eax); | 2820 __ push(eax); |
| 2825 __ push(eax); | 2821 __ push(eax); |
| 2826 __ push(Operand(esp, kPointerSize * 2)); | 2822 __ push(Operand(esp, kPointerSize * 2)); |
| 2827 __ push(Immediate(key->value())); | 2823 __ push(Immediate(key->value())); |
| 2828 // Stack here: | 2824 // Stack here: |
| 2829 // - home_object | 2825 // - home_object |
| 2830 // - this (receiver) | 2826 // - this (receiver) |
| 2831 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2827 // - this (receiver) <-- LoadFromSuper will pop here and below. |
| 2832 // - home_object | 2828 // - home_object |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2868 | 2864 |
| 2869 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2865 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
| 2870 Expression* callee = expr->expression(); | 2866 Expression* callee = expr->expression(); |
| 2871 DCHECK(callee->IsProperty()); | 2867 DCHECK(callee->IsProperty()); |
| 2872 Property* prop = callee->AsProperty(); | 2868 Property* prop = callee->AsProperty(); |
| 2873 DCHECK(prop->IsSuperAccess()); | 2869 DCHECK(prop->IsSuperAccess()); |
| 2874 | 2870 |
| 2875 SetSourcePosition(prop->position()); | 2871 SetSourcePosition(prop->position()); |
| 2876 // Load the function from the receiver. | 2872 // Load the function from the receiver. |
| 2877 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2873 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2878 EmitLoadHomeObject(super_ref); | 2874 VisitForStackValue(super_ref->home_object_var()); |
| 2879 __ push(eax); | |
| 2880 VisitForAccumulatorValue(super_ref->this_var()); | 2875 VisitForAccumulatorValue(super_ref->this_var()); |
| 2881 __ push(eax); | 2876 __ push(eax); |
| 2882 __ push(eax); | 2877 __ push(eax); |
| 2883 __ push(Operand(esp, kPointerSize * 2)); | 2878 __ push(Operand(esp, kPointerSize * 2)); |
| 2884 VisitForStackValue(prop->key()); | 2879 VisitForStackValue(prop->key()); |
| 2885 // Stack here: | 2880 // Stack here: |
| 2886 // - home_object | 2881 // - home_object |
| 2887 // - this (receiver) | 2882 // - this (receiver) |
| 2888 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2883 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
| 2889 // - home_object | 2884 // - home_object |
| (...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4741 case NAMED_PROPERTY: { | 4736 case NAMED_PROPERTY: { |
| 4742 // Put the object both on the stack and in the register. | 4737 // Put the object both on the stack and in the register. |
| 4743 VisitForStackValue(prop->obj()); | 4738 VisitForStackValue(prop->obj()); |
| 4744 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); | 4739 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); |
| 4745 EmitNamedPropertyLoad(prop); | 4740 EmitNamedPropertyLoad(prop); |
| 4746 break; | 4741 break; |
| 4747 } | 4742 } |
| 4748 | 4743 |
| 4749 case NAMED_SUPER_PROPERTY: { | 4744 case NAMED_SUPER_PROPERTY: { |
| 4750 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4745 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4751 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4746 VisitForAccumulatorValue( |
| 4747 prop->obj()->AsSuperReference()->home_object_var()); |
| 4752 __ push(result_register()); | 4748 __ push(result_register()); |
| 4753 __ push(MemOperand(esp, kPointerSize)); | 4749 __ push(MemOperand(esp, kPointerSize)); |
| 4754 __ push(result_register()); | 4750 __ push(result_register()); |
| 4755 EmitNamedSuperPropertyLoad(prop); | 4751 EmitNamedSuperPropertyLoad(prop); |
| 4756 break; | 4752 break; |
| 4757 } | 4753 } |
| 4758 | 4754 |
| 4759 case KEYED_SUPER_PROPERTY: { | 4755 case KEYED_SUPER_PROPERTY: { |
| 4760 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4756 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4761 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4757 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 4762 __ push(result_register()); | |
| 4763 VisitForAccumulatorValue(prop->key()); | 4758 VisitForAccumulatorValue(prop->key()); |
| 4764 __ push(result_register()); | 4759 __ push(result_register()); |
| 4765 __ push(MemOperand(esp, 2 * kPointerSize)); | 4760 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 4766 __ push(MemOperand(esp, 2 * kPointerSize)); | 4761 __ push(MemOperand(esp, 2 * kPointerSize)); |
| 4767 __ push(result_register()); | 4762 __ push(result_register()); |
| 4768 EmitKeyedSuperPropertyLoad(prop); | 4763 EmitKeyedSuperPropertyLoad(prop); |
| 4769 break; | 4764 break; |
| 4770 } | 4765 } |
| 4771 | 4766 |
| 4772 case KEYED_PROPERTY: { | 4767 case KEYED_PROPERTY: { |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5349 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5344 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
| 5350 Assembler::target_address_at(call_target_address, | 5345 Assembler::target_address_at(call_target_address, |
| 5351 unoptimized_code)); | 5346 unoptimized_code)); |
| 5352 return OSR_AFTER_STACK_CHECK; | 5347 return OSR_AFTER_STACK_CHECK; |
| 5353 } | 5348 } |
| 5354 | 5349 |
| 5355 | 5350 |
| 5356 } } // namespace v8::internal | 5351 } } // namespace v8::internal |
| 5357 | 5352 |
| 5358 #endif // V8_TARGET_ARCH_IA32 | 5353 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |