From: Dmitry Volyntsev Date: Fri, 17 May 2019 14:52:30 +0000 (+0300) Subject: Fixed Array.prototype.slice() for UTF8-invalid byte strings. X-Git-Tag: 0.3.2~5 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=57737895f44ddfba288465f9d021defcedbda393;p=njs.git Fixed Array.prototype.slice() for UTF8-invalid byte strings. This closes #160 issue on Github. --- diff --git a/njs/njs_array.c b/njs/njs_array.c index 514035ec..0659a46c 100644 --- a/njs/njs_array.c +++ b/njs/njs_array.c @@ -577,7 +577,7 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this, { size_t size; u_char *dst; - uint32_t n, len; + uint32_t n; njs_ret_t ret; njs_array_t *array; njs_value_t *value, name; @@ -623,23 +623,28 @@ njs_array_prototype_slice_copy(njs_vm_t *vm, njs_value_t *this, if (string.length == 0) { /* Byte string. */ - len = 0; + do { + value = &array->start[n++]; + dst = njs_string_short_start(value); + *dst = *src++; + njs_string_short_set(value, 1, 0); + + length--; + } while (length != 0); } else { /* UTF-8 or ASCII string. */ - len = 1; + do { + value = &array->start[n++]; + dst = njs_string_short_start(value); + dst = nxt_utf8_copy(dst, &src, end); + size = dst - njs_string_short_start(value); + njs_string_short_set(value, size, 1); + + length--; + } while (length != 0); } - do { - value = &array->start[n++]; - dst = njs_string_short_start(value); - dst = nxt_utf8_copy(dst, &src, end); - size = dst - njs_string_short_start(value); - njs_string_short_set(value, size, len); - - length--; - } while (length != 0); - } else if (njs_is_object(this)) { do { diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 8f1411a5..72ef4ac8 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -3657,6 +3657,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("Array.prototype.slice.call('αβZγ')"), nxt_string("α,β,Z,γ") }, + { nxt_string("Array.prototype.slice.call(String.bytesFrom(Array(16).fill(0x9d)))[0].charCodeAt(0)"), + nxt_string("157") }, + { nxt_string("Array.prototype.slice.call('αβZγ', 1)"), nxt_string("β,Z,γ") },