(void) njs_string_prop(&string, &args[0]);
+ /* Byte string. */
utf8 = 0;
n = 0;
if (string.length != 0) {
+ /* ASCII string. */
utf8 = 1;
n = 1;
if (string.length != string.size) {
+ /* UTF-8 string. */
utf8 = 2;
}
}
if (pattern->code[n] != NULL) {
array = NULL;
- if (n != 0) {
- utf8 = 2;
-
- } else if (string.length != 0) {
- utf8 = 1;
-
- } else {
- utf8 = 1;
- }
-
do {
ret = pcre_exec(pattern->code[n], pattern->extra[n],
(char *) string.start, string.size,
case 0:
length = 0;
break;
+
case 1:
length = size;
break;
+
default:
length = nxt_utf8_length(start, size);
+ if (nxt_slow_path(length < 0)) {
+ goto error;
+ }
+
break;
}
break;
} else {
- vm->exception = &njs_exception_internal_error;
- return NXT_ERROR;
+ goto error;
}
} while (string.size > 0);
return NXT_OK;
+error:
+
+ vm->exception = &njs_exception_internal_error;
+
+ return NXT_ERROR;
+
empty:
array = njs_array_alloc(vm, 1, 0);
{ nxt_string("'abc ABC aBc'.match(/abc/ig)"),
nxt_string("abc,ABC,aBc") },
+ { nxt_string("var a = 'α'.match(/α/g)[0] + 'α';"
+ "a +' '+ a.length"),
+ nxt_string("αα 2") },
+
+ { nxt_string("var a = '\\u00CE\\u00B1'.toBytes().match(/α/g)[0] + 'α';"
+ "a +' '+ a.length"),
+ nxt_string("αα 4") },
+
/* Functions. */
{ nxt_string("function f() { } f()"),