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