details: http://hg.nginx.org/njs/rev/7d06ada396d7 branches: changeset: 646:7d06ada396d7 user: Valentin Bartenev <vb...@nginx.com> date: Fri Nov 09 18:22:01 2018 +0300 description: Fixed equality operator with object and string.
diffstat: njs/njs_vm.c | 25 ++++++++++++++++++++++--- njs/test/njs_unit_test.c | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diffs (81 lines): diff -r 025b22bf8c49 -r 7d06ada396d7 njs/njs_vm.c --- a/njs/njs_vm.c Thu Nov 08 20:32:45 2018 +0300 +++ b/njs/njs_vm.c Fri Nov 09 18:22:01 2018 +0300 @@ -1519,7 +1519,8 @@ njs_vmcode_not_equal(njs_vm_t *vm, njs_v static nxt_noinline njs_ret_t njs_values_equal(njs_vm_t *vm, const njs_value_t *val1, const njs_value_t *val2) { - nxt_bool_t nv1, nv2; + nxt_bool_t nv1, nv2; + const njs_value_t *hv, *lv; nv1 = njs_is_null_or_void(val1); nv2 = njs_is_null_or_void(val2); @@ -1543,11 +1544,29 @@ njs_values_equal(njs_vm_t *vm, const njs return (val1->data.u.object == val2->data.u.object); } - if (njs_is_object(val1) && njs_is_object(val2)) { + /* Sort values as: numeric < string < objects. */ + + if (val1->type > val2->type) { + hv = val1; + lv = val2; + + } else { + hv = val2; + lv = val1; + } + + /* If "lv" is an object then "hv" can only be another object. */ + if (njs_is_object(lv)) { return 0; } - return njs_trap(vm, NJS_TRAP_NUMBERS); + /* If "hv" is a string then "lv" can only be a numeric. */ + if (njs_is_string(hv)) { + return (lv->data.u.number == njs_string_to_number(hv, 0)); + } + + /* "hv" is an object and "lv" is either a string or a numeric. */ + return njs_trap(vm, NJS_TRAP_COMPARISON); } diff -r 025b22bf8c49 -r 7d06ada396d7 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Thu Nov 08 20:32:45 2018 +0300 +++ b/njs/test/njs_unit_test.c Fri Nov 09 18:22:01 2018 +0300 @@ -1142,6 +1142,15 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = Object; a == Object"), nxt_string("true") }, + { nxt_string("'1' == new Number(1)"), + nxt_string("true") }, + + { nxt_string("new String('abc') == 'abc'"), + nxt_string("true") }, + + { nxt_string("false == new String('0')"), + nxt_string("true") }, + { nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"), nxt_string("true") }, @@ -1151,6 +1160,16 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a = { valueOf: function() { return '5' } }; a == '5'"), nxt_string("true") }, + { nxt_string("var a = { valueOf: function() { return 5 } }; a == '5'"), + nxt_string("true") }, + + { nxt_string("var a = { toString: function() { return true } }; '1' == a"), + nxt_string("true") }, + + { nxt_string("var a = { valueOf: function() { return 'b' }," + " toString: function() { return 'a' } }; a == 'a'"), + nxt_string("false") }, + /* Comparisions. */ { nxt_string("1 < 2"), _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel