| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
| 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 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 } else if (FLAG_debug_code) { | 236 } else if (FLAG_debug_code) { |
| 237 Label done; | 237 Label done; |
| 238 __ JumpIfInNewSpace(cp, &done); | 238 __ JumpIfInNewSpace(cp, &done); |
| 239 __ Abort(kExpectedNewSpaceObject); | 239 __ Abort(kExpectedNewSpaceObject); |
| 240 __ bind(&done); | 240 __ bind(&done); |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 | 245 |
| 246 Variable* home_object_var = scope()->home_object_var(); |
| 247 if (home_object_var != nullptr) { |
| 248 __ Push(x1); |
| 249 } |
| 250 |
| 246 ArgumentsAccessStub::HasNewTarget has_new_target = | 251 ArgumentsAccessStub::HasNewTarget has_new_target = |
| 247 IsSubclassConstructor(info->function()->kind()) | 252 IsSubclassConstructor(info->function()->kind()) |
| 248 ? ArgumentsAccessStub::HAS_NEW_TARGET | 253 ? ArgumentsAccessStub::HAS_NEW_TARGET |
| 249 : ArgumentsAccessStub::NO_NEW_TARGET; | 254 : ArgumentsAccessStub::NO_NEW_TARGET; |
| 250 | 255 |
| 251 // Possibly allocate RestParameters | 256 // Possibly allocate RestParameters |
| 252 int rest_index; | 257 int rest_index; |
| 253 Variable* rest_param = scope()->rest_parameter(&rest_index); | 258 Variable* rest_param = scope()->rest_parameter(&rest_index); |
| 254 if (rest_param) { | 259 if (rest_param) { |
| 255 Comment cmnt(masm_, "[ Allocate rest parameter array"); | 260 Comment cmnt(masm_, "[ Allocate rest parameter array"); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 305 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
| 301 } else { | 306 } else { |
| 302 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 307 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| 303 } | 308 } |
| 304 ArgumentsAccessStub stub(isolate(), type, has_new_target); | 309 ArgumentsAccessStub stub(isolate(), type, has_new_target); |
| 305 __ CallStub(&stub); | 310 __ CallStub(&stub); |
| 306 | 311 |
| 307 SetVar(arguments, x0, x1, x2); | 312 SetVar(arguments, x0, x1, x2); |
| 308 } | 313 } |
| 309 | 314 |
| 315 // Possibly set up a local binding to the [[HomeObject]]. |
| 316 if (home_object_var != nullptr) { |
| 317 Comment cmnt(masm_, "[ Home object"); |
| 318 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 319 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); |
| 320 __ Mov(LoadDescriptor::NameRegister(), home_object_symbol); |
| 321 __ Mov(LoadDescriptor::SlotRegister(), |
| 322 SmiFromSlot(function()->HomeObjectFeedbackSlot())); |
| 323 CallLoadIC(NOT_CONTEXTUAL); |
| 324 |
| 325 SetVar(home_object_var, x0, x1, x2); |
| 326 } |
| 327 |
| 310 if (FLAG_trace) { | 328 if (FLAG_trace) { |
| 311 __ CallRuntime(Runtime::kTraceEnter, 0); | 329 __ CallRuntime(Runtime::kTraceEnter, 0); |
| 312 } | 330 } |
| 313 | 331 |
| 314 | |
| 315 // Visit the declarations and body unless there is an illegal | 332 // Visit the declarations and body unless there is an illegal |
| 316 // redeclaration. | 333 // redeclaration. |
| 317 if (scope()->HasIllegalRedeclaration()) { | 334 if (scope()->HasIllegalRedeclaration()) { |
| 318 Comment cmnt(masm_, "[ Declarations"); | 335 Comment cmnt(masm_, "[ Declarations"); |
| 319 scope()->VisitIllegalRedeclaration(this); | 336 scope()->VisitIllegalRedeclaration(this); |
| 320 | 337 |
| 321 } else { | 338 } else { |
| 322 PrepareForBailoutForId(BailoutId::FunctionEntry(), NO_REGISTERS); | 339 PrepareForBailoutForId(BailoutId::FunctionEntry(), NO_REGISTERS); |
| 323 { Comment cmnt(masm_, "[ Declarations"); | 340 { Comment cmnt(masm_, "[ Declarations"); |
| 324 if (scope()->is_function_scope() && scope()->function() != NULL) { | 341 if (scope()->is_function_scope() && scope()->function() != NULL) { |
| (...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 context()->Plug(x0); | 1320 context()->Plug(x0); |
| 1304 } | 1321 } |
| 1305 | 1322 |
| 1306 | 1323 |
| 1307 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1324 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
| 1308 Comment cmnt(masm_, "[ VariableProxy"); | 1325 Comment cmnt(masm_, "[ VariableProxy"); |
| 1309 EmitVariableLoad(expr); | 1326 EmitVariableLoad(expr); |
| 1310 } | 1327 } |
| 1311 | 1328 |
| 1312 | 1329 |
| 1313 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { | |
| 1314 Comment cnmt(masm_, "[ SuperReference "); | |
| 1315 | |
| 1316 __ ldr(LoadDescriptor::ReceiverRegister(), | |
| 1317 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | |
| 1318 | |
| 1319 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); | |
| 1320 __ Mov(LoadDescriptor::NameRegister(), Operand(home_object_symbol)); | |
| 1321 | |
| 1322 __ Mov(LoadDescriptor::SlotRegister(), | |
| 1323 SmiFromSlot(expr->HomeObjectFeedbackSlot())); | |
| 1324 CallLoadIC(NOT_CONTEXTUAL); | |
| 1325 | |
| 1326 __ Mov(x10, Operand(isolate()->factory()->undefined_value())); | |
| 1327 __ cmp(x0, x10); | |
| 1328 Label done; | |
| 1329 __ b(&done, ne); | |
| 1330 __ CallRuntime(Runtime::kThrowNonMethodError, 0); | |
| 1331 __ bind(&done); | |
| 1332 } | |
| 1333 | |
| 1334 | |
| 1335 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1330 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
| 1336 int offset) { | 1331 int offset) { |
| 1337 if (NeedsHomeObject(initializer)) { | 1332 if (NeedsHomeObject(initializer)) { |
| 1338 __ Peek(StoreDescriptor::ReceiverRegister(), 0); | 1333 __ Peek(StoreDescriptor::ReceiverRegister(), 0); |
| 1339 __ Mov(StoreDescriptor::NameRegister(), | 1334 __ Mov(StoreDescriptor::NameRegister(), |
| 1340 Operand(isolate()->factory()->home_object_symbol())); | 1335 Operand(isolate()->factory()->home_object_symbol())); |
| 1341 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); | 1336 __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); |
| 1342 CallStoreIC(); | 1337 CallStoreIC(); |
| 1343 } | 1338 } |
| 1344 } | 1339 } |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1944 if (expr->is_compound()) { | 1939 if (expr->is_compound()) { |
| 1945 // We need the receiver both on the stack and in the register. | 1940 // We need the receiver both on the stack and in the register. |
| 1946 VisitForStackValue(property->obj()); | 1941 VisitForStackValue(property->obj()); |
| 1947 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 1942 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
| 1948 } else { | 1943 } else { |
| 1949 VisitForStackValue(property->obj()); | 1944 VisitForStackValue(property->obj()); |
| 1950 } | 1945 } |
| 1951 break; | 1946 break; |
| 1952 case NAMED_SUPER_PROPERTY: | 1947 case NAMED_SUPER_PROPERTY: |
| 1953 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1948 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1954 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1949 VisitForAccumulatorValue( |
| 1950 property->obj()->AsSuperReference()->home_object_var()); |
| 1955 __ Push(result_register()); | 1951 __ Push(result_register()); |
| 1956 if (expr->is_compound()) { | 1952 if (expr->is_compound()) { |
| 1957 const Register scratch = x10; | 1953 const Register scratch = x10; |
| 1958 __ Peek(scratch, kPointerSize); | 1954 __ Peek(scratch, kPointerSize); |
| 1959 __ Push(scratch, result_register()); | 1955 __ Push(scratch, result_register()); |
| 1960 } | 1956 } |
| 1961 break; | 1957 break; |
| 1962 case KEYED_SUPER_PROPERTY: | 1958 case KEYED_SUPER_PROPERTY: |
| 1963 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1959 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1964 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1960 VisitForStackValue( |
| 1965 __ Push(result_register()); | 1961 property->obj()->AsSuperReference()->home_object_var()); |
| 1966 VisitForAccumulatorValue(property->key()); | 1962 VisitForAccumulatorValue(property->key()); |
| 1967 __ Push(result_register()); | 1963 __ Push(result_register()); |
| 1968 if (expr->is_compound()) { | 1964 if (expr->is_compound()) { |
| 1969 const Register scratch1 = x10; | 1965 const Register scratch1 = x10; |
| 1970 const Register scratch2 = x11; | 1966 const Register scratch2 = x11; |
| 1971 __ Peek(scratch1, 2 * kPointerSize); | 1967 __ Peek(scratch1, 2 * kPointerSize); |
| 1972 __ Peek(scratch2, kPointerSize); | 1968 __ Peek(scratch2, kPointerSize); |
| 1973 __ Push(scratch1, scratch2, result_register()); | 1969 __ Push(scratch1, scratch2, result_register()); |
| 1974 } | 1970 } |
| 1975 break; | 1971 break; |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2311 __ Mov(StoreDescriptor::ReceiverRegister(), x0); | 2307 __ Mov(StoreDescriptor::ReceiverRegister(), x0); |
| 2312 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2308 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2313 __ Mov(StoreDescriptor::NameRegister(), | 2309 __ Mov(StoreDescriptor::NameRegister(), |
| 2314 Operand(prop->key()->AsLiteral()->value())); | 2310 Operand(prop->key()->AsLiteral()->value())); |
| 2315 CallStoreIC(); | 2311 CallStoreIC(); |
| 2316 break; | 2312 break; |
| 2317 } | 2313 } |
| 2318 case NAMED_SUPER_PROPERTY: { | 2314 case NAMED_SUPER_PROPERTY: { |
| 2319 __ Push(x0); | 2315 __ Push(x0); |
| 2320 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2316 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2321 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2317 VisitForAccumulatorValue( |
| 2318 prop->obj()->AsSuperReference()->home_object_var()); |
| 2322 // stack: value, this; x0: home_object | 2319 // stack: value, this; x0: home_object |
| 2323 Register scratch = x10; | 2320 Register scratch = x10; |
| 2324 Register scratch2 = x11; | 2321 Register scratch2 = x11; |
| 2325 __ mov(scratch, result_register()); // home_object | 2322 __ mov(scratch, result_register()); // home_object |
| 2326 __ Peek(x0, kPointerSize); // value | 2323 __ Peek(x0, kPointerSize); // value |
| 2327 __ Peek(scratch2, 0); // this | 2324 __ Peek(scratch2, 0); // this |
| 2328 __ Poke(scratch2, kPointerSize); // this | 2325 __ Poke(scratch2, kPointerSize); // this |
| 2329 __ Poke(scratch, 0); // home_object | 2326 __ Poke(scratch, 0); // home_object |
| 2330 // stack: this, home_object; x0: value | 2327 // stack: this, home_object; x0: value |
| 2331 EmitNamedSuperPropertyStore(prop); | 2328 EmitNamedSuperPropertyStore(prop); |
| 2332 break; | 2329 break; |
| 2333 } | 2330 } |
| 2334 case KEYED_SUPER_PROPERTY: { | 2331 case KEYED_SUPER_PROPERTY: { |
| 2335 __ Push(x0); | 2332 __ Push(x0); |
| 2336 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2333 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2337 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2334 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 2338 __ Push(result_register()); | |
| 2339 VisitForAccumulatorValue(prop->key()); | 2335 VisitForAccumulatorValue(prop->key()); |
| 2340 Register scratch = x10; | 2336 Register scratch = x10; |
| 2341 Register scratch2 = x11; | 2337 Register scratch2 = x11; |
| 2342 __ Peek(scratch2, 2 * kPointerSize); // value | 2338 __ Peek(scratch2, 2 * kPointerSize); // value |
| 2343 // stack: value, this, home_object; x0: key, x11: value | 2339 // stack: value, this, home_object; x0: key, x11: value |
| 2344 __ Peek(scratch, kPointerSize); // this | 2340 __ Peek(scratch, kPointerSize); // this |
| 2345 __ Poke(scratch, 2 * kPointerSize); | 2341 __ Poke(scratch, 2 * kPointerSize); |
| 2346 __ Peek(scratch, 0); // home_object | 2342 __ Peek(scratch, 0); // home_object |
| 2347 __ Poke(scratch, kPointerSize); | 2343 __ Poke(scratch, kPointerSize); |
| 2348 __ Poke(x0, 0); | 2344 __ Poke(x0, 0); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2543 Comment cmnt(masm_, "[ Property"); | 2539 Comment cmnt(masm_, "[ Property"); |
| 2544 Expression* key = expr->key(); | 2540 Expression* key = expr->key(); |
| 2545 | 2541 |
| 2546 if (key->IsPropertyName()) { | 2542 if (key->IsPropertyName()) { |
| 2547 if (!expr->IsSuperAccess()) { | 2543 if (!expr->IsSuperAccess()) { |
| 2548 VisitForAccumulatorValue(expr->obj()); | 2544 VisitForAccumulatorValue(expr->obj()); |
| 2549 __ Move(LoadDescriptor::ReceiverRegister(), x0); | 2545 __ Move(LoadDescriptor::ReceiverRegister(), x0); |
| 2550 EmitNamedPropertyLoad(expr); | 2546 EmitNamedPropertyLoad(expr); |
| 2551 } else { | 2547 } else { |
| 2552 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2548 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2553 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2549 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2554 __ Push(result_register()); | |
| 2555 EmitNamedSuperPropertyLoad(expr); | 2550 EmitNamedSuperPropertyLoad(expr); |
| 2556 } | 2551 } |
| 2557 } else { | 2552 } else { |
| 2558 if (!expr->IsSuperAccess()) { | 2553 if (!expr->IsSuperAccess()) { |
| 2559 VisitForStackValue(expr->obj()); | 2554 VisitForStackValue(expr->obj()); |
| 2560 VisitForAccumulatorValue(expr->key()); | 2555 VisitForAccumulatorValue(expr->key()); |
| 2561 __ Move(LoadDescriptor::NameRegister(), x0); | 2556 __ Move(LoadDescriptor::NameRegister(), x0); |
| 2562 __ Pop(LoadDescriptor::ReceiverRegister()); | 2557 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 2563 EmitKeyedPropertyLoad(expr); | 2558 EmitKeyedPropertyLoad(expr); |
| 2564 } else { | 2559 } else { |
| 2565 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2560 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2566 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2561 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2567 __ Push(result_register()); | |
| 2568 VisitForStackValue(expr->key()); | 2562 VisitForStackValue(expr->key()); |
| 2569 EmitKeyedSuperPropertyLoad(expr); | 2563 EmitKeyedSuperPropertyLoad(expr); |
| 2570 } | 2564 } |
| 2571 } | 2565 } |
| 2572 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2566 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2573 context()->Plug(x0); | 2567 context()->Plug(x0); |
| 2574 } | 2568 } |
| 2575 | 2569 |
| 2576 | 2570 |
| 2577 void FullCodeGenerator::CallIC(Handle<Code> code, | 2571 void FullCodeGenerator::CallIC(Handle<Code> code, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2626 Property* prop = callee->AsProperty(); | 2620 Property* prop = callee->AsProperty(); |
| 2627 DCHECK(prop->IsSuperAccess()); | 2621 DCHECK(prop->IsSuperAccess()); |
| 2628 | 2622 |
| 2629 SetSourcePosition(prop->position()); | 2623 SetSourcePosition(prop->position()); |
| 2630 Literal* key = prop->key()->AsLiteral(); | 2624 Literal* key = prop->key()->AsLiteral(); |
| 2631 DCHECK(!key->value()->IsSmi()); | 2625 DCHECK(!key->value()->IsSmi()); |
| 2632 | 2626 |
| 2633 // Load the function from the receiver. | 2627 // Load the function from the receiver. |
| 2634 const Register scratch = x10; | 2628 const Register scratch = x10; |
| 2635 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2629 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2636 EmitLoadHomeObject(super_ref); | 2630 VisitForStackValue(super_ref->home_object_var()); |
| 2637 __ Push(x0); | |
| 2638 VisitForAccumulatorValue(super_ref->this_var()); | 2631 VisitForAccumulatorValue(super_ref->this_var()); |
| 2639 __ Push(x0); | 2632 __ Push(x0); |
| 2640 __ Peek(scratch, kPointerSize); | 2633 __ Peek(scratch, kPointerSize); |
| 2641 __ Push(x0, scratch); | 2634 __ Push(x0, scratch); |
| 2642 __ Push(key->value()); | 2635 __ Push(key->value()); |
| 2643 | 2636 |
| 2644 // Stack here: | 2637 // Stack here: |
| 2645 // - home_object | 2638 // - home_object |
| 2646 // - this (receiver) | 2639 // - this (receiver) |
| 2647 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2640 // - this (receiver) <-- LoadFromSuper will pop here and below. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2686 Expression* callee = expr->expression(); | 2679 Expression* callee = expr->expression(); |
| 2687 DCHECK(callee->IsProperty()); | 2680 DCHECK(callee->IsProperty()); |
| 2688 Property* prop = callee->AsProperty(); | 2681 Property* prop = callee->AsProperty(); |
| 2689 DCHECK(prop->IsSuperAccess()); | 2682 DCHECK(prop->IsSuperAccess()); |
| 2690 | 2683 |
| 2691 SetSourcePosition(prop->position()); | 2684 SetSourcePosition(prop->position()); |
| 2692 | 2685 |
| 2693 // Load the function from the receiver. | 2686 // Load the function from the receiver. |
| 2694 const Register scratch = x10; | 2687 const Register scratch = x10; |
| 2695 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2688 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2696 EmitLoadHomeObject(super_ref); | 2689 VisitForStackValue(super_ref->home_object_var()); |
| 2697 __ Push(x0); | |
| 2698 VisitForAccumulatorValue(super_ref->this_var()); | 2690 VisitForAccumulatorValue(super_ref->this_var()); |
| 2699 __ Push(x0); | 2691 __ Push(x0); |
| 2700 __ Peek(scratch, kPointerSize); | 2692 __ Peek(scratch, kPointerSize); |
| 2701 __ Push(x0, scratch); | 2693 __ Push(x0, scratch); |
| 2702 VisitForStackValue(prop->key()); | 2694 VisitForStackValue(prop->key()); |
| 2703 | 2695 |
| 2704 // Stack here: | 2696 // Stack here: |
| 2705 // - home_object | 2697 // - home_object |
| 2706 // - this (receiver) | 2698 // - this (receiver) |
| 2707 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2699 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
| (...skipping 1815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4523 case NAMED_PROPERTY: { | 4515 case NAMED_PROPERTY: { |
| 4524 // Put the object both on the stack and in the register. | 4516 // Put the object both on the stack and in the register. |
| 4525 VisitForStackValue(prop->obj()); | 4517 VisitForStackValue(prop->obj()); |
| 4526 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 4518 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
| 4527 EmitNamedPropertyLoad(prop); | 4519 EmitNamedPropertyLoad(prop); |
| 4528 break; | 4520 break; |
| 4529 } | 4521 } |
| 4530 | 4522 |
| 4531 case NAMED_SUPER_PROPERTY: { | 4523 case NAMED_SUPER_PROPERTY: { |
| 4532 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4524 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4533 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4525 VisitForAccumulatorValue( |
| 4526 prop->obj()->AsSuperReference()->home_object_var()); |
| 4534 __ Push(result_register()); | 4527 __ Push(result_register()); |
| 4535 const Register scratch = x10; | 4528 const Register scratch = x10; |
| 4536 __ Peek(scratch, kPointerSize); | 4529 __ Peek(scratch, kPointerSize); |
| 4537 __ Push(scratch, result_register()); | 4530 __ Push(scratch, result_register()); |
| 4538 EmitNamedSuperPropertyLoad(prop); | 4531 EmitNamedSuperPropertyLoad(prop); |
| 4539 break; | 4532 break; |
| 4540 } | 4533 } |
| 4541 | 4534 |
| 4542 case KEYED_SUPER_PROPERTY: { | 4535 case KEYED_SUPER_PROPERTY: { |
| 4543 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4536 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4544 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4537 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 4545 __ Push(result_register()); | |
| 4546 VisitForAccumulatorValue(prop->key()); | 4538 VisitForAccumulatorValue(prop->key()); |
| 4547 __ Push(result_register()); | 4539 __ Push(result_register()); |
| 4548 const Register scratch1 = x10; | 4540 const Register scratch1 = x10; |
| 4549 const Register scratch2 = x11; | 4541 const Register scratch2 = x11; |
| 4550 __ Peek(scratch1, 2 * kPointerSize); | 4542 __ Peek(scratch1, 2 * kPointerSize); |
| 4551 __ Peek(scratch2, kPointerSize); | 4543 __ Peek(scratch2, kPointerSize); |
| 4552 __ Push(scratch1, scratch2, result_register()); | 4544 __ Push(scratch1, scratch2, result_register()); |
| 4553 EmitKeyedSuperPropertyLoad(prop); | 4545 EmitKeyedSuperPropertyLoad(prop); |
| 4554 break; | 4546 break; |
| 4555 } | 4547 } |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5488 } | 5480 } |
| 5489 } | 5481 } |
| 5490 | 5482 |
| 5491 return INTERRUPT; | 5483 return INTERRUPT; |
| 5492 } | 5484 } |
| 5493 | 5485 |
| 5494 | 5486 |
| 5495 } } // namespace v8::internal | 5487 } } // namespace v8::internal |
| 5496 | 5488 |
| 5497 #endif // V8_TARGET_ARCH_ARM64 | 5489 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |