switch (value->type) {
case NJS_STRING:
num = njs_key_to_index(value);
- u32 = (uint32_t) num;
- if (njs_fast_path(u32 == num && (u32 < 0x80000000)
+ if (njs_fast_path(njs_number_is_atom_index(num, &u32)
&& !(num == 0 && signbit(num))))
{
value->atom_id = njs_number_atom(u32);
case NJS_NUMBER:
num = njs_number(value);
- u32 = (uint32_t) num;
- if (njs_fast_path(u32 == num && (u32 < 0x80000000))) {
+ if (njs_fast_path(njs_number_is_atom_index(num, &u32))) {
value->atom_id = njs_number_atom(u32);
} else {
}
+/*
+ * The range is tested before the conversion: converting a NaN or an out of
+ * range double to an unsigned integer is undefined.
+ */
+
+njs_inline njs_bool_t
+njs_number_is_atom_index(double num, uint32_t *index)
+{
+ if (njs_slow_path(!(num >= 0 && num < 0x80000000))) {
+ return 0;
+ }
+
+ *index = (uint32_t) num;
+
+ return (double) *index == num;
+}
+
+
njs_inline int64_t
njs_number_to_integer(double num)
{
if (value2->atom_id == NJS_ATOM_STRING_unknown) {
num = njs_number(value2);
- u32 = (uint32_t) num;
- if (njs_fast_path(u32 == num && (u32 < 0x80000000))) {
+ if (njs_fast_path(njs_number_is_atom_index(num, &u32))) {
value2->atom_id = njs_number_atom(u32);
} else {
if (value2->atom_id == NJS_ATOM_STRING_unknown) {
num = njs_number(value2);
- u32 = (uint32_t) num;
- if (njs_fast_path(u32 == num && (u32 < 0x80000000))) {
+ if (njs_fast_path(njs_number_is_atom_index(num, &u32))) {
value2->atom_id = njs_number_atom(u32);
} else {