| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2248 | 2248 |
| 2249 // ----------------------------------------------------------------------------- | 2249 // ----------------------------------------------------------------------------- |
| 2250 // JavaScript invokes | 2250 // JavaScript invokes |
| 2251 | 2251 |
| 2252 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 2252 void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
| 2253 const ParameterCount& actual, | 2253 const ParameterCount& actual, |
| 2254 Handle<Code> code_constant, | 2254 Handle<Code> code_constant, |
| 2255 Register code_reg, | 2255 Register code_reg, |
| 2256 Label* done, | 2256 Label* done, |
| 2257 InvokeFlag flag, | 2257 InvokeFlag flag, |
| 2258 CallWrapper* call_wrapper) { | 2258 const CallWrapper& call_wrapper) { |
| 2259 bool definitely_matches = false; | 2259 bool definitely_matches = false; |
| 2260 Label regular_invoke; | 2260 Label regular_invoke; |
| 2261 | 2261 |
| 2262 // Check whether the expected and actual arguments count match. If not, | 2262 // Check whether the expected and actual arguments count match. If not, |
| 2263 // setup registers according to contract with ArgumentsAdaptorTrampoline: | 2263 // setup registers according to contract with ArgumentsAdaptorTrampoline: |
| 2264 // a0: actual arguments count | 2264 // a0: actual arguments count |
| 2265 // a1: function (passed through to callee) | 2265 // a1: function (passed through to callee) |
| 2266 // a2: expected arguments count | 2266 // a2: expected arguments count |
| 2267 // a3: callee code entry | 2267 // a3: callee code entry |
| 2268 | 2268 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2301 | 2301 |
| 2302 if (!definitely_matches) { | 2302 if (!definitely_matches) { |
| 2303 if (!code_constant.is_null()) { | 2303 if (!code_constant.is_null()) { |
| 2304 li(a3, Operand(code_constant)); | 2304 li(a3, Operand(code_constant)); |
| 2305 addiu(a3, a3, Code::kHeaderSize - kHeapObjectTag); | 2305 addiu(a3, a3, Code::kHeaderSize - kHeapObjectTag); |
| 2306 } | 2306 } |
| 2307 | 2307 |
| 2308 Handle<Code> adaptor = | 2308 Handle<Code> adaptor = |
| 2309 isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 2309 isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
| 2310 if (flag == CALL_FUNCTION) { | 2310 if (flag == CALL_FUNCTION) { |
| 2311 if (call_wrapper != NULL) { | 2311 call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); |
| 2312 call_wrapper->BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); | |
| 2313 } | |
| 2314 Call(adaptor, RelocInfo::CODE_TARGET); | 2312 Call(adaptor, RelocInfo::CODE_TARGET); |
| 2315 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 2313 call_wrapper.AfterCall(); |
| 2316 jmp(done); | 2314 jmp(done); |
| 2317 } else { | 2315 } else { |
| 2318 Jump(adaptor, RelocInfo::CODE_TARGET); | 2316 Jump(adaptor, RelocInfo::CODE_TARGET); |
| 2319 } | 2317 } |
| 2320 bind(®ular_invoke); | 2318 bind(®ular_invoke); |
| 2321 } | 2319 } |
| 2322 } | 2320 } |
| 2323 | 2321 |
| 2324 | 2322 |
| 2325 void MacroAssembler::InvokeCode(Register code, | 2323 void MacroAssembler::InvokeCode(Register code, |
| 2326 const ParameterCount& expected, | 2324 const ParameterCount& expected, |
| 2327 const ParameterCount& actual, | 2325 const ParameterCount& actual, |
| 2328 InvokeFlag flag, | 2326 InvokeFlag flag, |
| 2329 CallWrapper* call_wrapper) { | 2327 const CallWrapper& call_wrapper) { |
| 2330 Label done; | 2328 Label done; |
| 2331 | 2329 |
| 2332 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, | 2330 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, |
| 2333 call_wrapper); | 2331 call_wrapper); |
| 2334 if (flag == CALL_FUNCTION) { | 2332 if (flag == CALL_FUNCTION) { |
| 2335 Call(code); | 2333 Call(code); |
| 2336 } else { | 2334 } else { |
| 2337 ASSERT(flag == JUMP_FUNCTION); | 2335 ASSERT(flag == JUMP_FUNCTION); |
| 2338 Jump(code); | 2336 Jump(code); |
| 2339 } | 2337 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2358 } | 2356 } |
| 2359 // Continue here if InvokePrologue does handle the invocation due to | 2357 // Continue here if InvokePrologue does handle the invocation due to |
| 2360 // mismatched parameter counts. | 2358 // mismatched parameter counts. |
| 2361 bind(&done); | 2359 bind(&done); |
| 2362 } | 2360 } |
| 2363 | 2361 |
| 2364 | 2362 |
| 2365 void MacroAssembler::InvokeFunction(Register function, | 2363 void MacroAssembler::InvokeFunction(Register function, |
| 2366 const ParameterCount& actual, | 2364 const ParameterCount& actual, |
| 2367 InvokeFlag flag, | 2365 InvokeFlag flag, |
| 2368 CallWrapper* call_wrapper) { | 2366 const CallWrapper& call_wrapper) { |
| 2369 // Contract with called JS functions requires that function is passed in a1. | 2367 // Contract with called JS functions requires that function is passed in a1. |
| 2370 ASSERT(function.is(a1)); | 2368 ASSERT(function.is(a1)); |
| 2371 Register expected_reg = a2; | 2369 Register expected_reg = a2; |
| 2372 Register code_reg = a3; | 2370 Register code_reg = a3; |
| 2373 | 2371 |
| 2374 lw(code_reg, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 2372 lw(code_reg, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 2375 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 2373 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 2376 lw(expected_reg, | 2374 lw(expected_reg, |
| 2377 FieldMemOperand(code_reg, | 2375 FieldMemOperand(code_reg, |
| 2378 SharedFunctionInfo::kFormalParameterCountOffset)); | 2376 SharedFunctionInfo::kFormalParameterCountOffset)); |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2650 | 2648 |
| 2651 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin) { | 2649 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin) { |
| 2652 li(a1, Operand(builtin)); | 2650 li(a1, Operand(builtin)); |
| 2653 CEntryStub stub(1); | 2651 CEntryStub stub(1); |
| 2654 Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 2652 Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 2655 } | 2653 } |
| 2656 | 2654 |
| 2657 | 2655 |
| 2658 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 2656 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 2659 InvokeFlag flag, | 2657 InvokeFlag flag, |
| 2660 CallWrapper* call_wrapper) { | 2658 const CallWrapper& call_wrapper) { |
| 2661 GetBuiltinEntry(t9, id); | 2659 GetBuiltinEntry(t9, id); |
| 2662 if (flag == CALL_FUNCTION) { | 2660 if (flag == CALL_FUNCTION) { |
| 2663 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(t9)); | 2661 call_wrapper.BeforeCall(CallSize(t9)); |
| 2664 Call(t9); | 2662 Call(t9); |
| 2665 if (call_wrapper != NULL) call_wrapper->AfterCall(); | 2663 call_wrapper.AfterCall(); |
| 2666 } else { | 2664 } else { |
| 2667 ASSERT(flag == JUMP_FUNCTION); | 2665 ASSERT(flag == JUMP_FUNCTION); |
| 2668 Jump(t9); | 2666 Jump(t9); |
| 2669 } | 2667 } |
| 2670 } | 2668 } |
| 2671 | 2669 |
| 2672 | 2670 |
| 2673 void MacroAssembler::GetBuiltinFunction(Register target, | 2671 void MacroAssembler::GetBuiltinFunction(Register target, |
| 2674 Builtins::JavaScript id) { | 2672 Builtins::JavaScript id) { |
| 2675 // Load the builtins object into target register. | 2673 // Load the builtins object into target register. |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3334 masm()->emit(reinterpret_cast<Instr>(addr)); | 3332 masm()->emit(reinterpret_cast<Instr>(addr)); |
| 3335 } | 3333 } |
| 3336 | 3334 |
| 3337 | 3335 |
| 3338 #endif // ENABLE_DEBUGGER_SUPPORT | 3336 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3339 | 3337 |
| 3340 | 3338 |
| 3341 } } // namespace v8::internal | 3339 } } // namespace v8::internal |
| 3342 | 3340 |
| 3343 #endif // V8_TARGET_ARCH_MIPS | 3341 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |