static njs_ret_t njs_number_to_string_radix(njs_vm_t *vm, njs_value_t *string,
- const njs_value_t *number, uint32_t radix);
+ double number, uint32_t radix);
double
njs_number_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
nxt_uint_t nargs, njs_index_t unused)
{
- double radix;
+ double number, radix;
njs_value_t *value;
value = &args[0];
}
}
- if (nargs == 1 || args[1].data.u.number == 10) {
- return njs_number_to_string(vm, &vm->retval, value);
- }
+ if (nargs > 1) {
+ radix = args[1].data.u.number;
+
+ if (radix < 2 || radix > 36 || radix != (int) radix) {
+ vm->exception = &njs_exception_range_error;
+ return NXT_ERROR;
+ }
- radix = args[1].data.u.number;
+ number = value->data.u.number;
- if (radix < 2 || radix > 36 || radix != (int) radix) {
- vm->exception = &njs_exception_range_error;
- return NXT_ERROR;
+ if (radix != 10 && !isnan(number) && !isinf(number)) {
+ return njs_number_to_string_radix(vm, &vm->retval, number, radix);
+ }
}
- return njs_number_to_string_radix(vm, &vm->retval, value, radix);
+ return njs_number_to_string(vm, &vm->retval, value);
}
static njs_ret_t
njs_number_to_string_radix(njs_vm_t *vm, njs_value_t *string,
- const njs_value_t *number, uint32_t radix)
+ double number, uint32_t radix)
{
u_char *p, *f, *end;
double n, next;
end = buf + NJS_STRING_RADIX_LEN;
p = buf + NJS_STRING_RADIX_INTERGRAL_LEN;
- n = number->data.u.number;
+ n = number;
if (n < 0) {
n = -n;
n = next;
} while (n != 0);
- n = number->data.u.number;
+ n = number;
if (n < 0) {
*(--p) = '-';
{ nxt_string("1845449130881..toString(36)"),
nxt_string("njscript") },
+ { nxt_string("Infinity.toString()"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Infinity.toString(2)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Infinity.toString(10)"),
+ nxt_string("Infinity") },
+
+ { nxt_string("Infinity.toString(NaN)"),
+ nxt_string("RangeError") },
+
+ { nxt_string("Infinity.toString({})"),
+ nxt_string("RangeError") },
+
+ { nxt_string("Infinity.toString(Infinity)"),
+ nxt_string("RangeError") },
+
+ { nxt_string("NaN.toString()"),
+ nxt_string("NaN") },
+
+ { nxt_string("NaN.toString(2)"),
+ nxt_string("NaN") },
+
+ { nxt_string("NaN.toString(10)"),
+ nxt_string("NaN") },
+
+ { nxt_string("NaN.toString(Infinity)"),
+ nxt_string("RangeError") },
+
+ { nxt_string("NaN.toString({})"),
+ nxt_string("RangeError") },
+
+ { nxt_string("NaN.toString(NaN)"),
+ nxt_string("RangeError") },
+
/* An object "valueOf/toString" methods. */
{ nxt_string("var a = { valueOf: function() { return 1 } }; +a"),