| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 | 51 |
| 52 | 52 |
| 53 void Builtins::Generate_JSConstructCall(MacroAssembler* masm) { | 53 void Builtins::Generate_JSConstructCall(MacroAssembler* masm) { |
| 54 // ----------- S t a t e ------------- | 54 // ----------- S t a t e ------------- |
| 55 // -- r0 : number of arguments | 55 // -- r0 : number of arguments |
| 56 // -- r1 : constructor function | 56 // -- r1 : constructor function |
| 57 // -- lr : return address | 57 // -- lr : return address |
| 58 // -- sp[...]: constructor arguments | 58 // -- sp[...]: constructor arguments |
| 59 // ----------------------------------- | 59 // ----------------------------------- |
| 60 | 60 |
| 61 Label non_function_call; |
| 62 // Check that the function is not a smi. |
| 63 __ tst(r1, Operand(kSmiTagMask)); |
| 64 __ b(eq, &non_function_call); |
| 65 // Check that the function is a JSFunction. |
| 66 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); |
| 67 __ ldrb(r2, FieldMemOperand(r2, Map::kInstanceTypeOffset)); |
| 68 __ cmp(r2, Operand(JS_FUNCTION_TYPE)); |
| 69 __ b(ne, &non_function_call); |
| 70 |
| 61 // Enter a construct frame. | 71 // Enter a construct frame. |
| 62 __ EnterConstructFrame(); | 72 __ EnterConstructFrame(); |
| 63 | 73 |
| 64 // Preserve the two incoming parameters | 74 // Preserve the two incoming parameters |
| 65 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); | 75 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); |
| 66 __ push(r0); // smi-tagged arguments count | 76 __ push(r0); // smi-tagged arguments count |
| 67 __ push(r1); // constructor function | 77 __ push(r1); // constructor function |
| 68 | 78 |
| 69 // Allocate the new receiver object. | 79 // Allocate the new receiver object. |
| 70 __ push(r1); // argument for Runtime_NewObject | 80 __ push(r1); // argument for Runtime_NewObject |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 // return. | 172 // return. |
| 163 __ bind(&exit); | 173 __ bind(&exit); |
| 164 // r0: result | 174 // r0: result |
| 165 // sp[0]: receiver (newly allocated object) | 175 // sp[0]: receiver (newly allocated object) |
| 166 // sp[1]: constructor function | 176 // sp[1]: constructor function |
| 167 // sp[2]: number of arguments (smi-tagged) | 177 // sp[2]: number of arguments (smi-tagged) |
| 168 __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); | 178 __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); |
| 169 __ LeaveConstructFrame(); | 179 __ LeaveConstructFrame(); |
| 170 __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1)); | 180 __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1)); |
| 171 __ add(sp, sp, Operand(kPointerSize)); | 181 __ add(sp, sp, Operand(kPointerSize)); |
| 172 __ mov(pc, Operand(lr)); | 182 __ Jump(lr); |
| 183 |
| 184 // r0: number of arguments |
| 185 // r1: called object |
| 186 __ bind(&non_function_call); |
| 187 |
| 188 // Set expected number of arguments to zero (not changing r0). |
| 189 __ mov(r2, Operand(0)); |
| 190 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION); |
| 191 __ Jump(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)), |
| 192 RelocInfo::CODE_TARGET); |
| 173 } | 193 } |
| 174 | 194 |
| 175 | 195 |
| 176 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, | 196 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, |
| 177 bool is_construct) { | 197 bool is_construct) { |
| 178 // Called from Generate_JS_Entry | 198 // Called from Generate_JS_Entry |
| 179 // r0: code entry | 199 // r0: code entry |
| 180 // r1: function | 200 // r1: function |
| 181 // r2: receiver | 201 // r2: receiver |
| 182 // r3: argc | 202 // r3: argc |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 __ Call(Handle<Code>(Builtins::builtin(Builtins::JSConstructCall)), | 248 __ Call(Handle<Code>(Builtins::builtin(Builtins::JSConstructCall)), |
| 229 RelocInfo::CODE_TARGET); | 249 RelocInfo::CODE_TARGET); |
| 230 } else { | 250 } else { |
| 231 ParameterCount actual(r0); | 251 ParameterCount actual(r0); |
| 232 __ InvokeFunction(r1, actual, CALL_FUNCTION); | 252 __ InvokeFunction(r1, actual, CALL_FUNCTION); |
| 233 } | 253 } |
| 234 | 254 |
| 235 // Exit the JS frame and remove the parameters (except function), and return. | 255 // Exit the JS frame and remove the parameters (except function), and return. |
| 236 // Respect ABI stack constraint. | 256 // Respect ABI stack constraint. |
| 237 __ LeaveInternalFrame(); | 257 __ LeaveInternalFrame(); |
| 238 __ mov(pc, lr); | 258 __ Jump(lr); |
| 239 | 259 |
| 240 // r0: result | 260 // r0: result |
| 241 } | 261 } |
| 242 | 262 |
| 243 | 263 |
| 244 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) { | 264 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) { |
| 245 Generate_JSEntryTrampolineHelper(masm, false); | 265 Generate_JSEntryTrampolineHelper(masm, false); |
| 246 } | 266 } |
| 247 | 267 |
| 248 | 268 |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 | 557 |
| 538 // Invoke the function. | 558 // Invoke the function. |
| 539 ParameterCount actual(r0); | 559 ParameterCount actual(r0); |
| 540 __ mov(r0, Operand(r0, ASR, kSmiTagSize)); | 560 __ mov(r0, Operand(r0, ASR, kSmiTagSize)); |
| 541 __ ldr(r1, MemOperand(fp, kFunctionOffset)); | 561 __ ldr(r1, MemOperand(fp, kFunctionOffset)); |
| 542 __ InvokeFunction(r1, actual, CALL_FUNCTION); | 562 __ InvokeFunction(r1, actual, CALL_FUNCTION); |
| 543 | 563 |
| 544 // Tear down the internal frame and remove function, receiver and args. | 564 // Tear down the internal frame and remove function, receiver and args. |
| 545 __ LeaveInternalFrame(); | 565 __ LeaveInternalFrame(); |
| 546 __ add(sp, sp, Operand(3 * kPointerSize)); | 566 __ add(sp, sp, Operand(3 * kPointerSize)); |
| 547 __ mov(pc, lr); | 567 __ Jump(lr); |
| 548 } | 568 } |
| 549 | 569 |
| 550 | 570 |
| 551 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { | 571 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { |
| 552 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); | 572 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); |
| 553 __ mov(r4, Operand(ArgumentsAdaptorFrame::SENTINEL)); | 573 __ mov(r4, Operand(ArgumentsAdaptorFrame::SENTINEL)); |
| 554 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | fp.bit() | lr.bit()); | 574 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | fp.bit() | lr.bit()); |
| 555 __ add(fp, sp, Operand(3 * kPointerSize)); | 575 __ add(fp, sp, Operand(3 * kPointerSize)); |
| 556 } | 576 } |
| 557 | 577 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 __ cmp(sp, r2); | 676 __ cmp(sp, r2); |
| 657 __ b(ne, &fill); | 677 __ b(ne, &fill); |
| 658 } | 678 } |
| 659 | 679 |
| 660 // Call the entry point. | 680 // Call the entry point. |
| 661 __ bind(&invoke); | 681 __ bind(&invoke); |
| 662 __ Call(r3); | 682 __ Call(r3); |
| 663 | 683 |
| 664 // Exit frame and return. | 684 // Exit frame and return. |
| 665 LeaveArgumentsAdaptorFrame(masm); | 685 LeaveArgumentsAdaptorFrame(masm); |
| 666 __ mov(pc, lr); | 686 __ Jump(lr); |
| 667 | 687 |
| 668 | 688 |
| 669 // ------------------------------------------- | 689 // ------------------------------------------- |
| 670 // Dont adapt arguments. | 690 // Dont adapt arguments. |
| 671 // ------------------------------------------- | 691 // ------------------------------------------- |
| 672 __ bind(&dont_adapt_arguments); | 692 __ bind(&dont_adapt_arguments); |
| 673 __ mov(pc, r3); | 693 __ Jump(r3); |
| 674 } | 694 } |
| 675 | 695 |
| 676 | 696 |
| 677 #undef __ | 697 #undef __ |
| 678 | 698 |
| 679 } } // namespace v8::internal | 699 } } // namespace v8::internal |
| OLD | NEW |