OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 } | 737 } |
738 | 738 |
739 | 739 |
740 int Smi::value() { | 740 int Smi::value() { |
741 return Internals::SmiValue(this); | 741 return Internals::SmiValue(this); |
742 } | 742 } |
743 | 743 |
744 | 744 |
745 Smi* Smi::FromInt(int value) { | 745 Smi* Smi::FromInt(int value) { |
746 ASSERT(Smi::IsValid(value)); | 746 ASSERT(Smi::IsValid(value)); |
| 747 int smi_shift_bits = kSmiTagSize + kSmiShiftSize; |
747 intptr_t tagged_value = | 748 intptr_t tagged_value = |
748 (static_cast<intptr_t>(value) << kSmiTagSize) | kSmiTag; | 749 (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag; |
749 return reinterpret_cast<Smi*>(tagged_value); | 750 return reinterpret_cast<Smi*>(tagged_value); |
750 } | 751 } |
751 | 752 |
752 | 753 |
753 Smi* Smi::FromIntptr(intptr_t value) { | 754 Smi* Smi::FromIntptr(intptr_t value) { |
754 ASSERT(Smi::IsValid(value)); | 755 ASSERT(Smi::IsValid(value)); |
755 return reinterpret_cast<Smi*>((value << kSmiTagSize) | kSmiTag); | 756 int smi_shift_bits = kSmiTagSize + kSmiShiftSize; |
| 757 return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); |
756 } | 758 } |
757 | 759 |
758 | 760 |
759 Failure::Type Failure::type() const { | 761 Failure::Type Failure::type() const { |
760 return static_cast<Type>(value() & kFailureTypeTagMask); | 762 return static_cast<Type>(value() & kFailureTypeTagMask); |
761 } | 763 } |
762 | 764 |
763 | 765 |
764 bool Failure::IsInternalError() const { | 766 bool Failure::IsInternalError() const { |
765 return type() == INTERNAL_ERROR; | 767 return type() == INTERNAL_ERROR; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info); | 827 ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info); |
826 return reinterpret_cast<Failure*>( | 828 return reinterpret_cast<Failure*>( |
827 (static_cast<intptr_t>(info) << kFailureTagSize) | kFailureTag); | 829 (static_cast<intptr_t>(info) << kFailureTagSize) | kFailureTag); |
828 } | 830 } |
829 | 831 |
830 | 832 |
831 bool Smi::IsValid(intptr_t value) { | 833 bool Smi::IsValid(intptr_t value) { |
832 #ifdef DEBUG | 834 #ifdef DEBUG |
833 bool in_range = (value >= kMinValue) && (value <= kMaxValue); | 835 bool in_range = (value >= kMinValue) && (value <= kMaxValue); |
834 #endif | 836 #endif |
| 837 |
| 838 #ifdef V8_LONG_SMI |
| 839 // To be representable as a long smi, the value must be a 32-bit integer. |
| 840 bool result = (value == static_cast<int32_t>(value)); |
| 841 #else |
835 // To be representable as an tagged small integer, the two | 842 // To be representable as an tagged small integer, the two |
836 // most-significant bits of 'value' must be either 00 or 11 due to | 843 // most-significant bits of 'value' must be either 00 or 11 due to |
837 // sign-extension. To check this we add 01 to the two | 844 // sign-extension. To check this we add 01 to the two |
838 // most-significant bits, and check if the most-significant bit is 0 | 845 // most-significant bits, and check if the most-significant bit is 0 |
839 // | 846 // |
840 // CAUTION: The original code below: | 847 // CAUTION: The original code below: |
841 // bool result = ((value + 0x40000000) & 0x80000000) == 0; | 848 // bool result = ((value + 0x40000000) & 0x80000000) == 0; |
842 // may lead to incorrect results according to the C language spec, and | 849 // may lead to incorrect results according to the C language spec, and |
843 // in fact doesn't work correctly with gcc4.1.1 in some cases: The | 850 // in fact doesn't work correctly with gcc4.1.1 in some cases: The |
844 // compiler may produce undefined results in case of signed integer | 851 // compiler may produce undefined results in case of signed integer |
845 // overflow. The computation must be done w/ unsigned ints. | 852 // overflow. The computation must be done w/ unsigned ints. |
846 bool result = | 853 bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U); |
847 ((static_cast<unsigned int>(value) + 0x40000000U) & 0x80000000U) == 0; | 854 #endif |
848 ASSERT(result == in_range); | 855 ASSERT(result == in_range); |
849 return result; | 856 return result; |
850 } | 857 } |
851 | |
852 | |
853 bool Smi::IsIntptrValid(intptr_t value) { | |
854 #ifdef DEBUG | |
855 bool in_range = (value >= kMinValue) && (value <= kMaxValue); | |
856 #endif | |
857 // See Smi::IsValid(int) for description. | |
858 bool result = | |
859 ((static_cast<uintptr_t>(value) + 0x40000000U) < 0x80000000U); | |
860 ASSERT(result == in_range); | |
861 return result; | |
862 } | |
863 | 858 |
864 | 859 |
865 MapWord MapWord::FromMap(Map* map) { | 860 MapWord MapWord::FromMap(Map* map) { |
866 return MapWord(reinterpret_cast<uintptr_t>(map)); | 861 return MapWord(reinterpret_cast<uintptr_t>(map)); |
867 } | 862 } |
868 | 863 |
869 | 864 |
870 Map* MapWord::ToMap() { | 865 Map* MapWord::ToMap() { |
871 return reinterpret_cast<Map*>(value_); | 866 return reinterpret_cast<Map*>(value_); |
872 } | 867 } |
(...skipping 2019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2892 #undef WRITE_INT_FIELD | 2887 #undef WRITE_INT_FIELD |
2893 #undef READ_SHORT_FIELD | 2888 #undef READ_SHORT_FIELD |
2894 #undef WRITE_SHORT_FIELD | 2889 #undef WRITE_SHORT_FIELD |
2895 #undef READ_BYTE_FIELD | 2890 #undef READ_BYTE_FIELD |
2896 #undef WRITE_BYTE_FIELD | 2891 #undef WRITE_BYTE_FIELD |
2897 | 2892 |
2898 | 2893 |
2899 } } // namespace v8::internal | 2894 } } // namespace v8::internal |
2900 | 2895 |
2901 #endif // V8_OBJECTS_INL_H_ | 2896 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |