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 #if V8_TARGET_ARCH_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
6 | 6 |
7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 __ Push(a0); | 215 __ Push(a0); |
216 __ TailCallRuntime(Runtime::kSymbolDescriptiveString, 1, 1); | 216 __ TailCallRuntime(Runtime::kSymbolDescriptiveString, 1, 1); |
217 } | 217 } |
218 } | 218 } |
219 | 219 |
220 | 220 |
221 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { | 221 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { |
222 // ----------- S t a t e ------------- | 222 // ----------- S t a t e ------------- |
223 // -- a0 : number of arguments | 223 // -- a0 : number of arguments |
224 // -- a1 : constructor function | 224 // -- a1 : constructor function |
225 // -- a3 : original constructor | 225 // -- a3 : new target |
226 // -- ra : return address | 226 // -- ra : return address |
227 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) | 227 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) |
228 // -- sp[argc * 8] : receiver | 228 // -- sp[argc * 8] : receiver |
229 // ----------------------------------- | 229 // ----------------------------------- |
230 | 230 |
231 // 1. Load the first argument into a0 and get rid of the rest (including the | 231 // 1. Load the first argument into a0 and get rid of the rest (including the |
232 // receiver). | 232 // receiver). |
233 { | 233 { |
234 Label no_arguments, done; | 234 Label no_arguments, done; |
235 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); | 235 __ Branch(USE_DELAY_SLOT, &no_arguments, eq, a0, Operand(zero_reg)); |
(...skipping 21 matching lines...) Expand all Loading... |
257 FrameScope scope(masm, StackFrame::INTERNAL); | 257 FrameScope scope(masm, StackFrame::INTERNAL); |
258 ToStringStub stub(masm->isolate()); | 258 ToStringStub stub(masm->isolate()); |
259 __ Push(a1, a3); | 259 __ Push(a1, a3); |
260 __ CallStub(&stub); | 260 __ CallStub(&stub); |
261 __ Move(a0, v0); | 261 __ Move(a0, v0); |
262 __ Pop(a1, a3); | 262 __ Pop(a1, a3); |
263 } | 263 } |
264 __ bind(&done_convert); | 264 __ bind(&done_convert); |
265 } | 265 } |
266 | 266 |
267 // 3. Check if original constructor and constructor differ. | 267 // 3. Check if new target and constructor differ. |
268 Label new_object; | 268 Label new_object; |
269 __ Branch(&new_object, ne, a1, Operand(a3)); | 269 __ Branch(&new_object, ne, a1, Operand(a3)); |
270 | 270 |
271 // 4. Allocate a JSValue wrapper for the string. | 271 // 4. Allocate a JSValue wrapper for the string. |
272 { | 272 { |
273 // ----------- S t a t e ------------- | 273 // ----------- S t a t e ------------- |
274 // -- a0 : the first argument | 274 // -- a0 : the first argument |
275 // -- a1 : constructor function | 275 // -- a1 : constructor function |
276 // -- a3 : original constructor | 276 // -- a3 : new target |
277 // -- ra : return address | 277 // -- ra : return address |
278 // ----------------------------------- | 278 // ----------------------------------- |
279 __ Allocate(JSValue::kSize, v0, a2, t0, &new_object, TAG_OBJECT); | 279 __ Allocate(JSValue::kSize, v0, a2, t0, &new_object, TAG_OBJECT); |
280 | 280 |
281 // Initialize the JSValue in eax. | 281 // Initialize the JSValue in eax. |
282 __ LoadGlobalFunctionInitialMap(a1, a2, a3); | 282 __ LoadGlobalFunctionInitialMap(a1, a2, a3); |
283 __ sd(a2, FieldMemOperand(v0, HeapObject::kMapOffset)); | 283 __ sd(a2, FieldMemOperand(v0, HeapObject::kMapOffset)); |
284 __ LoadRoot(a3, Heap::kEmptyFixedArrayRootIndex); | 284 __ LoadRoot(a3, Heap::kEmptyFixedArrayRootIndex); |
285 __ sd(a3, FieldMemOperand(v0, JSObject::kPropertiesOffset)); | 285 __ sd(a3, FieldMemOperand(v0, JSObject::kPropertiesOffset)); |
286 __ sd(a3, FieldMemOperand(v0, JSObject::kElementsOffset)); | 286 __ sd(a3, FieldMemOperand(v0, JSObject::kElementsOffset)); |
287 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); | 287 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); |
288 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); | 288 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); |
289 __ Ret(); | 289 __ Ret(); |
290 } | 290 } |
291 | 291 |
292 // 5. Fallback to the runtime to create new object. | 292 // 5. Fallback to the runtime to create new object. |
293 __ bind(&new_object); | 293 __ bind(&new_object); |
294 { | 294 { |
295 FrameScope scope(masm, StackFrame::INTERNAL); | 295 FrameScope scope(masm, StackFrame::INTERNAL); |
296 __ Push(a0, a1, a3); // first argument, constructor, original constructor | 296 __ Push(a0, a1, a3); // first argument, constructor, new target |
297 __ CallRuntime(Runtime::kNewObject, 2); | 297 __ CallRuntime(Runtime::kNewObject, 2); |
298 __ Pop(a0); | 298 __ Pop(a0); |
299 } | 299 } |
300 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); | 300 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); |
301 __ Ret(); | 301 __ Ret(); |
302 } | 302 } |
303 | 303 |
304 | 304 |
305 static void CallRuntimePassFunction( | 305 static void CallRuntimePassFunction( |
306 MacroAssembler* masm, Runtime::FunctionId function_id) { | 306 MacroAssembler* masm, Runtime::FunctionId function_id) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 GenerateTailCallToSharedCode(masm); | 346 GenerateTailCallToSharedCode(masm); |
347 } | 347 } |
348 | 348 |
349 | 349 |
350 static void Generate_JSConstructStubHelper(MacroAssembler* masm, | 350 static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
351 bool is_api_function) { | 351 bool is_api_function) { |
352 // ----------- S t a t e ------------- | 352 // ----------- S t a t e ------------- |
353 // -- a0 : number of arguments | 353 // -- a0 : number of arguments |
354 // -- a1 : constructor function | 354 // -- a1 : constructor function |
355 // -- a2 : allocation site or undefined | 355 // -- a2 : allocation site or undefined |
356 // -- a3 : original constructor | 356 // -- a3 : new target |
357 // -- ra : return address | 357 // -- ra : return address |
358 // -- sp[...]: constructor arguments | 358 // -- sp[...]: constructor arguments |
359 // ----------------------------------- | 359 // ----------------------------------- |
360 | 360 |
361 Isolate* isolate = masm->isolate(); | 361 Isolate* isolate = masm->isolate(); |
362 | 362 |
363 // Enter a construct frame. | 363 // Enter a construct frame. |
364 { | 364 { |
365 FrameScope scope(masm, StackFrame::CONSTRUCT); | 365 FrameScope scope(masm, StackFrame::CONSTRUCT); |
366 | 366 |
367 // Preserve the incoming parameters on the stack. | 367 // Preserve the incoming parameters on the stack. |
368 __ AssertUndefinedOrAllocationSite(a2, t0); | 368 __ AssertUndefinedOrAllocationSite(a2, t0); |
369 __ SmiTag(a0); | 369 __ SmiTag(a0); |
370 __ Push(a2, a0, a1, a3); | 370 __ Push(a2, a0, a1, a3); |
371 | 371 |
372 // Try to allocate the object without transitioning into C code. If any of | 372 // Try to allocate the object without transitioning into C code. If any of |
373 // the preconditions is not met, the code bails out to the runtime call. | 373 // the preconditions is not met, the code bails out to the runtime call. |
374 Label rt_call, allocated; | 374 Label rt_call, allocated; |
375 if (FLAG_inline_new) { | 375 if (FLAG_inline_new) { |
376 ExternalReference debug_step_in_fp = | 376 ExternalReference debug_step_in_fp = |
377 ExternalReference::debug_step_in_fp_address(isolate); | 377 ExternalReference::debug_step_in_fp_address(isolate); |
378 __ li(a2, Operand(debug_step_in_fp)); | 378 __ li(a2, Operand(debug_step_in_fp)); |
379 __ ld(a2, MemOperand(a2)); | 379 __ ld(a2, MemOperand(a2)); |
380 __ Branch(&rt_call, ne, a2, Operand(zero_reg)); | 380 __ Branch(&rt_call, ne, a2, Operand(zero_reg)); |
381 | 381 |
382 // Verify that the original constructor is a JSFunction. | 382 // Verify that the new target is a JSFunction. |
383 __ GetObjectType(a3, a5, a4); | 383 __ GetObjectType(a3, a5, a4); |
384 __ Branch(&rt_call, ne, a4, Operand(JS_FUNCTION_TYPE)); | 384 __ Branch(&rt_call, ne, a4, Operand(JS_FUNCTION_TYPE)); |
385 | 385 |
386 // Load the initial map and verify that it is in fact a map. | 386 // Load the initial map and verify that it is in fact a map. |
387 // a3: original constructor | 387 // a3: new target |
388 __ ld(a2, FieldMemOperand(a3, JSFunction::kPrototypeOrInitialMapOffset)); | 388 __ ld(a2, FieldMemOperand(a3, JSFunction::kPrototypeOrInitialMapOffset)); |
389 __ JumpIfSmi(a2, &rt_call); | 389 __ JumpIfSmi(a2, &rt_call); |
390 __ GetObjectType(a2, t1, t0); | 390 __ GetObjectType(a2, t1, t0); |
391 __ Branch(&rt_call, ne, t0, Operand(MAP_TYPE)); | 391 __ Branch(&rt_call, ne, t0, Operand(MAP_TYPE)); |
392 | 392 |
393 // Fall back to runtime if the expected base constructor and base | 393 // Fall back to runtime if the expected base constructor and base |
394 // constructor differ. | 394 // constructor differ. |
395 __ ld(a5, FieldMemOperand(a2, Map::kConstructorOrBackPointerOffset)); | 395 __ ld(a5, FieldMemOperand(a2, Map::kConstructorOrBackPointerOffset)); |
396 __ Branch(&rt_call, ne, a1, Operand(a5)); | 396 __ Branch(&rt_call, ne, a1, Operand(a5)); |
397 | 397 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 __ InitializeFieldsWithFiller(t1, a0, t3); | 498 __ InitializeFieldsWithFiller(t1, a0, t3); |
499 | 499 |
500 // Add the object tag to make the JSObject real, so that we can continue | 500 // Add the object tag to make the JSObject real, so that we can continue |
501 // and jump into the continuation code at any time from now on. | 501 // and jump into the continuation code at any time from now on. |
502 __ Daddu(t0, t0, Operand(kHeapObjectTag)); | 502 __ Daddu(t0, t0, Operand(kHeapObjectTag)); |
503 | 503 |
504 // Continue with JSObject being successfully allocated. | 504 // Continue with JSObject being successfully allocated. |
505 // a4: JSObject | 505 // a4: JSObject |
506 __ jmp(&allocated); | 506 __ jmp(&allocated); |
507 | 507 |
508 // Reload the original constructor and fall-through. | 508 // Reload the new target and fall-through. |
509 __ bind(&rt_call_reload_new_target); | 509 __ bind(&rt_call_reload_new_target); |
510 __ ld(a3, MemOperand(sp, 0 * kPointerSize)); | 510 __ ld(a3, MemOperand(sp, 0 * kPointerSize)); |
511 } | 511 } |
512 | 512 |
513 // Allocate the new receiver object using the runtime call. | 513 // Allocate the new receiver object using the runtime call. |
514 // a1: constructor function | 514 // a1: constructor function |
515 // a3: original constructor | 515 // a3: new target |
516 __ bind(&rt_call); | 516 __ bind(&rt_call); |
517 | 517 |
518 __ Push(a1, a3); // constructor function, original constructor | 518 __ Push(a1, a3); // constructor function, new target |
519 __ CallRuntime(Runtime::kNewObject, 2); | 519 __ CallRuntime(Runtime::kNewObject, 2); |
520 __ mov(t0, v0); | 520 __ mov(t0, v0); |
521 | 521 |
522 // Receiver for constructor call allocated. | 522 // Receiver for constructor call allocated. |
523 // t0: JSObject | 523 // t0: JSObject |
524 __ bind(&allocated); | 524 __ bind(&allocated); |
525 | 525 |
526 // Restore the parameters. | 526 // Restore the parameters. |
527 __ Pop(a3); // new.target | 527 __ Pop(a3); // new.target |
528 __ Pop(a1); | 528 __ Pop(a1); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 // Throw away the result of the constructor invocation and use the | 597 // Throw away the result of the constructor invocation and use the |
598 // on-stack receiver as the result. | 598 // on-stack receiver as the result. |
599 __ bind(&use_receiver); | 599 __ bind(&use_receiver); |
600 __ ld(v0, MemOperand(sp)); | 600 __ ld(v0, MemOperand(sp)); |
601 | 601 |
602 // Remove receiver from the stack, remove caller arguments, and | 602 // Remove receiver from the stack, remove caller arguments, and |
603 // return. | 603 // return. |
604 __ bind(&exit); | 604 __ bind(&exit); |
605 // v0: result | 605 // v0: result |
606 // sp[0]: receiver (newly allocated object) | 606 // sp[0]: receiver (newly allocated object) |
607 // sp[1]: new.target (original constructor) | 607 // sp[1]: new target |
608 // sp[2]: number of arguments (smi-tagged) | 608 // sp[2]: number of arguments (smi-tagged) |
609 __ ld(a1, MemOperand(sp, 2 * kPointerSize)); | 609 __ ld(a1, MemOperand(sp, 2 * kPointerSize)); |
610 | 610 |
611 // Leave construct frame. | 611 // Leave construct frame. |
612 } | 612 } |
613 | 613 |
614 __ SmiScale(a4, a1, kPointerSizeLog2); | 614 __ SmiScale(a4, a1, kPointerSizeLog2); |
615 __ Daddu(sp, sp, a4); | 615 __ Daddu(sp, sp, a4); |
616 __ Daddu(sp, sp, kPointerSize); | 616 __ Daddu(sp, sp, kPointerSize); |
617 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2); | 617 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2); |
618 __ Ret(); | 618 __ Ret(); |
619 } | 619 } |
620 | 620 |
621 | 621 |
622 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { | 622 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
623 Generate_JSConstructStubHelper(masm, false); | 623 Generate_JSConstructStubHelper(masm, false); |
624 } | 624 } |
625 | 625 |
626 | 626 |
627 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { | 627 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { |
628 Generate_JSConstructStubHelper(masm, true); | 628 Generate_JSConstructStubHelper(masm, true); |
629 } | 629 } |
630 | 630 |
631 | 631 |
632 void Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) { | 632 void Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) { |
633 // ----------- S t a t e ------------- | 633 // ----------- S t a t e ------------- |
634 // -- a0 : number of arguments | 634 // -- a0 : number of arguments |
635 // -- a1 : constructor function | 635 // -- a1 : constructor function |
636 // -- a2 : allocation site or undefined | 636 // -- a2 : allocation site or undefined |
637 // -- a3 : original constructor | 637 // -- a3 : new target |
638 // -- ra : return address | 638 // -- ra : return address |
639 // -- sp[...]: constructor arguments | 639 // -- sp[...]: constructor arguments |
640 // ----------------------------------- | 640 // ----------------------------------- |
641 | 641 |
642 { | 642 { |
643 FrameScope frame_scope(masm, StackFrame::CONSTRUCT); | 643 FrameScope frame_scope(masm, StackFrame::CONSTRUCT); |
644 | 644 |
645 __ AssertUndefinedOrAllocationSite(a2, t0); | 645 __ AssertUndefinedOrAllocationSite(a2, t0); |
646 __ push(a2); | 646 __ push(a2); |
647 | 647 |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 | 996 |
997 // Call the target. | 997 // Call the target. |
998 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | 998 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); |
999 } | 999 } |
1000 | 1000 |
1001 | 1001 |
1002 // static | 1002 // static |
1003 void Builtins::Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm) { | 1003 void Builtins::Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm) { |
1004 // ----------- S t a t e ------------- | 1004 // ----------- S t a t e ------------- |
1005 // -- a0 : argument count (not including receiver) | 1005 // -- a0 : argument count (not including receiver) |
1006 // -- a3 : original constructor | 1006 // -- a3 : new target |
1007 // -- a1 : constructor to call | 1007 // -- a1 : constructor to call |
1008 // -- a2 : address of the first argument | 1008 // -- a2 : address of the first argument |
1009 // ----------------------------------- | 1009 // ----------------------------------- |
1010 | 1010 |
1011 // Find the address of the last argument. | 1011 // Find the address of the last argument. |
1012 __ dsll(t0, a0, kPointerSizeLog2); | 1012 __ dsll(t0, a0, kPointerSizeLog2); |
1013 __ Dsubu(t0, a2, Operand(t0)); | 1013 __ Dsubu(t0, a2, Operand(t0)); |
1014 | 1014 |
1015 // Push a slot for the receiver. | 1015 // Push a slot for the receiver. |
1016 __ push(zero_reg); | 1016 __ push(zero_reg); |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 __ Push(a1); | 1710 __ Push(a1); |
1711 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1); | 1711 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1); |
1712 } | 1712 } |
1713 } | 1713 } |
1714 | 1714 |
1715 | 1715 |
1716 void Builtins::Generate_ConstructFunction(MacroAssembler* masm) { | 1716 void Builtins::Generate_ConstructFunction(MacroAssembler* masm) { |
1717 // ----------- S t a t e ------------- | 1717 // ----------- S t a t e ------------- |
1718 // -- a0 : the number of arguments (not including the receiver) | 1718 // -- a0 : the number of arguments (not including the receiver) |
1719 // -- a1 : the constructor to call (checked to be a JSFunction) | 1719 // -- a1 : the constructor to call (checked to be a JSFunction) |
1720 // -- a3 : the original constructor (checked to be a JSFunction) | 1720 // -- a3 : the new target (checked to be a JSFunction) |
1721 // ----------------------------------- | 1721 // ----------------------------------- |
1722 __ AssertFunction(a1); | 1722 __ AssertFunction(a1); |
1723 __ AssertFunction(a3); | 1723 __ AssertFunction(a3); |
1724 | 1724 |
1725 // Calling convention for function specific ConstructStubs require | 1725 // Calling convention for function specific ConstructStubs require |
1726 // a2 to contain either an AllocationSite or undefined. | 1726 // a2 to contain either an AllocationSite or undefined. |
1727 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); | 1727 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); |
1728 | 1728 |
1729 // Tail call to the function-specific construct stub (still in the caller | 1729 // Tail call to the function-specific construct stub (still in the caller |
1730 // context at this point). | 1730 // context at this point). |
1731 __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 1731 __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
1732 __ ld(a4, FieldMemOperand(a4, SharedFunctionInfo::kConstructStubOffset)); | 1732 __ ld(a4, FieldMemOperand(a4, SharedFunctionInfo::kConstructStubOffset)); |
1733 __ Daddu(at, a4, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1733 __ Daddu(at, a4, Operand(Code::kHeaderSize - kHeapObjectTag)); |
1734 __ Jump(at); | 1734 __ Jump(at); |
1735 } | 1735 } |
1736 | 1736 |
1737 | 1737 |
1738 // static | 1738 // static |
1739 void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { | 1739 void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { |
1740 // ----------- S t a t e ------------- | 1740 // ----------- S t a t e ------------- |
1741 // -- a0 : the number of arguments (not including the receiver) | 1741 // -- a0 : the number of arguments (not including the receiver) |
1742 // -- a1 : the constructor to call (checked to be a JSFunctionProxy) | 1742 // -- a1 : the constructor to call (checked to be a JSFunctionProxy) |
1743 // -- a3 : the original constructor (either the same as the constructor or | 1743 // -- a3 : the new target (either the same as the constructor or |
1744 // the JSFunction on which new was invoked initially) | 1744 // the JSFunction on which new was invoked initially) |
1745 // ----------------------------------- | 1745 // ----------------------------------- |
1746 | 1746 |
1747 // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. | 1747 // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. |
1748 __ ld(a1, FieldMemOperand(a1, JSFunctionProxy::kConstructTrapOffset)); | 1748 __ ld(a1, FieldMemOperand(a1, JSFunctionProxy::kConstructTrapOffset)); |
1749 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | 1749 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); |
1750 } | 1750 } |
1751 | 1751 |
1752 | 1752 |
1753 // static | 1753 // static |
1754 void Builtins::Generate_Construct(MacroAssembler* masm) { | 1754 void Builtins::Generate_Construct(MacroAssembler* masm) { |
1755 // ----------- S t a t e ------------- | 1755 // ----------- S t a t e ------------- |
1756 // -- a0 : the number of arguments (not including the receiver) | 1756 // -- a0 : the number of arguments (not including the receiver) |
1757 // -- a1 : the constructor to call (can be any Object) | 1757 // -- a1 : the constructor to call (can be any Object) |
1758 // -- a3 : the original constructor (either the same as the constructor or | 1758 // -- a3 : the new target (either the same as the constructor or |
1759 // the JSFunction on which new was invoked initially) | 1759 // the JSFunction on which new was invoked initially) |
1760 // ----------------------------------- | 1760 // ----------------------------------- |
1761 | 1761 |
1762 // Check if target has a [[Construct]] internal method. | 1762 // Check if target has a [[Construct]] internal method. |
1763 Label non_constructor; | 1763 Label non_constructor; |
1764 __ JumpIfSmi(a1, &non_constructor); | 1764 __ JumpIfSmi(a1, &non_constructor); |
1765 __ ld(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); | 1765 __ ld(t1, FieldMemOperand(a1, HeapObject::kMapOffset)); |
1766 __ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset)); | 1766 __ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset)); |
1767 __ And(t2, t2, Operand(1 << Map::kIsCallable)); | 1767 __ And(t2, t2, Operand(1 << Map::kIsCallable)); |
1768 __ Branch(&non_constructor, eq, t2, Operand(zero_reg)); | 1768 __ Branch(&non_constructor, eq, t2, Operand(zero_reg)); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1949 } | 1949 } |
1950 } | 1950 } |
1951 | 1951 |
1952 | 1952 |
1953 #undef __ | 1953 #undef __ |
1954 | 1954 |
1955 } // namespace internal | 1955 } // namespace internal |
1956 } // namespace v8 | 1956 } // namespace v8 |
1957 | 1957 |
1958 #endif // V8_TARGET_ARCH_MIPS64 | 1958 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |