| Index: src/conversions.h
 | 
| diff --git a/src/conversions.h b/src/conversions.h
 | 
| index c8484e448bec6fb82db0141cd65002f2bbda179f..12f895d86713d8fa607d605d96f808a0e1333d34 100644
 | 
| --- a/src/conversions.h
 | 
| +++ b/src/conversions.h
 | 
| @@ -28,6 +28,11 @@
 | 
|  #ifndef V8_CONVERSIONS_H_
 | 
|  #define V8_CONVERSIONS_H_
 | 
|  
 | 
| +#include <limits>
 | 
| +
 | 
| +#include "checks.h"
 | 
| +#include "handles.h"
 | 
| +#include "objects.h"
 | 
|  #include "utils.h"
 | 
|  
 | 
|  namespace v8 {
 | 
| @@ -163,6 +168,77 @@ char* DoubleToExponentialCString(double value, int f);
 | 
|  char* DoubleToPrecisionCString(double value, int f);
 | 
|  char* DoubleToRadixCString(double value, int radix);
 | 
|  
 | 
| +
 | 
| +static inline bool IsMinusZero(double value) {
 | 
| +  static const DoubleRepresentation minus_zero(-0.0);
 | 
| +  return DoubleRepresentation(value) == minus_zero;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +// Integer32 is an integer that can be represented as a signed 32-bit
 | 
| +// integer. It has to be in the range [-2^31, 2^31 - 1].
 | 
| +// We also have to check for negative 0 as it is not an Integer32.
 | 
| +static inline bool IsInt32Double(double value) {
 | 
| +  return !IsMinusZero(value) &&
 | 
| +         value >= kMinInt &&
 | 
| +         value <= kMaxInt &&
 | 
| +         value == FastI2D(FastD2I(value));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +// Convert from Number object to C integer.
 | 
| +inline int32_t NumberToInt32(Object* number) {
 | 
| +  if (number->IsSmi()) return Smi::cast(number)->value();
 | 
| +  return DoubleToInt32(number->Number());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +inline uint32_t NumberToUint32(Object* number) {
 | 
| +  if (number->IsSmi()) return Smi::cast(number)->value();
 | 
| +  return DoubleToUint32(number->Number());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +double StringToDouble(UnicodeCache* unicode_cache,
 | 
| +                      String* string,
 | 
| +                      int flags,
 | 
| +                      double empty_string_val = 0.0);
 | 
| +
 | 
| +
 | 
| +inline bool TryNumberToSize(Isolate* isolate,
 | 
| +                            Object* number, size_t* result) {
 | 
| +  SealHandleScope shs(isolate);
 | 
| +  if (number->IsSmi()) {
 | 
| +    int value = Smi::cast(number)->value();
 | 
| +    ASSERT(static_cast<unsigned>(Smi::kMaxValue)
 | 
| +           <= std::numeric_limits<size_t>::max());
 | 
| +    if (value >= 0) {
 | 
| +      *result = static_cast<size_t>(value);
 | 
| +      return true;
 | 
| +    }
 | 
| +    return false;
 | 
| +  } else {
 | 
| +    ASSERT(number->IsHeapNumber());
 | 
| +    double value = HeapNumber::cast(number)->value();
 | 
| +    if (value >= 0 &&
 | 
| +        value <= std::numeric_limits<size_t>::max()) {
 | 
| +      *result = static_cast<size_t>(value);
 | 
| +      return true;
 | 
| +    } else {
 | 
| +      return false;
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +// Converts a number into size_t.
 | 
| +inline size_t NumberToSize(Isolate* isolate,
 | 
| +                           Object* number) {
 | 
| +  size_t result = 0;
 | 
| +  bool is_valid = TryNumberToSize(isolate, number, &result);
 | 
| +  CHECK(is_valid);
 | 
| +  return result;
 | 
| +}
 | 
| +
 | 
|  } }  // namespace v8::internal
 | 
|  
 | 
|  #endif  // V8_CONVERSIONS_H_
 | 
| 
 |