Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: src/arm64/builtins-arm64.cc

Issue 803933008: new classes: change semantics of super(...) call and add new.target to construct stub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Platform ports Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/codegen.h" 9 #include "src/codegen.h"
10 #include "src/debug.h" 10 #include "src/debug.h"
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 } 301 }
302 302
303 303
304 static void Generate_JSConstructStubHelper(MacroAssembler* masm, 304 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
305 bool is_api_function, 305 bool is_api_function,
306 bool create_memento) { 306 bool create_memento) {
307 // ----------- S t a t e ------------- 307 // ----------- S t a t e -------------
308 // -- x0 : number of arguments 308 // -- x0 : number of arguments
309 // -- x1 : constructor function 309 // -- x1 : constructor function
310 // -- x2 : allocation site or undefined 310 // -- x2 : allocation site or undefined
311 // -- x3 : original constructor
311 // -- lr : return address 312 // -- lr : return address
312 // -- sp[...]: constructor arguments 313 // -- sp[...]: constructor arguments
313 // ----------------------------------- 314 // -----------------------------------
314 315
315 ASM_LOCATION("Builtins::Generate_JSConstructStubHelper"); 316 ASM_LOCATION("Builtins::Generate_JSConstructStubHelper");
316 // Should never create mementos for api functions. 317 // Should never create mementos for api functions.
317 DCHECK(!is_api_function || !create_memento); 318 DCHECK(!is_api_function || !create_memento);
318 319
319 Isolate* isolate = masm->isolate(); 320 Isolate* isolate = masm->isolate();
320 321
321 // Enter a construct frame. 322 // Enter a construct frame.
322 { 323 {
323 FrameScope scope(masm, StackFrame::CONSTRUCT); 324 FrameScope scope(masm, StackFrame::CONSTRUCT);
324 325
325 // Preserve the three incoming parameters on the stack. 326 // Preserve the three incoming parameters on the stack.
326 if (create_memento) { 327 if (create_memento) {
327 __ AssertUndefinedOrAllocationSite(x2, x10); 328 __ AssertUndefinedOrAllocationSite(x2, x10);
328 __ Push(x2); 329 __ Push(x2);
329 } 330 }
330 331
331 Register argc = x0; 332 Register argc = x0;
332 Register constructor = x1; 333 Register constructor = x1;
334 Register original_constructor = x3;
333 // x1: constructor function 335 // x1: constructor function
334 __ SmiTag(argc); 336 __ SmiTag(argc);
335 __ Push(argc, constructor); 337 __ Push(argc, constructor);
336 // sp[0] : Constructor function. 338 // sp[0] : Constructor function.
337 // sp[1]: number of arguments (smi-tagged) 339 // sp[1]: number of arguments (smi-tagged)
338 340
341 Label rt_call, count_incremented, allocated, normal_new;
342 __ Cmp(constructor, original_constructor);
343 __ B(eq, &normal_new);
344 {
345 if (create_memento) {
346 // Get the cell or allocation site.
347 __ Peek(x4, 2 * kXRegSize);
348 __ Push(x4);
349 __ Push(constructor); // Argument for Runtime_NewObject.
350 __ Push(original_constructor);
351 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 3);
352 __ Mov(x4, x0);
353 // If we ended up using the runtime, and we want a memento, then the
354 // runtime call made it for us, and we shouldn't do create count
355 // increment.
356 __ jmp(&count_incremented);
357 } else {
358 __ Push(constructor); // Argument for Runtime_NewObject.
359 __ Push(original_constructor);
360 __ CallRuntime(Runtime::kNewObject, 2);
361 __ Mov(x4, x0);
362 __ jmp(&allocated);
363 }
364 }
365
366 __ Bind(&normal_new);
367
339 // Try to allocate the object without transitioning into C code. If any of 368 // Try to allocate the object without transitioning into C code. If any of
340 // the preconditions is not met, the code bails out to the runtime call. 369 // the preconditions is not met, the code bails out to the runtime call.
341 Label rt_call, allocated;
342 if (FLAG_inline_new) { 370 if (FLAG_inline_new) {
343 Label undo_allocation; 371 Label undo_allocation;
344 ExternalReference debug_step_in_fp = 372 ExternalReference debug_step_in_fp =
345 ExternalReference::debug_step_in_fp_address(isolate); 373 ExternalReference::debug_step_in_fp_address(isolate);
346 __ Mov(x2, Operand(debug_step_in_fp)); 374 __ Mov(x2, Operand(debug_step_in_fp));
347 __ Ldr(x2, MemOperand(x2)); 375 __ Ldr(x2, MemOperand(x2));
348 __ Cbnz(x2, &rt_call); 376 __ Cbnz(x2, &rt_call);
349 // Load the initial map and verify that it is in fact a map. 377 // Load the initial map and verify that it is in fact a map.
350 Register init_map = x2; 378 Register init_map = x2;
351 __ Ldr(init_map, 379 __ Ldr(init_map,
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 556
529 // Undo the setting of the new top so that the heap is verifiable. For 557 // Undo the setting of the new top so that the heap is verifiable. For
530 // example, the map's unused properties potentially do not match the 558 // example, the map's unused properties potentially do not match the
531 // allocated objects unused properties. 559 // allocated objects unused properties.
532 __ Bind(&undo_allocation); 560 __ Bind(&undo_allocation);
533 __ UndoAllocationInNewSpace(new_obj, x14); 561 __ UndoAllocationInNewSpace(new_obj, x14);
534 } 562 }
535 563
536 // Allocate the new receiver object using the runtime call. 564 // Allocate the new receiver object using the runtime call.
537 __ Bind(&rt_call); 565 __ Bind(&rt_call);
538 Label count_incremented;
539 if (create_memento) { 566 if (create_memento) {
540 // Get the cell or allocation site. 567 // Get the cell or allocation site.
541 __ Peek(x4, 2 * kXRegSize); 568 __ Peek(x4, 2 * kXRegSize);
542 __ Push(x4); 569 __ Push(x4);
543 __ Push(constructor); // Argument for Runtime_NewObject. 570 __ Push(constructor); // Argument for Runtime_NewObject.
544 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2); 571 __ Push(constructor);
572 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 3);
545 __ Mov(x4, x0); 573 __ Mov(x4, x0);
546 // If we ended up using the runtime, and we want a memento, then the 574 // If we ended up using the runtime, and we want a memento, then the
547 // runtime call made it for us, and we shouldn't do create count 575 // runtime call made it for us, and we shouldn't do create count
548 // increment. 576 // increment.
549 __ jmp(&count_incremented); 577 __ jmp(&count_incremented);
550 } else { 578 } else {
551 __ Push(constructor); // Argument for Runtime_NewObject. 579 __ Push(constructor); // Argument for Runtime_NewObject.
552 __ CallRuntime(Runtime::kNewObject, 1); 580 __ Push(constructor);
581 __ CallRuntime(Runtime::kNewObject, 2);
553 __ Mov(x4, x0); 582 __ Mov(x4, x0);
554 } 583 }
555 584
556 // Receiver for constructor call allocated. 585 // Receiver for constructor call allocated.
557 // x4: JSObject 586 // x4: JSObject
558 __ Bind(&allocated); 587 __ Bind(&allocated);
559 588
560 if (create_memento) { 589 if (create_memento) {
561 __ Peek(x10, 2 * kXRegSize); 590 __ Peek(x10, 2 * kXRegSize);
562 __ JumpIfRoot(x10, Heap::kUndefinedValueRootIndex, &count_incremented); 591 __ JumpIfRoot(x10, Heap::kUndefinedValueRootIndex, &count_incremented);
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 __ Unreachable(); 1584 __ Unreachable();
1556 } 1585 }
1557 } 1586 }
1558 1587
1559 1588
1560 #undef __ 1589 #undef __
1561 1590
1562 } } // namespace v8::internal 1591 } } // namespace v8::internal
1563 1592
1564 #endif // V8_TARGET_ARCH_ARM 1593 #endif // V8_TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698