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_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
8 | 8 |
9 // Note on Mips implementation: | 9 // Note on Mips implementation: |
10 // | 10 // |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 } else if (FLAG_debug_code) { | 244 } else if (FLAG_debug_code) { |
245 Label done; | 245 Label done; |
246 __ JumpIfInNewSpace(cp, a0, &done); | 246 __ JumpIfInNewSpace(cp, a0, &done); |
247 __ Abort(kExpectedNewSpaceObject); | 247 __ Abort(kExpectedNewSpaceObject); |
248 __ bind(&done); | 248 __ bind(&done); |
249 } | 249 } |
250 } | 250 } |
251 } | 251 } |
252 } | 252 } |
253 | 253 |
| 254 Variable* home_object_var = scope()->home_object_var(); |
| 255 if (home_object_var != nullptr) { |
| 256 __ Push(a1); |
| 257 } |
| 258 |
254 ArgumentsAccessStub::HasNewTarget has_new_target = | 259 ArgumentsAccessStub::HasNewTarget has_new_target = |
255 IsSubclassConstructor(info->function()->kind()) | 260 IsSubclassConstructor(info->function()->kind()) |
256 ? ArgumentsAccessStub::HAS_NEW_TARGET | 261 ? ArgumentsAccessStub::HAS_NEW_TARGET |
257 : ArgumentsAccessStub::NO_NEW_TARGET; | 262 : ArgumentsAccessStub::NO_NEW_TARGET; |
258 | 263 |
259 // Possibly allocate RestParameters | 264 // Possibly allocate RestParameters |
260 int rest_index; | 265 int rest_index; |
261 Variable* rest_param = scope()->rest_parameter(&rest_index); | 266 Variable* rest_param = scope()->rest_parameter(&rest_index); |
262 if (rest_param) { | 267 if (rest_param) { |
263 Comment cmnt(masm_, "[ Allocate rest parameter array"); | 268 Comment cmnt(masm_, "[ Allocate rest parameter array"); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 315 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
311 } else { | 316 } else { |
312 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 317 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
313 } | 318 } |
314 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 319 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
315 __ CallStub(&stub); | 320 __ CallStub(&stub); |
316 | 321 |
317 SetVar(arguments, v0, a1, a2); | 322 SetVar(arguments, v0, a1, a2); |
318 } | 323 } |
319 | 324 |
| 325 // Possibly set up a local binding to the [[HomeObject]]. |
| 326 if (home_object_var != nullptr) { |
| 327 Comment cmnt(masm_, "[ Home object"); |
| 328 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 329 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 330 __ li(LoadDescriptor::NameRegister(), Operand(home_object_symbol)); |
| 331 __ li(LoadDescriptor::SlotRegister(), |
| 332 Operand(SmiFromSlot(function()->HomeObjectFeedbackSlot()))); |
| 333 CallLoadIC(NOT_CONTEXTUAL); |
| 334 |
| 335 SetVar(home_object_var, v0, a1, a2); |
| 336 } |
| 337 |
320 if (FLAG_trace) { | 338 if (FLAG_trace) { |
321 __ CallRuntime(Runtime::kTraceEnter, 0); | 339 __ CallRuntime(Runtime::kTraceEnter, 0); |
322 } | 340 } |
323 | 341 |
324 // Visit the declarations and body unless there is an illegal | 342 // Visit the declarations and body unless there is an illegal |
325 // redeclaration. | 343 // redeclaration. |
326 if (scope()->HasIllegalRedeclaration()) { | 344 if (scope()->HasIllegalRedeclaration()) { |
327 Comment cmnt(masm_, "[ Declarations"); | 345 Comment cmnt(masm_, "[ Declarations"); |
328 scope()->VisitIllegalRedeclaration(this); | 346 scope()->VisitIllegalRedeclaration(this); |
329 | 347 |
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 context()->Plug(v0); | 1324 context()->Plug(v0); |
1307 } | 1325 } |
1308 | 1326 |
1309 | 1327 |
1310 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1328 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
1311 Comment cmnt(masm_, "[ VariableProxy"); | 1329 Comment cmnt(masm_, "[ VariableProxy"); |
1312 EmitVariableLoad(expr); | 1330 EmitVariableLoad(expr); |
1313 } | 1331 } |
1314 | 1332 |
1315 | 1333 |
1316 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
1317 Comment cnmt(masm_, "[ SuperReference "); | |
1318 | |
1319 __ lw(LoadDescriptor::ReceiverRegister(), | |
1320 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | |
1321 | |
1322 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
1323 __ li(LoadDescriptor::NameRegister(), home_object_symbol); | |
1324 | |
1325 __ li(LoadDescriptor::SlotRegister(), | |
1326 Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot()))); | |
1327 CallLoadIC(NOT_CONTEXTUAL); | |
1328 | |
1329 Label done; | |
1330 __ Branch(&done, ne, v0, Operand(isolate()->factory()->undefined_value())); | |
1331 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
1332 __ bind(&done); | |
1333 } | |
1334 | |
1335 | |
1336 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1334 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
1337 int offset) { | 1335 int offset) { |
1338 if (NeedsHomeObject(initializer)) { | 1336 if (NeedsHomeObject(initializer)) { |
1339 __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); | 1337 __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
1340 __ li(StoreDescriptor::NameRegister(), | 1338 __ li(StoreDescriptor::NameRegister(), |
1341 Operand(isolate()->factory()->home_object_symbol())); | 1339 Operand(isolate()->factory()->home_object_symbol())); |
1342 __ lw(StoreDescriptor::ValueRegister(), | 1340 __ lw(StoreDescriptor::ValueRegister(), |
1343 MemOperand(sp, offset * kPointerSize)); | 1341 MemOperand(sp, offset * kPointerSize)); |
1344 CallStoreIC(); | 1342 CallStoreIC(); |
1345 } | 1343 } |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1959 if (expr->is_compound()) { | 1957 if (expr->is_compound()) { |
1960 // We need the receiver both on the stack and in the register. | 1958 // We need the receiver both on the stack and in the register. |
1961 VisitForStackValue(property->obj()); | 1959 VisitForStackValue(property->obj()); |
1962 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1960 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
1963 } else { | 1961 } else { |
1964 VisitForStackValue(property->obj()); | 1962 VisitForStackValue(property->obj()); |
1965 } | 1963 } |
1966 break; | 1964 break; |
1967 case NAMED_SUPER_PROPERTY: | 1965 case NAMED_SUPER_PROPERTY: |
1968 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1966 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1969 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1967 VisitForAccumulatorValue( |
| 1968 property->obj()->AsSuperReference()->home_object_var()); |
1970 __ Push(result_register()); | 1969 __ Push(result_register()); |
1971 if (expr->is_compound()) { | 1970 if (expr->is_compound()) { |
1972 const Register scratch = a1; | 1971 const Register scratch = a1; |
1973 __ lw(scratch, MemOperand(sp, kPointerSize)); | 1972 __ lw(scratch, MemOperand(sp, kPointerSize)); |
1974 __ Push(scratch, result_register()); | 1973 __ Push(scratch, result_register()); |
1975 } | 1974 } |
1976 break; | 1975 break; |
1977 case KEYED_SUPER_PROPERTY: { | 1976 case KEYED_SUPER_PROPERTY: { |
1978 const Register scratch = a1; | 1977 const Register scratch = a1; |
1979 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1978 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1980 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1979 VisitForAccumulatorValue( |
| 1980 property->obj()->AsSuperReference()->home_object_var()); |
1981 __ Move(scratch, result_register()); | 1981 __ Move(scratch, result_register()); |
1982 VisitForAccumulatorValue(property->key()); | 1982 VisitForAccumulatorValue(property->key()); |
1983 __ Push(scratch, result_register()); | 1983 __ Push(scratch, result_register()); |
1984 if (expr->is_compound()) { | 1984 if (expr->is_compound()) { |
1985 const Register scratch1 = t0; | 1985 const Register scratch1 = t0; |
1986 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); | 1986 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); |
1987 __ Push(scratch1, scratch, result_register()); | 1987 __ Push(scratch1, scratch, result_register()); |
1988 } | 1988 } |
1989 break; | 1989 break; |
1990 } | 1990 } |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2603 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); | 2603 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); |
2604 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2604 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
2605 __ li(StoreDescriptor::NameRegister(), | 2605 __ li(StoreDescriptor::NameRegister(), |
2606 Operand(prop->key()->AsLiteral()->value())); | 2606 Operand(prop->key()->AsLiteral()->value())); |
2607 CallStoreIC(); | 2607 CallStoreIC(); |
2608 break; | 2608 break; |
2609 } | 2609 } |
2610 case NAMED_SUPER_PROPERTY: { | 2610 case NAMED_SUPER_PROPERTY: { |
2611 __ Push(v0); | 2611 __ Push(v0); |
2612 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2612 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2613 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2613 VisitForAccumulatorValue( |
| 2614 prop->obj()->AsSuperReference()->home_object_var()); |
2614 // stack: value, this; v0: home_object | 2615 // stack: value, this; v0: home_object |
2615 Register scratch = a2; | 2616 Register scratch = a2; |
2616 Register scratch2 = a3; | 2617 Register scratch2 = a3; |
2617 __ mov(scratch, result_register()); // home_object | 2618 __ mov(scratch, result_register()); // home_object |
2618 __ lw(v0, MemOperand(sp, kPointerSize)); // value | 2619 __ lw(v0, MemOperand(sp, kPointerSize)); // value |
2619 __ lw(scratch2, MemOperand(sp, 0)); // this | 2620 __ lw(scratch2, MemOperand(sp, 0)); // this |
2620 __ sw(scratch2, MemOperand(sp, kPointerSize)); // this | 2621 __ sw(scratch2, MemOperand(sp, kPointerSize)); // this |
2621 __ sw(scratch, MemOperand(sp, 0)); // home_object | 2622 __ sw(scratch, MemOperand(sp, 0)); // home_object |
2622 // stack: this, home_object; v0: value | 2623 // stack: this, home_object; v0: value |
2623 EmitNamedSuperPropertyStore(prop); | 2624 EmitNamedSuperPropertyStore(prop); |
2624 break; | 2625 break; |
2625 } | 2626 } |
2626 case KEYED_SUPER_PROPERTY: { | 2627 case KEYED_SUPER_PROPERTY: { |
2627 __ Push(v0); | 2628 __ Push(v0); |
2628 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2629 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
2629 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2630 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
2630 __ Push(result_register()); | |
2631 VisitForAccumulatorValue(prop->key()); | 2631 VisitForAccumulatorValue(prop->key()); |
2632 Register scratch = a2; | 2632 Register scratch = a2; |
2633 Register scratch2 = a3; | 2633 Register scratch2 = a3; |
2634 __ lw(scratch2, MemOperand(sp, 2 * kPointerSize)); // value | 2634 __ lw(scratch2, MemOperand(sp, 2 * kPointerSize)); // value |
2635 // stack: value, this, home_object; v0: key, a3: value | 2635 // stack: value, this, home_object; v0: key, a3: value |
2636 __ lw(scratch, MemOperand(sp, kPointerSize)); // this | 2636 __ lw(scratch, MemOperand(sp, kPointerSize)); // this |
2637 __ sw(scratch, MemOperand(sp, 2 * kPointerSize)); | 2637 __ sw(scratch, MemOperand(sp, 2 * kPointerSize)); |
2638 __ lw(scratch, MemOperand(sp, 0)); // home_object | 2638 __ lw(scratch, MemOperand(sp, 0)); // home_object |
2639 __ sw(scratch, MemOperand(sp, kPointerSize)); | 2639 __ sw(scratch, MemOperand(sp, kPointerSize)); |
2640 __ sw(v0, MemOperand(sp, 0)); | 2640 __ sw(v0, MemOperand(sp, 0)); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2837 Comment cmnt(masm_, "[ Property"); | 2837 Comment cmnt(masm_, "[ Property"); |
2838 Expression* key = expr->key(); | 2838 Expression* key = expr->key(); |
2839 | 2839 |
2840 if (key->IsPropertyName()) { | 2840 if (key->IsPropertyName()) { |
2841 if (!expr->IsSuperAccess()) { | 2841 if (!expr->IsSuperAccess()) { |
2842 VisitForAccumulatorValue(expr->obj()); | 2842 VisitForAccumulatorValue(expr->obj()); |
2843 __ Move(LoadDescriptor::ReceiverRegister(), v0); | 2843 __ Move(LoadDescriptor::ReceiverRegister(), v0); |
2844 EmitNamedPropertyLoad(expr); | 2844 EmitNamedPropertyLoad(expr); |
2845 } else { | 2845 } else { |
2846 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2846 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2847 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2847 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2848 __ Push(result_register()); | |
2849 EmitNamedSuperPropertyLoad(expr); | 2848 EmitNamedSuperPropertyLoad(expr); |
2850 } | 2849 } |
2851 } else { | 2850 } else { |
2852 if (!expr->IsSuperAccess()) { | 2851 if (!expr->IsSuperAccess()) { |
2853 VisitForStackValue(expr->obj()); | 2852 VisitForStackValue(expr->obj()); |
2854 VisitForAccumulatorValue(expr->key()); | 2853 VisitForAccumulatorValue(expr->key()); |
2855 __ Move(LoadDescriptor::NameRegister(), v0); | 2854 __ Move(LoadDescriptor::NameRegister(), v0); |
2856 __ pop(LoadDescriptor::ReceiverRegister()); | 2855 __ pop(LoadDescriptor::ReceiverRegister()); |
2857 EmitKeyedPropertyLoad(expr); | 2856 EmitKeyedPropertyLoad(expr); |
2858 } else { | 2857 } else { |
2859 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2858 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
2860 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2859 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
2861 __ Push(result_register()); | |
2862 VisitForStackValue(expr->key()); | 2860 VisitForStackValue(expr->key()); |
2863 EmitKeyedSuperPropertyLoad(expr); | 2861 EmitKeyedSuperPropertyLoad(expr); |
2864 } | 2862 } |
2865 } | 2863 } |
2866 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2864 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2867 context()->Plug(v0); | 2865 context()->Plug(v0); |
2868 } | 2866 } |
2869 | 2867 |
2870 | 2868 |
2871 void FullCodeGenerator::CallIC(Handle<Code> code, | 2869 void FullCodeGenerator::CallIC(Handle<Code> code, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2914 DCHECK(callee->IsProperty()); | 2912 DCHECK(callee->IsProperty()); |
2915 Property* prop = callee->AsProperty(); | 2913 Property* prop = callee->AsProperty(); |
2916 DCHECK(prop->IsSuperAccess()); | 2914 DCHECK(prop->IsSuperAccess()); |
2917 | 2915 |
2918 SetSourcePosition(prop->position()); | 2916 SetSourcePosition(prop->position()); |
2919 Literal* key = prop->key()->AsLiteral(); | 2917 Literal* key = prop->key()->AsLiteral(); |
2920 DCHECK(!key->value()->IsSmi()); | 2918 DCHECK(!key->value()->IsSmi()); |
2921 // Load the function from the receiver. | 2919 // Load the function from the receiver. |
2922 const Register scratch = a1; | 2920 const Register scratch = a1; |
2923 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2921 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2924 EmitLoadHomeObject(super_ref); | 2922 VisitForAccumulatorValue(super_ref->home_object_var()); |
2925 __ mov(scratch, v0); | 2923 __ mov(scratch, v0); |
2926 VisitForAccumulatorValue(super_ref->this_var()); | 2924 VisitForAccumulatorValue(super_ref->this_var()); |
2927 __ Push(scratch, v0, v0, scratch); | 2925 __ Push(scratch, v0, v0, scratch); |
2928 __ Push(key->value()); | 2926 __ Push(key->value()); |
2929 | 2927 |
2930 // Stack here: | 2928 // Stack here: |
2931 // - home_object | 2929 // - home_object |
2932 // - this (receiver) | 2930 // - this (receiver) |
2933 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2931 // - this (receiver) <-- LoadFromSuper will pop here and below. |
2934 // - home_object | 2932 // - home_object |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2972 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2970 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
2973 Expression* callee = expr->expression(); | 2971 Expression* callee = expr->expression(); |
2974 DCHECK(callee->IsProperty()); | 2972 DCHECK(callee->IsProperty()); |
2975 Property* prop = callee->AsProperty(); | 2973 Property* prop = callee->AsProperty(); |
2976 DCHECK(prop->IsSuperAccess()); | 2974 DCHECK(prop->IsSuperAccess()); |
2977 | 2975 |
2978 SetSourcePosition(prop->position()); | 2976 SetSourcePosition(prop->position()); |
2979 // Load the function from the receiver. | 2977 // Load the function from the receiver. |
2980 const Register scratch = a1; | 2978 const Register scratch = a1; |
2981 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2979 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2982 EmitLoadHomeObject(super_ref); | 2980 VisitForAccumulatorValue(super_ref->home_object_var()); |
2983 __ Move(scratch, v0); | 2981 __ Move(scratch, v0); |
2984 VisitForAccumulatorValue(super_ref->this_var()); | 2982 VisitForAccumulatorValue(super_ref->this_var()); |
2985 __ Push(scratch, v0, v0, scratch); | 2983 __ Push(scratch, v0, v0, scratch); |
2986 VisitForStackValue(prop->key()); | 2984 VisitForStackValue(prop->key()); |
2987 | 2985 |
2988 // Stack here: | 2986 // Stack here: |
2989 // - home_object | 2987 // - home_object |
2990 // - this (receiver) | 2988 // - this (receiver) |
2991 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2989 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
2992 // - home_object | 2990 // - home_object |
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4844 case NAMED_PROPERTY: { | 4842 case NAMED_PROPERTY: { |
4845 // Put the object both on the stack and in the register. | 4843 // Put the object both on the stack and in the register. |
4846 VisitForStackValue(prop->obj()); | 4844 VisitForStackValue(prop->obj()); |
4847 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4845 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
4848 EmitNamedPropertyLoad(prop); | 4846 EmitNamedPropertyLoad(prop); |
4849 break; | 4847 break; |
4850 } | 4848 } |
4851 | 4849 |
4852 case NAMED_SUPER_PROPERTY: { | 4850 case NAMED_SUPER_PROPERTY: { |
4853 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4851 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4854 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4852 VisitForAccumulatorValue( |
| 4853 prop->obj()->AsSuperReference()->home_object_var()); |
4855 __ Push(result_register()); | 4854 __ Push(result_register()); |
4856 const Register scratch = a1; | 4855 const Register scratch = a1; |
4857 __ lw(scratch, MemOperand(sp, kPointerSize)); | 4856 __ lw(scratch, MemOperand(sp, kPointerSize)); |
4858 __ Push(scratch, result_register()); | 4857 __ Push(scratch, result_register()); |
4859 EmitNamedSuperPropertyLoad(prop); | 4858 EmitNamedSuperPropertyLoad(prop); |
4860 break; | 4859 break; |
4861 } | 4860 } |
4862 | 4861 |
4863 case KEYED_SUPER_PROPERTY: { | 4862 case KEYED_SUPER_PROPERTY: { |
4864 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4863 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4865 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4864 VisitForAccumulatorValue( |
| 4865 prop->obj()->AsSuperReference()->home_object_var()); |
4866 const Register scratch = a1; | 4866 const Register scratch = a1; |
4867 const Register scratch1 = t0; | 4867 const Register scratch1 = t0; |
4868 __ Move(scratch, result_register()); | 4868 __ Move(scratch, result_register()); |
4869 VisitForAccumulatorValue(prop->key()); | 4869 VisitForAccumulatorValue(prop->key()); |
4870 __ Push(scratch, result_register()); | 4870 __ Push(scratch, result_register()); |
4871 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); | 4871 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); |
4872 __ Push(scratch1, scratch, result_register()); | 4872 __ Push(scratch1, scratch, result_register()); |
4873 EmitKeyedSuperPropertyLoad(prop); | 4873 EmitKeyedSuperPropertyLoad(prop); |
4874 break; | 4874 break; |
4875 } | 4875 } |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5459 Assembler::target_address_at(pc_immediate_load_address)) == | 5459 Assembler::target_address_at(pc_immediate_load_address)) == |
5460 reinterpret_cast<uint32_t>( | 5460 reinterpret_cast<uint32_t>( |
5461 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5461 isolate->builtins()->OsrAfterStackCheck()->entry())); |
5462 return OSR_AFTER_STACK_CHECK; | 5462 return OSR_AFTER_STACK_CHECK; |
5463 } | 5463 } |
5464 | 5464 |
5465 | 5465 |
5466 } } // namespace v8::internal | 5466 } } // namespace v8::internal |
5467 | 5467 |
5468 #endif // V8_TARGET_ARCH_MIPS | 5468 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |