| 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_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
| 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 2229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2240 __ CallRuntime(Runtime::kThrowStackOverflow); | 2240 __ CallRuntime(Runtime::kThrowStackOverflow); |
| 2241 __ int3(); | 2241 __ int3(); |
| 2242 } | 2242 } |
| 2243 } | 2243 } |
| 2244 | 2244 |
| 2245 | 2245 |
| 2246 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, | 2246 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, |
| 2247 Register function_template_info, | 2247 Register function_template_info, |
| 2248 Register scratch0, Register scratch1, | 2248 Register scratch0, Register scratch1, |
| 2249 Label* receiver_check_failed) { | 2249 Label* receiver_check_failed) { |
| 2250 // If receiver is not an object, jump to receiver_check_failed. | |
| 2251 __ CmpObjectType(receiver, FIRST_JS_OBJECT_TYPE, scratch0); | |
| 2252 __ j(below, receiver_check_failed); | |
| 2253 | |
| 2254 // If there is no signature, return the holder. | 2250 // If there is no signature, return the holder. |
| 2255 __ CompareRoot(FieldOperand(function_template_info, | 2251 __ CompareRoot(FieldOperand(function_template_info, |
| 2256 FunctionTemplateInfo::kSignatureOffset), | 2252 FunctionTemplateInfo::kSignatureOffset), |
| 2257 Heap::kUndefinedValueRootIndex); | 2253 Heap::kUndefinedValueRootIndex); |
| 2258 Label receiver_check_passed; | 2254 Label receiver_check_passed; |
| 2259 __ j(equal, &receiver_check_passed, Label::kNear); | 2255 __ j(equal, &receiver_check_passed, Label::kNear); |
| 2260 | 2256 |
| 2261 // Walk the prototype chain. | 2257 // Walk the prototype chain. |
| 2262 Label prototype_loop_start; | 2258 Label prototype_loop_start; |
| 2263 __ bind(&prototype_loop_start); | 2259 __ bind(&prototype_loop_start); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 // -- eax : number of arguments (not including the receiver) | 2313 // -- eax : number of arguments (not including the receiver) |
| 2318 // -- edi : callee | 2314 // -- edi : callee |
| 2319 // -- esi : context | 2315 // -- esi : context |
| 2320 // -- esp[0] : return address | 2316 // -- esp[0] : return address |
| 2321 // -- esp[4] : last argument | 2317 // -- esp[4] : last argument |
| 2322 // -- ... | 2318 // -- ... |
| 2323 // -- esp[eax * 4] : first argument | 2319 // -- esp[eax * 4] : first argument |
| 2324 // -- esp[(eax + 1) * 4] : receiver | 2320 // -- esp[(eax + 1) * 4] : receiver |
| 2325 // ----------------------------------- | 2321 // ----------------------------------- |
| 2326 | 2322 |
| 2327 // Load the receiver. | |
| 2328 Operand receiver_operand(esp, eax, times_pointer_size, kPCOnStackSize); | |
| 2329 __ mov(ecx, receiver_operand); | |
| 2330 | |
| 2331 // Update the receiver if this is a contextual call. | |
| 2332 Label set_global_proxy, valid_receiver; | |
| 2333 __ CompareRoot(ecx, Heap::kUndefinedValueRootIndex); | |
| 2334 __ j(equal, &set_global_proxy); | |
| 2335 __ bind(&valid_receiver); | |
| 2336 | |
| 2337 // Load the FunctionTemplateInfo. | 2323 // Load the FunctionTemplateInfo. |
| 2338 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 2324 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); |
| 2339 __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kFunctionDataOffset)); | 2325 __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kFunctionDataOffset)); |
| 2340 | 2326 |
| 2341 // Do the compatible receiver check. | 2327 // Do the compatible receiver check. |
| 2342 Label receiver_check_failed; | 2328 Label receiver_check_failed; |
| 2329 __ mov(ecx, Operand(esp, eax, times_pointer_size, kPCOnStackSize)); |
| 2343 __ Push(eax); | 2330 __ Push(eax); |
| 2344 CompatibleReceiverCheck(masm, ecx, ebx, edx, eax, &receiver_check_failed); | 2331 CompatibleReceiverCheck(masm, ecx, ebx, edx, eax, &receiver_check_failed); |
| 2345 __ Pop(eax); | 2332 __ Pop(eax); |
| 2346 // Get the callback offset from the FunctionTemplateInfo, and jump to the | 2333 // Get the callback offset from the FunctionTemplateInfo, and jump to the |
| 2347 // beginning of the code. | 2334 // beginning of the code. |
| 2348 __ mov(edx, FieldOperand(ebx, FunctionTemplateInfo::kCallCodeOffset)); | 2335 __ mov(edx, FieldOperand(ebx, FunctionTemplateInfo::kCallCodeOffset)); |
| 2349 __ mov(edx, FieldOperand(edx, CallHandlerInfo::kFastHandlerOffset)); | 2336 __ mov(edx, FieldOperand(edx, CallHandlerInfo::kFastHandlerOffset)); |
| 2350 __ add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); | 2337 __ add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| 2351 __ jmp(edx); | 2338 __ jmp(edx); |
| 2352 | 2339 |
| 2353 __ bind(&set_global_proxy); | |
| 2354 __ mov(ecx, NativeContextOperand()); | |
| 2355 __ mov(ecx, ContextOperand(ecx, Context::GLOBAL_PROXY_INDEX)); | |
| 2356 __ mov(receiver_operand, ecx); | |
| 2357 __ jmp(&valid_receiver, Label::kNear); | |
| 2358 | |
| 2359 // Compatible receiver check failed: pop return address, arguments and | 2340 // Compatible receiver check failed: pop return address, arguments and |
| 2360 // receiver and throw an Illegal Invocation exception. | 2341 // receiver and throw an Illegal Invocation exception. |
| 2361 __ bind(&receiver_check_failed); | 2342 __ bind(&receiver_check_failed); |
| 2362 __ Pop(eax); | 2343 __ Pop(eax); |
| 2363 __ PopReturnAddressTo(ebx); | 2344 __ PopReturnAddressTo(ebx); |
| 2364 __ lea(eax, Operand(eax, times_pointer_size, 1 * kPointerSize)); | 2345 __ lea(eax, Operand(eax, times_pointer_size, 1 * kPointerSize)); |
| 2365 __ add(esp, eax); | 2346 __ add(esp, eax); |
| 2366 __ PushReturnAddressFrom(ebx); | 2347 __ PushReturnAddressFrom(ebx); |
| 2367 { | 2348 { |
| 2368 FrameScope scope(masm, StackFrame::INTERNAL); | 2349 FrameScope scope(masm, StackFrame::INTERNAL); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2424 | 2405 |
| 2425 __ bind(&ok); | 2406 __ bind(&ok); |
| 2426 __ ret(0); | 2407 __ ret(0); |
| 2427 } | 2408 } |
| 2428 | 2409 |
| 2429 #undef __ | 2410 #undef __ |
| 2430 } // namespace internal | 2411 } // namespace internal |
| 2431 } // namespace v8 | 2412 } // namespace v8 |
| 2432 | 2413 |
| 2433 #endif // V8_TARGET_ARCH_IA32 | 2414 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |