| Index: include/v8.h
 | 
| diff --git a/include/v8.h b/include/v8.h
 | 
| index adb9f431766a6e173b5a9df029c915c756dab9f9..f250836cea855a4a07f7058775fa3c6bf97c6673 100644
 | 
| --- a/include/v8.h
 | 
| +++ b/include/v8.h
 | 
| @@ -2719,12 +2719,24 @@ const int kHeapObjectTag = 1;
 | 
|  const int kHeapObjectTagSize = 2;
 | 
|  const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
 | 
|  
 | 
| -
 | 
| +#ifdef V8_LONG_SMI
 | 
| +#ifndef V8_TARGET_ARCH_X64
 | 
| +#error "Large smis on non-64-bit platform."
 | 
| +#endif
 | 
|  // 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
 | 
|  
 | 
|  /**
 | 
|   * This class exports constants and functionality from within v8 that
 | 
| @@ -2761,7 +2773,15 @@ class Internals {
 | 
|    }
 | 
|  
 | 
|    static inline int SmiValue(internal::Object* value) {
 | 
| -    return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> kSmiTagSize;
 | 
| +#ifdef V8_LONG_SMI
 | 
| +    int shift_bits = kSmiTagSize + kSmiShiftSize;
 | 
| +    // Shift down and throw away top 32 bits.
 | 
| +    return static_cast<int>(reinterpret_cast<intptr_t>(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<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
 | 
| +#endif
 | 
|    }
 | 
|  
 | 
|    static inline bool IsExternalTwoByteString(int instance_type) {
 | 
| 
 |