From a7cff6fec3c4e8051c2249ca8948025a4990d6f8 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 27 Aug 2018 16:06:33 +0300 Subject: [PATCH] Fixed toString() for -0. --- njs/njs_vm.c | 12 +++++++++++- njs/njs_vm.h | 1 + njs/test/njs_unit_test.c | 6 ++++++ nxt/nxt_dtoa.c | 12 ++++++------ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/njs/njs_vm.c b/njs/njs_vm.c index e60a5bb7..a63378a6 100644 --- a/njs/njs_vm.c +++ b/njs/njs_vm.c @@ -88,6 +88,7 @@ const njs_value_t njs_string_boolean = njs_string("boolean"); const njs_value_t njs_string_false = njs_string("false"); const njs_value_t njs_string_true = njs_string("true"); const njs_value_t njs_string_number = njs_string("number"); +const njs_value_t njs_string_minus_zero = njs_string("-0"); const njs_value_t njs_string_minus_infinity = njs_string("-Infinity"); const njs_value_t njs_string_plus_infinity = @@ -3310,7 +3311,16 @@ again: } } - ret = njs_primitive_value_to_string(vm, &value, &value); + if (nxt_slow_path((value.type == NJS_NUMBER + && value.data.u.number == 0 + && signbit(value.data.u.number)))) + { + value = njs_string_minus_zero; + ret = NXT_OK; + + } else { + ret = njs_primitive_value_to_string(vm, &value, &value); + } if (nxt_fast_path(ret == NXT_OK)) { size = value.short_string.size; diff --git a/njs/njs_vm.h b/njs/njs_vm.h index ea961988..ee256598 100644 --- a/njs/njs_vm.h +++ b/njs/njs_vm.h @@ -1269,6 +1269,7 @@ extern const njs_value_t njs_string_null; extern const njs_value_t njs_string_false; extern const njs_value_t njs_string_true; extern const njs_value_t njs_string_native; +extern const njs_value_t njs_string_minus_zero; extern const njs_value_t njs_string_minus_infinity; extern const njs_value_t njs_string_plus_infinity; extern const njs_value_t njs_string_nan; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 38c4fd6a..a42f0d75 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -420,6 +420,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("1 + 1 + '2' + 1 + 1"), nxt_string("2211") }, + { nxt_string("'gg' + -0"), + nxt_string("gg0") }, + { nxt_string("1.2 - '5.7'"), nxt_string("-4.5") }, @@ -8976,6 +8979,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("JSON.stringify(123)"), nxt_string("123") }, + { nxt_string("JSON.stringify(-0)"), + nxt_string("0") }, + { nxt_string("JSON.stringify(0.00000123)"), nxt_string("0.00000123") }, diff --git a/nxt/nxt_dtoa.c b/nxt/nxt_dtoa.c index 6453f87f..20ea2ebe 100644 --- a/nxt/nxt_dtoa.c +++ b/nxt/nxt_dtoa.c @@ -346,18 +346,18 @@ nxt_dtoa(double value, char *start) minus = 0; p = start; - if (signbit(value)) { - *p++ = '-'; - value = -value; - minus = 1; - } - if (value == 0) { *p++ = '0'; return (p - start); } + if (signbit(value)) { + *p++ = '-'; + value = -value; + minus = 1; + } + length = nxt_grisu2(value, p, &dec_exp); length = nxt_prettify(p, length, dec_exp); -- 2.47.3