| 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 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1935 if (expr->is_compound()) { | 1933 if (expr->is_compound()) { |
| 1936 // We need the receiver both on the stack and in the register. | 1934 // We need the receiver both on the stack and in the register. |
| 1937 VisitForStackValue(property->obj()); | 1935 VisitForStackValue(property->obj()); |
| 1938 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1936 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 1939 } else { | 1937 } else { |
| 1940 VisitForStackValue(property->obj()); | 1938 VisitForStackValue(property->obj()); |
| 1941 } | 1939 } |
| 1942 break; | 1940 break; |
| 1943 case NAMED_SUPER_PROPERTY: | 1941 case NAMED_SUPER_PROPERTY: |
| 1944 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1942 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1945 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1943 VisitForAccumulatorValue( |
| 1944 property->obj()->AsSuperReference()->home_object_var()); |
| 1946 __ Push(result_register()); | 1945 __ Push(result_register()); |
| 1947 if (expr->is_compound()) { | 1946 if (expr->is_compound()) { |
| 1948 const Register scratch = a1; | 1947 const Register scratch = a1; |
| 1949 __ lw(scratch, MemOperand(sp, kPointerSize)); | 1948 __ lw(scratch, MemOperand(sp, kPointerSize)); |
| 1950 __ Push(scratch, result_register()); | 1949 __ Push(scratch, result_register()); |
| 1951 } | 1950 } |
| 1952 break; | 1951 break; |
| 1953 case KEYED_SUPER_PROPERTY: { | 1952 case KEYED_SUPER_PROPERTY: { |
| 1954 const Register scratch = a1; | 1953 const Register scratch = a1; |
| 1955 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1954 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1956 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1955 VisitForAccumulatorValue( |
| 1956 property->obj()->AsSuperReference()->home_object_var()); |
| 1957 __ Move(scratch, result_register()); | 1957 __ Move(scratch, result_register()); |
| 1958 VisitForAccumulatorValue(property->key()); | 1958 VisitForAccumulatorValue(property->key()); |
| 1959 __ Push(scratch, result_register()); | 1959 __ Push(scratch, result_register()); |
| 1960 if (expr->is_compound()) { | 1960 if (expr->is_compound()) { |
| 1961 const Register scratch1 = t0; | 1961 const Register scratch1 = t0; |
| 1962 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); | 1962 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); |
| 1963 __ Push(scratch1, scratch, result_register()); | 1963 __ Push(scratch1, scratch, result_register()); |
| 1964 } | 1964 } |
| 1965 break; | 1965 break; |
| 1966 } | 1966 } |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2579 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); | 2579 __ mov(StoreDescriptor::ReceiverRegister(), result_register()); |
| 2580 __ pop(StoreDescriptor::ValueRegister()); // Restore value. | 2580 __ pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2581 __ li(StoreDescriptor::NameRegister(), | 2581 __ li(StoreDescriptor::NameRegister(), |
| 2582 Operand(prop->key()->AsLiteral()->value())); | 2582 Operand(prop->key()->AsLiteral()->value())); |
| 2583 CallStoreIC(); | 2583 CallStoreIC(); |
| 2584 break; | 2584 break; |
| 2585 } | 2585 } |
| 2586 case NAMED_SUPER_PROPERTY: { | 2586 case NAMED_SUPER_PROPERTY: { |
| 2587 __ Push(v0); | 2587 __ Push(v0); |
| 2588 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2588 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2589 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2589 VisitForAccumulatorValue( |
| 2590 prop->obj()->AsSuperReference()->home_object_var()); |
| 2590 // stack: value, this; v0: home_object | 2591 // stack: value, this; v0: home_object |
| 2591 Register scratch = a2; | 2592 Register scratch = a2; |
| 2592 Register scratch2 = a3; | 2593 Register scratch2 = a3; |
| 2593 __ mov(scratch, result_register()); // home_object | 2594 __ mov(scratch, result_register()); // home_object |
| 2594 __ lw(v0, MemOperand(sp, kPointerSize)); // value | 2595 __ lw(v0, MemOperand(sp, kPointerSize)); // value |
| 2595 __ lw(scratch2, MemOperand(sp, 0)); // this | 2596 __ lw(scratch2, MemOperand(sp, 0)); // this |
| 2596 __ sw(scratch2, MemOperand(sp, kPointerSize)); // this | 2597 __ sw(scratch2, MemOperand(sp, kPointerSize)); // this |
| 2597 __ sw(scratch, MemOperand(sp, 0)); // home_object | 2598 __ sw(scratch, MemOperand(sp, 0)); // home_object |
| 2598 // stack: this, home_object; v0: value | 2599 // stack: this, home_object; v0: value |
| 2599 EmitNamedSuperPropertyStore(prop); | 2600 EmitNamedSuperPropertyStore(prop); |
| 2600 break; | 2601 break; |
| 2601 } | 2602 } |
| 2602 case KEYED_SUPER_PROPERTY: { | 2603 case KEYED_SUPER_PROPERTY: { |
| 2603 __ Push(v0); | 2604 __ Push(v0); |
| 2604 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2605 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2605 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2606 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 2606 __ Push(result_register()); | |
| 2607 VisitForAccumulatorValue(prop->key()); | 2607 VisitForAccumulatorValue(prop->key()); |
| 2608 Register scratch = a2; | 2608 Register scratch = a2; |
| 2609 Register scratch2 = a3; | 2609 Register scratch2 = a3; |
| 2610 __ lw(scratch2, MemOperand(sp, 2 * kPointerSize)); // value | 2610 __ lw(scratch2, MemOperand(sp, 2 * kPointerSize)); // value |
| 2611 // stack: value, this, home_object; v0: key, a3: value | 2611 // stack: value, this, home_object; v0: key, a3: value |
| 2612 __ lw(scratch, MemOperand(sp, kPointerSize)); // this | 2612 __ lw(scratch, MemOperand(sp, kPointerSize)); // this |
| 2613 __ sw(scratch, MemOperand(sp, 2 * kPointerSize)); | 2613 __ sw(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 2614 __ lw(scratch, MemOperand(sp, 0)); // home_object | 2614 __ lw(scratch, MemOperand(sp, 0)); // home_object |
| 2615 __ sw(scratch, MemOperand(sp, kPointerSize)); | 2615 __ sw(scratch, MemOperand(sp, kPointerSize)); |
| 2616 __ sw(v0, MemOperand(sp, 0)); | 2616 __ sw(v0, MemOperand(sp, 0)); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2813 Comment cmnt(masm_, "[ Property"); | 2813 Comment cmnt(masm_, "[ Property"); |
| 2814 Expression* key = expr->key(); | 2814 Expression* key = expr->key(); |
| 2815 | 2815 |
| 2816 if (key->IsPropertyName()) { | 2816 if (key->IsPropertyName()) { |
| 2817 if (!expr->IsSuperAccess()) { | 2817 if (!expr->IsSuperAccess()) { |
| 2818 VisitForAccumulatorValue(expr->obj()); | 2818 VisitForAccumulatorValue(expr->obj()); |
| 2819 __ Move(LoadDescriptor::ReceiverRegister(), v0); | 2819 __ Move(LoadDescriptor::ReceiverRegister(), v0); |
| 2820 EmitNamedPropertyLoad(expr); | 2820 EmitNamedPropertyLoad(expr); |
| 2821 } else { | 2821 } else { |
| 2822 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2822 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2823 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2823 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2824 __ Push(result_register()); | |
| 2825 EmitNamedSuperPropertyLoad(expr); | 2824 EmitNamedSuperPropertyLoad(expr); |
| 2826 } | 2825 } |
| 2827 } else { | 2826 } else { |
| 2828 if (!expr->IsSuperAccess()) { | 2827 if (!expr->IsSuperAccess()) { |
| 2829 VisitForStackValue(expr->obj()); | 2828 VisitForStackValue(expr->obj()); |
| 2830 VisitForAccumulatorValue(expr->key()); | 2829 VisitForAccumulatorValue(expr->key()); |
| 2831 __ Move(LoadDescriptor::NameRegister(), v0); | 2830 __ Move(LoadDescriptor::NameRegister(), v0); |
| 2832 __ pop(LoadDescriptor::ReceiverRegister()); | 2831 __ pop(LoadDescriptor::ReceiverRegister()); |
| 2833 EmitKeyedPropertyLoad(expr); | 2832 EmitKeyedPropertyLoad(expr); |
| 2834 } else { | 2833 } else { |
| 2835 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2834 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2836 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2835 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2837 __ Push(result_register()); | |
| 2838 VisitForStackValue(expr->key()); | 2836 VisitForStackValue(expr->key()); |
| 2839 EmitKeyedSuperPropertyLoad(expr); | 2837 EmitKeyedSuperPropertyLoad(expr); |
| 2840 } | 2838 } |
| 2841 } | 2839 } |
| 2842 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2840 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2843 context()->Plug(v0); | 2841 context()->Plug(v0); |
| 2844 } | 2842 } |
| 2845 | 2843 |
| 2846 | 2844 |
| 2847 void FullCodeGenerator::CallIC(Handle<Code> code, | 2845 void FullCodeGenerator::CallIC(Handle<Code> code, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2890 DCHECK(callee->IsProperty()); | 2888 DCHECK(callee->IsProperty()); |
| 2891 Property* prop = callee->AsProperty(); | 2889 Property* prop = callee->AsProperty(); |
| 2892 DCHECK(prop->IsSuperAccess()); | 2890 DCHECK(prop->IsSuperAccess()); |
| 2893 | 2891 |
| 2894 SetSourcePosition(prop->position()); | 2892 SetSourcePosition(prop->position()); |
| 2895 Literal* key = prop->key()->AsLiteral(); | 2893 Literal* key = prop->key()->AsLiteral(); |
| 2896 DCHECK(!key->value()->IsSmi()); | 2894 DCHECK(!key->value()->IsSmi()); |
| 2897 // Load the function from the receiver. | 2895 // Load the function from the receiver. |
| 2898 const Register scratch = a1; | 2896 const Register scratch = a1; |
| 2899 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2897 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| 2900 EmitLoadHomeObject(super_ref); | 2898 VisitForAccumulatorValue(super_ref->home_object_var()); |
| 2901 __ mov(scratch, v0); | 2899 __ mov(scratch, v0); |
| 2902 VisitForAccumulatorValue(super_ref->this_var()); | 2900 VisitForAccumulatorValue(super_ref->this_var()); |
| 2903 __ Push(scratch, v0, v0, scratch); | 2901 __ Push(scratch, v0, v0, scratch); |
| 2904 __ Push(key->value()); | 2902 __ Push(key->value()); |
| 2905 | 2903 |
| 2906 // Stack here: | 2904 // Stack here: |
| 2907 // - home_object | 2905 // - home_object |
| 2908 // - this (receiver) | 2906 // - this (receiver) |
| 2909 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2907 // - this (receiver) <-- LoadFromSuper will pop here and below. |
| 2910 // - home_object | 2908 // - home_object |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2948 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { | 2946 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { |
| 2949 Expression* callee = expr->expression(); | 2947 Expression* callee = expr->expression(); |
| 2950 DCHECK(callee->IsProperty()); | 2948 DCHECK(callee->IsProperty()); |
| 2951 Property* prop = callee->AsProperty(); | 2949 Property* prop = callee->AsProperty(); |
| 2952 DCHECK(prop->IsSuperAccess()); | 2950 DCHECK(prop->IsSuperAccess()); |
| 2953 | 2951 |
| 2954 SetSourcePosition(prop->position()); | 2952 SetSourcePosition(prop->position()); |
| 2955 // Load the function from the receiver. | 2953 // Load the function from the receiver. |
| 2956 const Register scratch = a1; | 2954 const Register scratch = a1; |
| 2957 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2955 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
| 2958 EmitLoadHomeObject(super_ref); | 2956 VisitForAccumulatorValue(super_ref->home_object_var()); |
| 2959 __ Move(scratch, v0); | 2957 __ Move(scratch, v0); |
| 2960 VisitForAccumulatorValue(super_ref->this_var()); | 2958 VisitForAccumulatorValue(super_ref->this_var()); |
| 2961 __ Push(scratch, v0, v0, scratch); | 2959 __ Push(scratch, v0, v0, scratch); |
| 2962 VisitForStackValue(prop->key()); | 2960 VisitForStackValue(prop->key()); |
| 2963 | 2961 |
| 2964 // Stack here: | 2962 // Stack here: |
| 2965 // - home_object | 2963 // - home_object |
| 2966 // - this (receiver) | 2964 // - this (receiver) |
| 2967 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2965 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
| 2968 // - home_object | 2966 // - home_object |
| (...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4820 case NAMED_PROPERTY: { | 4818 case NAMED_PROPERTY: { |
| 4821 // Put the object both on the stack and in the register. | 4819 // Put the object both on the stack and in the register. |
| 4822 VisitForStackValue(prop->obj()); | 4820 VisitForStackValue(prop->obj()); |
| 4823 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4821 __ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 4824 EmitNamedPropertyLoad(prop); | 4822 EmitNamedPropertyLoad(prop); |
| 4825 break; | 4823 break; |
| 4826 } | 4824 } |
| 4827 | 4825 |
| 4828 case NAMED_SUPER_PROPERTY: { | 4826 case NAMED_SUPER_PROPERTY: { |
| 4829 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4827 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4830 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4828 VisitForAccumulatorValue( |
| 4829 prop->obj()->AsSuperReference()->home_object_var()); |
| 4831 __ Push(result_register()); | 4830 __ Push(result_register()); |
| 4832 const Register scratch = a1; | 4831 const Register scratch = a1; |
| 4833 __ lw(scratch, MemOperand(sp, kPointerSize)); | 4832 __ lw(scratch, MemOperand(sp, kPointerSize)); |
| 4834 __ Push(scratch, result_register()); | 4833 __ Push(scratch, result_register()); |
| 4835 EmitNamedSuperPropertyLoad(prop); | 4834 EmitNamedSuperPropertyLoad(prop); |
| 4836 break; | 4835 break; |
| 4837 } | 4836 } |
| 4838 | 4837 |
| 4839 case KEYED_SUPER_PROPERTY: { | 4838 case KEYED_SUPER_PROPERTY: { |
| 4840 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4839 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4841 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4840 VisitForAccumulatorValue( |
| 4841 prop->obj()->AsSuperReference()->home_object_var()); |
| 4842 const Register scratch = a1; | 4842 const Register scratch = a1; |
| 4843 const Register scratch1 = t0; | 4843 const Register scratch1 = t0; |
| 4844 __ Move(scratch, result_register()); | 4844 __ Move(scratch, result_register()); |
| 4845 VisitForAccumulatorValue(prop->key()); | 4845 VisitForAccumulatorValue(prop->key()); |
| 4846 __ Push(scratch, result_register()); | 4846 __ Push(scratch, result_register()); |
| 4847 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); | 4847 __ lw(scratch1, MemOperand(sp, 2 * kPointerSize)); |
| 4848 __ Push(scratch1, scratch, result_register()); | 4848 __ Push(scratch1, scratch, result_register()); |
| 4849 EmitKeyedSuperPropertyLoad(prop); | 4849 EmitKeyedSuperPropertyLoad(prop); |
| 4850 break; | 4850 break; |
| 4851 } | 4851 } |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5423 Assembler::target_address_at(pc_immediate_load_address)) == | 5423 Assembler::target_address_at(pc_immediate_load_address)) == |
| 5424 reinterpret_cast<uint32_t>( | 5424 reinterpret_cast<uint32_t>( |
| 5425 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5425 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 5426 return OSR_AFTER_STACK_CHECK; | 5426 return OSR_AFTER_STACK_CHECK; |
| 5427 } | 5427 } |
| 5428 | 5428 |
| 5429 | 5429 |
| 5430 } } // namespace v8::internal | 5430 } } // namespace v8::internal |
| 5431 | 5431 |
| 5432 #endif // V8_TARGET_ARCH_MIPS | 5432 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |