diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp index 19ea0c718..258c3a8f0 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp @@ -594,7 +594,11 @@ ecma_builtin_helper_string_find_index (ecma_string_t *original_str_p, /**< index ecma_length_t index = start_pos; - lit_utf8_byte_t *original_str_curr_p = original_str_utf8_p + index; + lit_utf8_byte_t *original_str_curr_p = original_str_utf8_p; + for (ecma_length_t idx = 0; idx < index; idx++) + { + lit_utf8_incr (&original_str_curr_p); + } /* create utf8 string from search string */ MEM_DEFINE_LOCAL_ARRAY (search_str_utf8_p, diff --git a/tests/jerry/string-prototype-indexof.js b/tests/jerry/string-prototype-indexof.js index 28a0eb8e2..ab8d08ccb 100644 --- a/tests/jerry/string-prototype-indexof.js +++ b/tests/jerry/string-prototype-indexof.js @@ -43,13 +43,14 @@ assert("w2\uFFA2A".indexOf("A") === 3); assert("w2\u1D306A".indexOf("A") === 4); -// check surrogate pairs assert("\uD834\uDF06".indexOf("\uDF06") === 1); assert("\uD834\uDF06w2\u1D306D".indexOf("D") === 6); assert("\ud800\dc00".indexOf("\dc00") === 1); +assert("\u8000\u0700\u8000\u8000A".indexOf("A", 3) === 4); + // check prefix search assert("aaaabaaa".indexOf("aaaba") === 1); diff --git a/tests/jerry/string-prototype-lastindexof.js b/tests/jerry/string-prototype-lastindexof.js index 3f685f338..f25710fa5 100644 --- a/tests/jerry/string-prototype-lastindexof.js +++ b/tests/jerry/string-prototype-lastindexof.js @@ -39,6 +39,33 @@ assert("Hello welcome, welcome to the universe o.".lastIndexOf("o", 25) === 24); assert("Helloooo woooorld".lastIndexOf("oooo", 6) === 4); +// check utf8 strings +assert("\uFFA2".lastIndexOf("\uFFA2") === 0); + +assert("\uFFA2".lastIndexOf("A") === -1); + +assert("w2\uFFA2 A".lastIndexOf("A") === 4); + +assert("w2\u1D306A".indexOf("A") === 4); + +assert("\u0070A".lastIndexOf("A") === 1); + +assert("\u8000A".lastIndexOf("A") === 1); + +assert("\u0080\u0080\u0980\u1080A".lastIndexOf("A") === 4); + +assert("\u0080\u0980\u1080A\u0080\u0080\u0980\u1080".lastIndexOf("A", 4) === 3); + +assert("\u0080\u0080\u0980\u1080A\u0980AA\u0980A".lastIndexOf("A\u0980A") === 7); + +assert("\u0080\u0080\u0980\u1080A\u0980AA\u0980A".lastIndexOf("A\u0980A", 4) === 4); + +assert("\uD834\uDF06".lastIndexOf("\uDF06") === 1); + +assert("\uD834\uDF06w2\u1D306D\uDF06w2\u1D306D".lastIndexOf("D") === 12); + +assert("\ud800\dc00\ud800\dc00".lastIndexOf("\dc00") === 6); + // check empty string assert(String.prototype.lastIndexOf.call(new String()) === -1); @@ -75,7 +102,7 @@ assert("true".lastIndexOf(true, false) === 0); // check coercible - undefined try { - assert(String.prototype.lastIndexOf.call(undefined) === -1); + String.prototype.lastIndexOf.call(undefined); assert(false); } catch(e) { assert(e instanceof TypeError); @@ -83,7 +110,7 @@ try { // check coercible - null try { - assert(String.prototype.lastIndexOf.call(null, 0) === -1); + String.prototype.lastIndexOf.call(null); assert(false); } catch (e) { assert(e instanceof TypeError);