| OLD | NEW | 
|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 664 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 675   mov(sp, Operand(fp));  // respect ABI stack constraint | 675   mov(sp, Operand(fp));  // respect ABI stack constraint | 
| 676   ldm(ia, sp, fp.bit() | sp.bit() | pc.bit()); | 676   ldm(ia, sp, fp.bit() | sp.bit() | pc.bit()); | 
| 677 } | 677 } | 
| 678 | 678 | 
| 679 | 679 | 
| 680 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 680 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 
| 681                                     const ParameterCount& actual, | 681                                     const ParameterCount& actual, | 
| 682                                     Handle<Code> code_constant, | 682                                     Handle<Code> code_constant, | 
| 683                                     Register code_reg, | 683                                     Register code_reg, | 
| 684                                     Label* done, | 684                                     Label* done, | 
| 685                                     InvokeFlag flag) { | 685                                     InvokeFlag flag, | 
|  | 686                                     PostCallGenerator* post_call_generator) { | 
| 686   bool definitely_matches = false; | 687   bool definitely_matches = false; | 
| 687   Label regular_invoke; | 688   Label regular_invoke; | 
| 688 | 689 | 
| 689   // Check whether the expected and actual arguments count match. If not, | 690   // Check whether the expected and actual arguments count match. If not, | 
| 690   // setup registers according to contract with ArgumentsAdaptorTrampoline: | 691   // setup registers according to contract with ArgumentsAdaptorTrampoline: | 
| 691   //  r0: actual arguments count | 692   //  r0: actual arguments count | 
| 692   //  r1: function (passed through to callee) | 693   //  r1: function (passed through to callee) | 
| 693   //  r2: expected arguments count | 694   //  r2: expected arguments count | 
| 694   //  r3: callee code entry | 695   //  r3: callee code entry | 
| 695 | 696 | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 731   if (!definitely_matches) { | 732   if (!definitely_matches) { | 
| 732     if (!code_constant.is_null()) { | 733     if (!code_constant.is_null()) { | 
| 733       mov(r3, Operand(code_constant)); | 734       mov(r3, Operand(code_constant)); | 
| 734       add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); | 735       add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); | 
| 735     } | 736     } | 
| 736 | 737 | 
| 737     Handle<Code> adaptor = | 738     Handle<Code> adaptor = | 
| 738         Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); | 739         Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); | 
| 739     if (flag == CALL_FUNCTION) { | 740     if (flag == CALL_FUNCTION) { | 
| 740       Call(adaptor, RelocInfo::CODE_TARGET); | 741       Call(adaptor, RelocInfo::CODE_TARGET); | 
|  | 742       if (post_call_generator != NULL) post_call_generator->Generate(); | 
| 741       b(done); | 743       b(done); | 
| 742     } else { | 744     } else { | 
| 743       Jump(adaptor, RelocInfo::CODE_TARGET); | 745       Jump(adaptor, RelocInfo::CODE_TARGET); | 
| 744     } | 746     } | 
| 745     bind(®ular_invoke); | 747     bind(®ular_invoke); | 
| 746   } | 748   } | 
| 747 } | 749 } | 
| 748 | 750 | 
| 749 | 751 | 
| 750 void MacroAssembler::InvokeCode(Register code, | 752 void MacroAssembler::InvokeCode(Register code, | 
| 751                                 const ParameterCount& expected, | 753                                 const ParameterCount& expected, | 
| 752                                 const ParameterCount& actual, | 754                                 const ParameterCount& actual, | 
| 753                                 InvokeFlag flag) { | 755                                 InvokeFlag flag, | 
|  | 756                                 PostCallGenerator* post_call_generator) { | 
| 754   Label done; | 757   Label done; | 
| 755 | 758 | 
| 756   InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag); | 759   InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, | 
|  | 760                  post_call_generator); | 
| 757   if (flag == CALL_FUNCTION) { | 761   if (flag == CALL_FUNCTION) { | 
| 758     Call(code); | 762     Call(code); | 
|  | 763     if (post_call_generator != NULL) post_call_generator->Generate(); | 
| 759   } else { | 764   } else { | 
| 760     ASSERT(flag == JUMP_FUNCTION); | 765     ASSERT(flag == JUMP_FUNCTION); | 
| 761     Jump(code); | 766     Jump(code); | 
| 762   } | 767   } | 
| 763 | 768 | 
| 764   // Continue here if InvokePrologue does handle the invocation due to | 769   // Continue here if InvokePrologue does handle the invocation due to | 
| 765   // mismatched parameter counts. | 770   // mismatched parameter counts. | 
| 766   bind(&done); | 771   bind(&done); | 
| 767 } | 772 } | 
| 768 | 773 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 782   } | 787   } | 
| 783 | 788 | 
| 784   // Continue here if InvokePrologue does handle the invocation due to | 789   // Continue here if InvokePrologue does handle the invocation due to | 
| 785   // mismatched parameter counts. | 790   // mismatched parameter counts. | 
| 786   bind(&done); | 791   bind(&done); | 
| 787 } | 792 } | 
| 788 | 793 | 
| 789 | 794 | 
| 790 void MacroAssembler::InvokeFunction(Register fun, | 795 void MacroAssembler::InvokeFunction(Register fun, | 
| 791                                     const ParameterCount& actual, | 796                                     const ParameterCount& actual, | 
| 792                                     InvokeFlag flag) { | 797                                     InvokeFlag flag, | 
|  | 798                                     PostCallGenerator* post_call_generator) { | 
| 793   // Contract with called JS functions requires that function is passed in r1. | 799   // Contract with called JS functions requires that function is passed in r1. | 
| 794   ASSERT(fun.is(r1)); | 800   ASSERT(fun.is(r1)); | 
| 795 | 801 | 
| 796   Register expected_reg = r2; | 802   Register expected_reg = r2; | 
| 797   Register code_reg = r3; | 803   Register code_reg = r3; | 
| 798 | 804 | 
| 799   ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 805   ldr(code_reg, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 
| 800   ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 806   ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 
| 801   ldr(expected_reg, | 807   ldr(expected_reg, | 
| 802       FieldMemOperand(code_reg, | 808       FieldMemOperand(code_reg, | 
| 803                       SharedFunctionInfo::kFormalParameterCountOffset)); | 809                       SharedFunctionInfo::kFormalParameterCountOffset)); | 
| 804   mov(expected_reg, Operand(expected_reg, ASR, kSmiTagSize)); | 810   mov(expected_reg, Operand(expected_reg, ASR, kSmiTagSize)); | 
| 805   ldr(code_reg, | 811   ldr(code_reg, | 
| 806       FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); | 812       FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); | 
| 807 | 813 | 
| 808   ParameterCount expected(expected_reg); | 814   ParameterCount expected(expected_reg); | 
| 809   InvokeCode(code_reg, expected, actual, flag); | 815   InvokeCode(code_reg, expected, actual, flag, post_call_generator); | 
| 810 } | 816 } | 
| 811 | 817 | 
| 812 | 818 | 
| 813 void MacroAssembler::InvokeFunction(JSFunction* function, | 819 void MacroAssembler::InvokeFunction(JSFunction* function, | 
| 814                                     const ParameterCount& actual, | 820                                     const ParameterCount& actual, | 
| 815                                     InvokeFlag flag) { | 821                                     InvokeFlag flag) { | 
| 816   ASSERT(function->is_compiled()); | 822   ASSERT(function->is_compiled()); | 
| 817 | 823 | 
| 818   // Get the function and setup the context. | 824   // Get the function and setup the context. | 
| 819   mov(r1, Operand(Handle<JSFunction>(function))); | 825   mov(r1, Operand(Handle<JSFunction>(function))); | 
| (...skipping 1334 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2154 | 2160 | 
| 2155 void CodePatcher::Emit(Address addr) { | 2161 void CodePatcher::Emit(Address addr) { | 
| 2156   masm()->emit(reinterpret_cast<Instr>(addr)); | 2162   masm()->emit(reinterpret_cast<Instr>(addr)); | 
| 2157 } | 2163 } | 
| 2158 #endif  // ENABLE_DEBUGGER_SUPPORT | 2164 #endif  // ENABLE_DEBUGGER_SUPPORT | 
| 2159 | 2165 | 
| 2160 | 2166 | 
| 2161 } }  // namespace v8::internal | 2167 } }  // namespace v8::internal | 
| 2162 | 2168 | 
| 2163 #endif  // V8_TARGET_ARCH_ARM | 2169 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW | 
|---|