| 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_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/codegen.h" | 8 #include "src/codegen.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 2236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2247 __ CallRuntime(Runtime::kThrowStackOverflow); | 2247 __ CallRuntime(Runtime::kThrowStackOverflow); |
| 2248 __ int3(); | 2248 __ int3(); |
| 2249 } | 2249 } |
| 2250 } | 2250 } |
| 2251 | 2251 |
| 2252 | 2252 |
| 2253 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, | 2253 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, |
| 2254 Register function_template_info, | 2254 Register function_template_info, |
| 2255 Register scratch0, Register scratch1, | 2255 Register scratch0, Register scratch1, |
| 2256 Label* receiver_check_failed) { | 2256 Label* receiver_check_failed) { |
| 2257 // If receiver is not an object, jump to receiver_check_failed. | |
| 2258 __ CmpObjectType(receiver, FIRST_JS_OBJECT_TYPE, scratch0); | |
| 2259 __ j(below, receiver_check_failed); | |
| 2260 | |
| 2261 // If there is no signature, return the holder. | 2257 // If there is no signature, return the holder. |
| 2262 __ CompareRoot(FieldOperand(function_template_info, | 2258 __ CompareRoot(FieldOperand(function_template_info, |
| 2263 FunctionTemplateInfo::kSignatureOffset), | 2259 FunctionTemplateInfo::kSignatureOffset), |
| 2264 Heap::kUndefinedValueRootIndex); | 2260 Heap::kUndefinedValueRootIndex); |
| 2265 Label receiver_check_passed; | 2261 Label receiver_check_passed; |
| 2266 __ j(equal, &receiver_check_passed, Label::kNear); | 2262 __ j(equal, &receiver_check_passed, Label::kNear); |
| 2267 | 2263 |
| 2268 // Walk the prototype chain. | 2264 // Walk the prototype chain. |
| 2269 Label prototype_loop_start; | 2265 Label prototype_loop_start; |
| 2270 __ bind(&prototype_loop_start); | 2266 __ bind(&prototype_loop_start); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2324 // -- eax : number of arguments (not including the receiver) | 2320 // -- eax : number of arguments (not including the receiver) |
| 2325 // -- edi : callee | 2321 // -- edi : callee |
| 2326 // -- esi : context | 2322 // -- esi : context |
| 2327 // -- esp[0] : return address | 2323 // -- esp[0] : return address |
| 2328 // -- esp[4] : last argument | 2324 // -- esp[4] : last argument |
| 2329 // -- ... | 2325 // -- ... |
| 2330 // -- esp[eax * 4] : first argument | 2326 // -- esp[eax * 4] : first argument |
| 2331 // -- esp[(eax + 1) * 4] : receiver | 2327 // -- esp[(eax + 1) * 4] : receiver |
| 2332 // ----------------------------------- | 2328 // ----------------------------------- |
| 2333 | 2329 |
| 2334 // Load the receiver. | |
| 2335 Operand receiver_operand(esp, eax, times_pointer_size, kPCOnStackSize); | |
| 2336 __ mov(ecx, receiver_operand); | |
| 2337 | |
| 2338 // Update the receiver if this is a contextual call. | |
| 2339 Label set_global_proxy, valid_receiver; | |
| 2340 __ CompareRoot(ecx, Heap::kUndefinedValueRootIndex); | |
| 2341 __ j(equal, &set_global_proxy); | |
| 2342 __ bind(&valid_receiver); | |
| 2343 | |
| 2344 // Load the FunctionTemplateInfo. | 2330 // Load the FunctionTemplateInfo. |
| 2345 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 2331 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); |
| 2346 __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kFunctionDataOffset)); | 2332 __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kFunctionDataOffset)); |
| 2347 | 2333 |
| 2348 // Do the compatible receiver check. | 2334 // Do the compatible receiver check. |
| 2349 Label receiver_check_failed; | 2335 Label receiver_check_failed; |
| 2336 __ mov(ecx, Operand(esp, eax, times_pointer_size, kPCOnStackSize)); |
| 2350 __ Push(eax); | 2337 __ Push(eax); |
| 2351 CompatibleReceiverCheck(masm, ecx, ebx, edx, eax, &receiver_check_failed); | 2338 CompatibleReceiverCheck(masm, ecx, ebx, edx, eax, &receiver_check_failed); |
| 2352 __ Pop(eax); | 2339 __ Pop(eax); |
| 2353 // Get the callback offset from the FunctionTemplateInfo, and jump to the | 2340 // Get the callback offset from the FunctionTemplateInfo, and jump to the |
| 2354 // beginning of the code. | 2341 // beginning of the code. |
| 2355 __ mov(edx, FieldOperand(ebx, FunctionTemplateInfo::kCallCodeOffset)); | 2342 __ mov(edx, FieldOperand(ebx, FunctionTemplateInfo::kCallCodeOffset)); |
| 2356 __ mov(edx, FieldOperand(edx, CallHandlerInfo::kFastHandlerOffset)); | 2343 __ mov(edx, FieldOperand(edx, CallHandlerInfo::kFastHandlerOffset)); |
| 2357 __ add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); | 2344 __ add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| 2358 __ jmp(edx); | 2345 __ jmp(edx); |
| 2359 | 2346 |
| 2360 __ bind(&set_global_proxy); | |
| 2361 __ mov(ecx, NativeContextOperand()); | |
| 2362 __ mov(ecx, ContextOperand(ecx, Context::GLOBAL_PROXY_INDEX)); | |
| 2363 __ mov(receiver_operand, ecx); | |
| 2364 __ jmp(&valid_receiver, Label::kNear); | |
| 2365 | |
| 2366 // Compatible receiver check failed: pop return address, arguments and | 2347 // Compatible receiver check failed: pop return address, arguments and |
| 2367 // receiver and throw an Illegal Invocation exception. | 2348 // receiver and throw an Illegal Invocation exception. |
| 2368 __ bind(&receiver_check_failed); | 2349 __ bind(&receiver_check_failed); |
| 2369 __ Pop(eax); | 2350 __ Pop(eax); |
| 2370 __ PopReturnAddressTo(ebx); | 2351 __ PopReturnAddressTo(ebx); |
| 2371 __ lea(eax, Operand(eax, times_pointer_size, 1 * kPointerSize)); | 2352 __ lea(eax, Operand(eax, times_pointer_size, 1 * kPointerSize)); |
| 2372 __ add(esp, eax); | 2353 __ add(esp, eax); |
| 2373 __ PushReturnAddressFrom(ebx); | 2354 __ PushReturnAddressFrom(ebx); |
| 2374 { | 2355 { |
| 2375 FrameScope scope(masm, StackFrame::INTERNAL); | 2356 FrameScope scope(masm, StackFrame::INTERNAL); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2431 | 2412 |
| 2432 __ bind(&ok); | 2413 __ bind(&ok); |
| 2433 __ ret(0); | 2414 __ ret(0); |
| 2434 } | 2415 } |
| 2435 | 2416 |
| 2436 #undef __ | 2417 #undef __ |
| 2437 } // namespace internal | 2418 } // namespace internal |
| 2438 } // namespace v8 | 2419 } // namespace v8 |
| 2439 | 2420 |
| 2440 #endif // V8_TARGET_ARCH_X87 | 2421 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |