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 2337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2348 Register scratch0, Register scratch1, | 2348 Register scratch0, Register scratch1, |
2349 Label* receiver_check_failed) { | 2349 Label* receiver_check_failed) { |
2350 // If there is no signature, return the holder. | 2350 // If there is no signature, return the holder. |
2351 __ CompareRoot(FieldOperand(function_template_info, | 2351 __ CompareRoot(FieldOperand(function_template_info, |
2352 FunctionTemplateInfo::kSignatureOffset), | 2352 FunctionTemplateInfo::kSignatureOffset), |
2353 Heap::kUndefinedValueRootIndex); | 2353 Heap::kUndefinedValueRootIndex); |
2354 Label receiver_check_passed; | 2354 Label receiver_check_passed; |
2355 __ j(equal, &receiver_check_passed, Label::kNear); | 2355 __ j(equal, &receiver_check_passed, Label::kNear); |
2356 | 2356 |
2357 // Walk the prototype chain. | 2357 // Walk the prototype chain. |
| 2358 __ mov(scratch0, FieldOperand(receiver, HeapObject::kMapOffset)); |
2358 Label prototype_loop_start; | 2359 Label prototype_loop_start; |
2359 __ bind(&prototype_loop_start); | 2360 __ bind(&prototype_loop_start); |
2360 | 2361 |
2361 // End if receiver is null or if it's a hidden prototype. | |
2362 __ CompareRoot(receiver, Heap::kNullValueRootIndex); | |
2363 __ j(equal, receiver_check_failed, Label::kNear); | |
2364 __ mov(scratch0, FieldOperand(receiver, HeapObject::kMapOffset)); | |
2365 __ test(FieldOperand(scratch0, Map::kBitField3Offset), | |
2366 Immediate(Map::IsHiddenPrototype::kMask)); | |
2367 __ j(not_zero, receiver_check_failed, Label::kNear); | |
2368 | |
2369 // Get the constructor, if any. | 2362 // Get the constructor, if any. |
2370 __ GetMapConstructor(scratch0, scratch0, scratch1); | 2363 __ GetMapConstructor(scratch0, scratch0, scratch1); |
2371 __ CmpInstanceType(scratch1, JS_FUNCTION_TYPE); | 2364 __ CmpInstanceType(scratch1, JS_FUNCTION_TYPE); |
2372 Label next_prototype; | 2365 Label next_prototype; |
2373 __ j(not_equal, &next_prototype, Label::kNear); | 2366 __ j(not_equal, &next_prototype, Label::kNear); |
2374 | 2367 |
2375 // Get the constructor's signature. | 2368 // Get the constructor's signature. |
2376 __ mov(scratch0, | 2369 __ mov(scratch0, |
2377 FieldOperand(scratch0, JSFunction::kSharedFunctionInfoOffset)); | 2370 FieldOperand(scratch0, JSFunction::kSharedFunctionInfoOffset)); |
2378 __ mov(scratch0, | 2371 __ mov(scratch0, |
(...skipping 12 matching lines...) Expand all Loading... |
2391 // in the chain. | 2384 // in the chain. |
2392 __ JumpIfSmi(scratch0, &next_prototype, Label::kNear); | 2385 __ JumpIfSmi(scratch0, &next_prototype, Label::kNear); |
2393 __ CmpObjectType(scratch0, FUNCTION_TEMPLATE_INFO_TYPE, scratch1); | 2386 __ CmpObjectType(scratch0, FUNCTION_TEMPLATE_INFO_TYPE, scratch1); |
2394 __ j(not_equal, &next_prototype, Label::kNear); | 2387 __ j(not_equal, &next_prototype, Label::kNear); |
2395 | 2388 |
2396 // Otherwise load the parent function template and iterate. | 2389 // Otherwise load the parent function template and iterate. |
2397 __ mov(scratch0, | 2390 __ mov(scratch0, |
2398 FieldOperand(scratch0, FunctionTemplateInfo::kParentTemplateOffset)); | 2391 FieldOperand(scratch0, FunctionTemplateInfo::kParentTemplateOffset)); |
2399 __ jmp(&function_template_loop, Label::kNear); | 2392 __ jmp(&function_template_loop, Label::kNear); |
2400 | 2393 |
2401 // Load the next prototype and iterate. | 2394 // Load the next prototype. |
2402 __ bind(&next_prototype); | 2395 __ bind(&next_prototype); |
2403 __ mov(receiver, FieldOperand(receiver, HeapObject::kMapOffset)); | 2396 __ mov(receiver, FieldOperand(receiver, HeapObject::kMapOffset)); |
2404 __ mov(receiver, FieldOperand(receiver, Map::kPrototypeOffset)); | 2397 __ mov(receiver, FieldOperand(receiver, Map::kPrototypeOffset)); |
| 2398 // End if the prototype is null or not hidden. |
| 2399 __ CompareRoot(receiver, Heap::kNullValueRootIndex); |
| 2400 __ j(equal, receiver_check_failed); |
| 2401 __ mov(scratch0, FieldOperand(receiver, HeapObject::kMapOffset)); |
| 2402 __ test(FieldOperand(scratch0, Map::kBitField3Offset), |
| 2403 Immediate(Map::IsHiddenPrototype::kMask)); |
| 2404 __ j(zero, receiver_check_failed); |
| 2405 // Iterate. |
2405 __ jmp(&prototype_loop_start, Label::kNear); | 2406 __ jmp(&prototype_loop_start, Label::kNear); |
2406 | 2407 |
2407 __ bind(&receiver_check_passed); | 2408 __ bind(&receiver_check_passed); |
2408 } | 2409 } |
2409 | 2410 |
2410 | 2411 |
2411 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) { | 2412 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) { |
2412 // ----------- S t a t e ------------- | 2413 // ----------- S t a t e ------------- |
2413 // -- eax : number of arguments (not including the receiver) | 2414 // -- eax : number of arguments (not including the receiver) |
2414 // -- edi : callee | 2415 // -- edi : callee |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2505 | 2506 |
2506 __ bind(&ok); | 2507 __ bind(&ok); |
2507 __ ret(0); | 2508 __ ret(0); |
2508 } | 2509 } |
2509 | 2510 |
2510 #undef __ | 2511 #undef __ |
2511 } // namespace internal | 2512 } // namespace internal |
2512 } // namespace v8 | 2513 } // namespace v8 |
2513 | 2514 |
2514 #endif // V8_TARGET_ARCH_X87 | 2515 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |