| 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 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1921 if (expr->is_compound()) { | 1916 if (expr->is_compound()) { |
| 1922 // We need the receiver both on the stack and in the register. | 1917 // We need the receiver both on the stack and in the register. |
| 1923 VisitForStackValue(property->obj()); | 1918 VisitForStackValue(property->obj()); |
| 1924 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 1919 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
| 1925 } else { | 1920 } else { |
| 1926 VisitForStackValue(property->obj()); | 1921 VisitForStackValue(property->obj()); |
| 1927 } | 1922 } |
| 1928 break; | 1923 break; |
| 1929 case NAMED_SUPER_PROPERTY: | 1924 case NAMED_SUPER_PROPERTY: |
| 1930 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1925 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1931 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1926 VisitForAccumulatorValue( |
| 1927 property->obj()->AsSuperReference()->home_object_var()); |
| 1932 __ Push(result_register()); | 1928 __ Push(result_register()); |
| 1933 if (expr->is_compound()) { | 1929 if (expr->is_compound()) { |
| 1934 const Register scratch = x10; | 1930 const Register scratch = x10; |
| 1935 __ Peek(scratch, kPointerSize); | 1931 __ Peek(scratch, kPointerSize); |
| 1936 __ Push(scratch, result_register()); | 1932 __ Push(scratch, result_register()); |
| 1937 } | 1933 } |
| 1938 break; | 1934 break; |
| 1939 case KEYED_SUPER_PROPERTY: | 1935 case KEYED_SUPER_PROPERTY: |
| 1940 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1936 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1941 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1937 VisitForStackValue( |
| 1942 __ Push(result_register()); | 1938 property->obj()->AsSuperReference()->home_object_var()); |
| 1943 VisitForAccumulatorValue(property->key()); | 1939 VisitForAccumulatorValue(property->key()); |
| 1944 __ Push(result_register()); | 1940 __ Push(result_register()); |
| 1945 if (expr->is_compound()) { | 1941 if (expr->is_compound()) { |
| 1946 const Register scratch1 = x10; | 1942 const Register scratch1 = x10; |
| 1947 const Register scratch2 = x11; | 1943 const Register scratch2 = x11; |
| 1948 __ Peek(scratch1, 2 * kPointerSize); | 1944 __ Peek(scratch1, 2 * kPointerSize); |
| 1949 __ Peek(scratch2, kPointerSize); | 1945 __ Peek(scratch2, kPointerSize); |
| 1950 __ Push(scratch1, scratch2, result_register()); | 1946 __ Push(scratch1, scratch2, result_register()); |
| 1951 } | 1947 } |
| 1952 break; | 1948 break; |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2288 __ Mov(StoreDescriptor::ReceiverRegister(), x0); | 2284 __ Mov(StoreDescriptor::ReceiverRegister(), x0); |
| 2289 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. | 2285 __ Pop(StoreDescriptor::ValueRegister()); // Restore value. |
| 2290 __ Mov(StoreDescriptor::NameRegister(), | 2286 __ Mov(StoreDescriptor::NameRegister(), |
| 2291 Operand(prop->key()->AsLiteral()->value())); | 2287 Operand(prop->key()->AsLiteral()->value())); |
| 2292 CallStoreIC(); | 2288 CallStoreIC(); |
| 2293 break; | 2289 break; |
| 2294 } | 2290 } |
| 2295 case NAMED_SUPER_PROPERTY: { | 2291 case NAMED_SUPER_PROPERTY: { |
| 2296 __ Push(x0); | 2292 __ Push(x0); |
| 2297 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2293 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2298 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2294 VisitForAccumulatorValue( |
| 2295 prop->obj()->AsSuperReference()->home_object_var()); |
| 2299 // stack: value, this; x0: home_object | 2296 // stack: value, this; x0: home_object |
| 2300 Register scratch = x10; | 2297 Register scratch = x10; |
| 2301 Register scratch2 = x11; | 2298 Register scratch2 = x11; |
| 2302 __ mov(scratch, result_register()); // home_object | 2299 __ mov(scratch, result_register()); // home_object |
| 2303 __ Peek(x0, kPointerSize); // value | 2300 __ Peek(x0, kPointerSize); // value |
| 2304 __ Peek(scratch2, 0); // this | 2301 __ Peek(scratch2, 0); // this |
| 2305 __ Poke(scratch2, kPointerSize); // this | 2302 __ Poke(scratch2, kPointerSize); // this |
| 2306 __ Poke(scratch, 0); // home_object | 2303 __ Poke(scratch, 0); // home_object |
| 2307 // stack: this, home_object; x0: value | 2304 // stack: this, home_object; x0: value |
| 2308 EmitNamedSuperPropertyStore(prop); | 2305 EmitNamedSuperPropertyStore(prop); |
| 2309 break; | 2306 break; |
| 2310 } | 2307 } |
| 2311 case KEYED_SUPER_PROPERTY: { | 2308 case KEYED_SUPER_PROPERTY: { |
| 2312 __ Push(x0); | 2309 __ Push(x0); |
| 2313 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 2310 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 2314 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 2311 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 2315 __ Push(result_register()); | |
| 2316 VisitForAccumulatorValue(prop->key()); | 2312 VisitForAccumulatorValue(prop->key()); |
| 2317 Register scratch = x10; | 2313 Register scratch = x10; |
| 2318 Register scratch2 = x11; | 2314 Register scratch2 = x11; |
| 2319 __ Peek(scratch2, 2 * kPointerSize); // value | 2315 __ Peek(scratch2, 2 * kPointerSize); // value |
| 2320 // stack: value, this, home_object; x0: key, x11: value | 2316 // stack: value, this, home_object; x0: key, x11: value |
| 2321 __ Peek(scratch, kPointerSize); // this | 2317 __ Peek(scratch, kPointerSize); // this |
| 2322 __ Poke(scratch, 2 * kPointerSize); | 2318 __ Poke(scratch, 2 * kPointerSize); |
| 2323 __ Peek(scratch, 0); // home_object | 2319 __ Peek(scratch, 0); // home_object |
| 2324 __ Poke(scratch, kPointerSize); | 2320 __ Poke(scratch, kPointerSize); |
| 2325 __ Poke(x0, 0); | 2321 __ Poke(x0, 0); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2520 Comment cmnt(masm_, "[ Property"); | 2516 Comment cmnt(masm_, "[ Property"); |
| 2521 Expression* key = expr->key(); | 2517 Expression* key = expr->key(); |
| 2522 | 2518 |
| 2523 if (key->IsPropertyName()) { | 2519 if (key->IsPropertyName()) { |
| 2524 if (!expr->IsSuperAccess()) { | 2520 if (!expr->IsSuperAccess()) { |
| 2525 VisitForAccumulatorValue(expr->obj()); | 2521 VisitForAccumulatorValue(expr->obj()); |
| 2526 __ Move(LoadDescriptor::ReceiverRegister(), x0); | 2522 __ Move(LoadDescriptor::ReceiverRegister(), x0); |
| 2527 EmitNamedPropertyLoad(expr); | 2523 EmitNamedPropertyLoad(expr); |
| 2528 } else { | 2524 } else { |
| 2529 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2525 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2530 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2526 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2531 __ Push(result_register()); | |
| 2532 EmitNamedSuperPropertyLoad(expr); | 2527 EmitNamedSuperPropertyLoad(expr); |
| 2533 } | 2528 } |
| 2534 } else { | 2529 } else { |
| 2535 if (!expr->IsSuperAccess()) { | 2530 if (!expr->IsSuperAccess()) { |
| 2536 VisitForStackValue(expr->obj()); | 2531 VisitForStackValue(expr->obj()); |
| 2537 VisitForAccumulatorValue(expr->key()); | 2532 VisitForAccumulatorValue(expr->key()); |
| 2538 __ Move(LoadDescriptor::NameRegister(), x0); | 2533 __ Move(LoadDescriptor::NameRegister(), x0); |
| 2539 __ Pop(LoadDescriptor::ReceiverRegister()); | 2534 __ Pop(LoadDescriptor::ReceiverRegister()); |
| 2540 EmitKeyedPropertyLoad(expr); | 2535 EmitKeyedPropertyLoad(expr); |
| 2541 } else { | 2536 } else { |
| 2542 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 2537 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2543 EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 2538 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var()); |
| 2544 __ Push(result_register()); | |
| 2545 VisitForStackValue(expr->key()); | 2539 VisitForStackValue(expr->key()); |
| 2546 EmitKeyedSuperPropertyLoad(expr); | 2540 EmitKeyedSuperPropertyLoad(expr); |
| 2547 } | 2541 } |
| 2548 } | 2542 } |
| 2549 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2543 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
| 2550 context()->Plug(x0); | 2544 context()->Plug(x0); |
| 2551 } | 2545 } |
| 2552 | 2546 |
| 2553 | 2547 |
| 2554 void FullCodeGenerator::CallIC(Handle<Code> code, | 2548 void FullCodeGenerator::CallIC(Handle<Code> code, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2603 Property* prop = callee->AsProperty(); | 2597 Property* prop = callee->AsProperty(); |
| 2604 DCHECK(prop->IsSuperAccess()); | 2598 DCHECK(prop->IsSuperAccess()); |
| 2605 | 2599 |
| 2606 SetSourcePosition(prop->position()); | 2600 SetSourcePosition(prop->position()); |
| 2607 Literal* key = prop->key()->AsLiteral(); | 2601 Literal* key = prop->key()->AsLiteral(); |
| 2608 DCHECK(!key->value()->IsSmi()); | 2602 DCHECK(!key->value()->IsSmi()); |
| 2609 | 2603 |
| 2610 // Load the function from the receiver. | 2604 // Load the function from the receiver. |
| 2611 const Register scratch = x10; | 2605 const Register scratch = x10; |
| 2612 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2606 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2613 EmitLoadHomeObject(super_ref); | 2607 VisitForStackValue(super_ref->home_object_var()); |
| 2614 __ Push(x0); | |
| 2615 VisitForAccumulatorValue(super_ref->this_var()); | 2608 VisitForAccumulatorValue(super_ref->this_var()); |
| 2616 __ Push(x0); | 2609 __ Push(x0); |
| 2617 __ Peek(scratch, kPointerSize); | 2610 __ Peek(scratch, kPointerSize); |
| 2618 __ Push(x0, scratch); | 2611 __ Push(x0, scratch); |
| 2619 __ Push(key->value()); | 2612 __ Push(key->value()); |
| 2620 | 2613 |
| 2621 // Stack here: | 2614 // Stack here: |
| 2622 // - home_object | 2615 // - home_object |
| 2623 // - this (receiver) | 2616 // - this (receiver) |
| 2624 // - this (receiver) <-- LoadFromSuper will pop here and below. | 2617 // - this (receiver) <-- LoadFromSuper will pop here and below. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2663 Expression* callee = expr->expression(); | 2656 Expression* callee = expr->expression(); |
| 2664 DCHECK(callee->IsProperty()); | 2657 DCHECK(callee->IsProperty()); |
| 2665 Property* prop = callee->AsProperty(); | 2658 Property* prop = callee->AsProperty(); |
| 2666 DCHECK(prop->IsSuperAccess()); | 2659 DCHECK(prop->IsSuperAccess()); |
| 2667 | 2660 |
| 2668 SetSourcePosition(prop->position()); | 2661 SetSourcePosition(prop->position()); |
| 2669 | 2662 |
| 2670 // Load the function from the receiver. | 2663 // Load the function from the receiver. |
| 2671 const Register scratch = x10; | 2664 const Register scratch = x10; |
| 2672 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); | 2665 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); |
| 2673 EmitLoadHomeObject(super_ref); | 2666 VisitForStackValue(super_ref->home_object_var()); |
| 2674 __ Push(x0); | |
| 2675 VisitForAccumulatorValue(super_ref->this_var()); | 2667 VisitForAccumulatorValue(super_ref->this_var()); |
| 2676 __ Push(x0); | 2668 __ Push(x0); |
| 2677 __ Peek(scratch, kPointerSize); | 2669 __ Peek(scratch, kPointerSize); |
| 2678 __ Push(x0, scratch); | 2670 __ Push(x0, scratch); |
| 2679 VisitForStackValue(prop->key()); | 2671 VisitForStackValue(prop->key()); |
| 2680 | 2672 |
| 2681 // Stack here: | 2673 // Stack here: |
| 2682 // - home_object | 2674 // - home_object |
| 2683 // - this (receiver) | 2675 // - this (receiver) |
| 2684 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. | 2676 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. |
| (...skipping 1815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4500 case NAMED_PROPERTY: { | 4492 case NAMED_PROPERTY: { |
| 4501 // Put the object both on the stack and in the register. | 4493 // Put the object both on the stack and in the register. |
| 4502 VisitForStackValue(prop->obj()); | 4494 VisitForStackValue(prop->obj()); |
| 4503 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 4495 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
| 4504 EmitNamedPropertyLoad(prop); | 4496 EmitNamedPropertyLoad(prop); |
| 4505 break; | 4497 break; |
| 4506 } | 4498 } |
| 4507 | 4499 |
| 4508 case NAMED_SUPER_PROPERTY: { | 4500 case NAMED_SUPER_PROPERTY: { |
| 4509 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4501 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4510 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4502 VisitForAccumulatorValue( |
| 4503 prop->obj()->AsSuperReference()->home_object_var()); |
| 4511 __ Push(result_register()); | 4504 __ Push(result_register()); |
| 4512 const Register scratch = x10; | 4505 const Register scratch = x10; |
| 4513 __ Peek(scratch, kPointerSize); | 4506 __ Peek(scratch, kPointerSize); |
| 4514 __ Push(scratch, result_register()); | 4507 __ Push(scratch, result_register()); |
| 4515 EmitNamedSuperPropertyLoad(prop); | 4508 EmitNamedSuperPropertyLoad(prop); |
| 4516 break; | 4509 break; |
| 4517 } | 4510 } |
| 4518 | 4511 |
| 4519 case KEYED_SUPER_PROPERTY: { | 4512 case KEYED_SUPER_PROPERTY: { |
| 4520 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4513 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4521 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4514 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var()); |
| 4522 __ Push(result_register()); | |
| 4523 VisitForAccumulatorValue(prop->key()); | 4515 VisitForAccumulatorValue(prop->key()); |
| 4524 __ Push(result_register()); | 4516 __ Push(result_register()); |
| 4525 const Register scratch1 = x10; | 4517 const Register scratch1 = x10; |
| 4526 const Register scratch2 = x11; | 4518 const Register scratch2 = x11; |
| 4527 __ Peek(scratch1, 2 * kPointerSize); | 4519 __ Peek(scratch1, 2 * kPointerSize); |
| 4528 __ Peek(scratch2, kPointerSize); | 4520 __ Peek(scratch2, kPointerSize); |
| 4529 __ Push(scratch1, scratch2, result_register()); | 4521 __ Push(scratch1, scratch2, result_register()); |
| 4530 EmitKeyedSuperPropertyLoad(prop); | 4522 EmitKeyedSuperPropertyLoad(prop); |
| 4531 break; | 4523 break; |
| 4532 } | 4524 } |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5453 } | 5445 } |
| 5454 } | 5446 } |
| 5455 | 5447 |
| 5456 return INTERRUPT; | 5448 return INTERRUPT; |
| 5457 } | 5449 } |
| 5458 | 5450 |
| 5459 | 5451 |
| 5460 } } // namespace v8::internal | 5452 } } // namespace v8::internal |
| 5461 | 5453 |
| 5462 #endif // V8_TARGET_ARCH_ARM64 | 5454 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |