Chromium Code Reviews| 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 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 753 // type of a variable of another type. Of course the end result is likely to | 753 // type of a variable of another type. Of course the end result is likely to |
| 754 // be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005) | 754 // be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005) |
| 755 // will completely optimize BitCast away. | 755 // will completely optimize BitCast away. |
| 756 // | 756 // |
| 757 // There is an additional use for BitCast. | 757 // There is an additional use for BitCast. |
| 758 // Recent gccs will warn when they see casts that may result in breakage due to | 758 // Recent gccs will warn when they see casts that may result in breakage due to |
| 759 // the type-based aliasing rule. If you have checked that there is no breakage | 759 // the type-based aliasing rule. If you have checked that there is no breakage |
| 760 // you can use BitCast to cast one pointer type to another. This confuses gcc | 760 // you can use BitCast to cast one pointer type to another. This confuses gcc |
| 761 // enough that it can no longer see that you have cast one pointer type to | 761 // enough that it can no longer see that you have cast one pointer type to |
| 762 // another thus avoiding the warning. | 762 // another thus avoiding the warning. |
| 763 | |
| 764 // We need different implementations of BitCast for pointer and non-pointer | |
| 765 // values. We use partial specialization of auxiliary struct to work around | |
| 766 // issues with template functions overloading. | |
| 767 template <class Dest, class Source> | |
| 768 struct BitCastHelper { | |
| 769 STATIC_ASSERT(sizeof(Dest) == sizeof(Source)); | |
| 770 | |
| 771 INLINE(static Dest cast(const Source& source)) { | |
| 772 Dest dest; | |
| 773 memcpy(&dest, &source, sizeof(dest)); | |
| 774 return dest; | |
| 775 } | |
| 776 }; | |
| 777 | |
| 778 template <class Dest, class Source> | |
| 779 struct BitCastHelper<Dest, Source*> { | |
| 780 INLINE(static Dest cast(Source* source)) { | |
| 781 return BitCastHelper<Dest, uintptr_t>:: | |
| 782 cast(reinterpret_cast<uintptr_t>(source)); | |
| 783 } | |
| 784 }; | |
| 785 | |
|
Erik Corry
2011/01/25 10:30:40
Two blank lines.
| |
| 763 template <class Dest, class Source> | 786 template <class Dest, class Source> |
| 764 inline Dest BitCast(const Source& source) { | 787 inline Dest BitCast(const Source& source) { |
| 765 // Compile time assertion: sizeof(Dest) == sizeof(Source) | 788 return BitCastHelper<Dest, Source>::cast(source); |
| 766 // A compile error here means your Dest and Source have different sizes. | |
| 767 typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; | |
| 768 | |
| 769 Dest dest; | |
| 770 memcpy(&dest, &source, sizeof(dest)); | |
| 771 return dest; | |
| 772 } | |
| 773 | |
| 774 template <class Dest, class Source> | |
| 775 inline Dest BitCast(Source* source) { | |
| 776 return BitCast<Dest>(reinterpret_cast<uintptr_t>(source)); | |
| 777 } | 789 } |
| 778 | 790 |
| 779 } } // namespace v8::internal | 791 } } // namespace v8::internal |
| 780 | 792 |
| 781 #endif // V8_UTILS_H_ | 793 #endif // V8_UTILS_H_ |
| OLD | NEW |