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