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 |