From f4516c8bdd9cda1b0ed17073a47745281490d78d Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Fri, 16 Oct 2009 10:29:10 +0000 Subject: [PATCH] Remove dependency on V8_TARGET_ARCH in v8.h Review URL: http://codereview.chromium.org/287004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3080 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- include/v8.h | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/include/v8.h b/include/v8.h index d2f3f5e..d923f97 100644 --- a/include/v8.h +++ b/include/v8.h @@ -2727,21 +2727,37 @@ const int kHeapObjectTag = 1; const int kHeapObjectTagSize = 2; const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1; -#ifdef V8_TARGET_ARCH_X64 // Tag information for Smi. const int kSmiTag = 0; const int kSmiTagSize = 1; const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1; -const int kSmiShiftSize = 31; -const int kSmiValueSize = 32; -#else -// Tag information for Smi. -const int kSmiTag = 0; -const int kSmiTagSize = 1; -const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1; -const int kSmiShiftSize = 0; -const int kSmiValueSize = 31; -#endif + +template struct SmiConstants; + +// Smi constants for 32-bit systems. +template <> struct SmiConstants<4> { + static const int kSmiShiftSize = 0; + static const int kSmiValueSize = 31; + static inline int SmiToInt(internal::Object* value) { + int shift_bits = kSmiTagSize + kSmiShiftSize; + // Throw away top 32 bits and shift down (requires >> to be sign extending). + return static_cast(reinterpret_cast(value)) >> shift_bits; + } +}; + +// Smi constants for 64-bit systems. +template <> struct SmiConstants<8> { + static const int kSmiShiftSize = 31; + static const int kSmiValueSize = 32; + static inline int SmiToInt(internal::Object* value) { + int shift_bits = kSmiTagSize + kSmiShiftSize; + // Shift down and throw away top 32 bits. + return static_cast(reinterpret_cast(value) >> shift_bits); + } +}; + +const int kSmiShiftSize = SmiConstants::kSmiShiftSize; +const int kSmiValueSize = SmiConstants::kSmiValueSize; /** * This class exports constants and functionality from within v8 that @@ -2777,15 +2793,7 @@ class Internals { } static inline int SmiValue(internal::Object* value) { -#ifdef V8_TARGET_ARCH_X64 - int shift_bits = kSmiTagSize + kSmiShiftSize; - // Shift down and throw away top 32 bits. - return static_cast(reinterpret_cast(value) >> shift_bits); -#else - int shift_bits = kSmiTagSize + kSmiShiftSize; - // Throw away top 32 bits and shift down (requires >> to be sign extending). - return static_cast(reinterpret_cast(value)) >> shift_bits; -#endif + return SmiConstants::SmiToInt(value); } static inline int GetInstanceType(internal::Object* obj) { -- 2.7.4