OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 | 630 |
631 // Patch the receiver on the stack with the global proxy if | 631 // Patch the receiver on the stack with the global proxy if |
632 // necessary. | 632 // necessary. |
633 if (object->IsGlobalObject()) { | 633 if (object->IsGlobalObject()) { |
634 __ ldr(r3, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 634 __ ldr(r3, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
635 __ str(r3, MemOperand(sp, argc * kPointerSize)); | 635 __ str(r3, MemOperand(sp, argc * kPointerSize)); |
636 } | 636 } |
637 break; | 637 break; |
638 | 638 |
639 case STRING_CHECK: | 639 case STRING_CHECK: |
640 // Check that the object is a two-byte string or a symbol. | 640 if (!function->IsBuiltin()) { |
641 __ CompareObjectType(r1, r2, r2, FIRST_NONSTRING_TYPE); | 641 // Calling non-builtins with a value as receiver requires boxing. |
642 __ b(hs, &miss); | 642 __ jmp(&miss); |
643 // Check that the maps starting from the prototype haven't changed. | 643 } else { |
644 GenerateLoadGlobalFunctionPrototype(masm(), | 644 // Check that the object is a two-byte string or a symbol. |
645 Context::STRING_FUNCTION_INDEX, | 645 __ CompareObjectType(r1, r2, r2, FIRST_NONSTRING_TYPE); |
646 r2); | 646 __ b(hs, &miss); |
647 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, | 647 // Check that the maps starting from the prototype haven't changed. |
648 r1, name, &miss); | 648 GenerateLoadGlobalFunctionPrototype(masm(), |
| 649 Context::STRING_FUNCTION_INDEX, |
| 650 r2); |
| 651 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, |
| 652 r1, name, &miss); |
| 653 } |
649 break; | 654 break; |
650 | 655 |
651 case NUMBER_CHECK: { | 656 case NUMBER_CHECK: { |
652 Label fast; | 657 if (!function->IsBuiltin()) { |
653 // Check that the object is a smi or a heap number. | 658 // Calling non-builtins with a value as receiver requires boxing. |
654 __ tst(r1, Operand(kSmiTagMask)); | 659 __ jmp(&miss); |
655 __ b(eq, &fast); | 660 } else { |
656 __ CompareObjectType(r1, r2, r2, HEAP_NUMBER_TYPE); | 661 Label fast; |
657 __ b(ne, &miss); | 662 // Check that the object is a smi or a heap number. |
658 __ bind(&fast); | 663 __ tst(r1, Operand(kSmiTagMask)); |
659 // Check that the maps starting from the prototype haven't changed. | 664 __ b(eq, &fast); |
660 GenerateLoadGlobalFunctionPrototype(masm(), | 665 __ CompareObjectType(r1, r2, r2, HEAP_NUMBER_TYPE); |
661 Context::NUMBER_FUNCTION_INDEX, | 666 __ b(ne, &miss); |
662 r2); | 667 __ bind(&fast); |
663 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, | 668 // Check that the maps starting from the prototype haven't changed. |
664 r1, name, &miss); | 669 GenerateLoadGlobalFunctionPrototype(masm(), |
| 670 Context::NUMBER_FUNCTION_INDEX, |
| 671 r2); |
| 672 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, |
| 673 r1, name, &miss); |
| 674 } |
665 break; | 675 break; |
666 } | 676 } |
667 | 677 |
668 case BOOLEAN_CHECK: { | 678 case BOOLEAN_CHECK: { |
669 Label fast; | 679 if (!function->IsBuiltin()) { |
670 // Check that the object is a boolean. | 680 // Calling non-builtins with a value as receiver requires boxing. |
671 __ LoadRoot(ip, Heap::kTrueValueRootIndex); | 681 __ jmp(&miss); |
672 __ cmp(r1, ip); | 682 } else { |
673 __ b(eq, &fast); | 683 Label fast; |
674 __ LoadRoot(ip, Heap::kFalseValueRootIndex); | 684 // Check that the object is a boolean. |
675 __ cmp(r1, ip); | 685 __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
676 __ b(ne, &miss); | 686 __ cmp(r1, ip); |
677 __ bind(&fast); | 687 __ b(eq, &fast); |
678 // Check that the maps starting from the prototype haven't changed. | 688 __ LoadRoot(ip, Heap::kFalseValueRootIndex); |
679 GenerateLoadGlobalFunctionPrototype(masm(), | 689 __ cmp(r1, ip); |
680 Context::BOOLEAN_FUNCTION_INDEX, | 690 __ b(ne, &miss); |
681 r2); | 691 __ bind(&fast); |
682 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, | 692 // Check that the maps starting from the prototype haven't changed. |
683 r1, name, &miss); | 693 GenerateLoadGlobalFunctionPrototype(masm(), |
| 694 Context::BOOLEAN_FUNCTION_INDEX, |
| 695 r2); |
| 696 CheckPrototypes(JSObject::cast(object->GetPrototype()), r2, holder, r3, |
| 697 r1, name, &miss); |
| 698 } |
684 break; | 699 break; |
685 } | 700 } |
686 | 701 |
687 case JSARRAY_HAS_FAST_ELEMENTS_CHECK: | 702 case JSARRAY_HAS_FAST_ELEMENTS_CHECK: |
688 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r2, name, &miss); | 703 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r2, name, &miss); |
689 // Make sure object->HasFastElements(). | 704 // Make sure object->HasFastElements(). |
690 // Get the elements array of the object. | 705 // Get the elements array of the object. |
691 __ ldr(r3, FieldMemOperand(r1, JSObject::kElementsOffset)); | 706 __ ldr(r3, FieldMemOperand(r1, JSObject::kElementsOffset)); |
692 // Check that the object is in fast mode (not dictionary). | 707 // Check that the object is in fast mode (not dictionary). |
693 __ ldr(r2, FieldMemOperand(r3, HeapObject::kMapOffset)); | 708 __ ldr(r2, FieldMemOperand(r3, HeapObject::kMapOffset)); |
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); | 1522 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); |
1508 | 1523 |
1509 // Return the generated code. | 1524 // Return the generated code. |
1510 return GetCode(); | 1525 return GetCode(); |
1511 } | 1526 } |
1512 | 1527 |
1513 | 1528 |
1514 #undef __ | 1529 #undef __ |
1515 | 1530 |
1516 } } // namespace v8::internal | 1531 } } // namespace v8::internal |
OLD | NEW |