#include <assert.h>
#include <string.h> // memcpy
-#include <float.h> // float limits
-#include <math.h> // infinity
-
-// Windows does not define INFINITY in math.h
-// Copy V8's approach and use HUGE_VAL instead
-#ifndef INFINITY
-# ifdef HUGE_VALF
-# define INFINITY HUGE_VALF
-# else
-
-// MSVC. No INFINITY, no HUGE_VALF
-// There's HUGE_VAL, but that's a double, not a float.
-// Assign the bytes and float-ify it.
-
-typedef union { unsigned char __c[4]; float __f; } __huge_valf_t;
-# if __BYTE_ORDER == __BIG_ENDIAN
-# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
-# endif
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f }
-# endif
-static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
-# define INFINITY (__huge_valf.__f)
-
-# endif
-#endif
#define MIN(a,b) ((a) < (b) ? (a) : (b))
}
-inline bool OutOfRangeCheck(float val, double val_tmp) {
- if ((val_tmp > 0 && (val_tmp > FLT_MAX || val_tmp < FLT_MIN)
- && val_tmp != INFINITY) ||
- ((val_tmp < 0 && (val_tmp < -FLT_MAX || val_tmp > -FLT_MIN)
- && val_tmp != -INFINITY)))
- return true;
- return false;
-}
-
-
template <typename T, bool ENDIANNESS>
Handle<Value> ReadFloatGeneric(const Arguments& args) {
double offset_tmp = args[0]->NumberValue();
if (doAssert) {
if (!args[0]->IsNumber())
return ThrowTypeError("value not a number");
+ if (!args[1]->IsUint32())
+ return ThrowTypeError("offset is not uint");
}
- double val_tmp = args[0]->NumberValue();
- T val = static_cast<T>(val_tmp);
- double offset_tmp = args[1]->NumberValue();
- int64_t offset = static_cast<int64_t>(offset_tmp);
+ T val = static_cast<T>(args[0]->NumberValue());
+ size_t offset = args[1]->Uint32Value();
char* data = static_cast<char*>(
args.This()->GetIndexedPropertiesExternalArrayData());
char* ptr = data + offset;
if (doAssert) {
- if (offset_tmp != offset || offset < 0)
- return ThrowTypeError("offset is not uint");
- if (sizeof(T) == 4 && OutOfRangeCheck(val, val_tmp))
- return ThrowRangeError("value is out of type range");
size_t len = static_cast<size_t>(
args.This()->GetIndexedPropertiesExternalArrayDataLength());
- if (offset + sizeof(T) > len)
+ if (offset + sizeof(T) > len || offset + sizeof(T) < offset)
return ThrowRangeError("Trying to write beyond buffer length");
}