njs_value_t *string, int64_t pos, njs_value_t *captures, int64_t ncaptures,
njs_value_t *groups, njs_value_t *replacement, njs_value_t *retval)
{
- int64_t tail, n;
- u_char c, c2, *p, *r, *end;
- njs_str_t rep, m, str, cap;
- njs_int_t ret;
- njs_chb_t chain;
- njs_value_t name, value;
+ u_char c, c2, *p, *r, *end;
+ size_t length;
+ int64_t tail, n;
+ njs_str_t rep, str, cap;
+ njs_int_t ret;
+ njs_chb_t chain;
+ njs_value_t name, value;
+ njs_string_prop_t s, m;
njs_string_get(replacement, &rep);
p = rep.start;
break;
case '&':
- njs_string_get(matched, &m);
- njs_chb_append_str(&chain, &m);
+ (void) njs_string_prop(&m, matched);
+ njs_chb_append(&chain, m.start, m.size);
p += 2;
break;
case '`':
- njs_string_get(string, &str);
- njs_chb_append(&chain, str.start, pos);
+ (void) njs_string_prop(&s, string);
+ n = njs_string_offset(&s, pos) - s.start;
+ njs_chb_append(&chain, s.start, n);
p += 2;
break;
case '\'':
- njs_string_get(matched, &m);
- tail = pos + m.length;
+ length = njs_string_prop(&m, matched);
+ (void) njs_string_prop(&s, string);
+
+ tail = njs_string_offset(&s, pos + length) - s.start;
- njs_string_get(string, &str);
- njs_chb_append(&chain, &str.start[tail],
- njs_max((int64_t) str.length - tail, 0));
+ njs_chb_append(&chain, &s.start[tail],
+ njs_max((int64_t) s.size - tail, 0));
p += 2;
break;
{ njs_str("'abcdbe'.replaceAll('b', '|$`X$\\'|')"),
njs_str("a|aXcdbe|cd|abcdXe|e") },
+ { njs_str("var r = 'αβγ'.replace('β', \"$'\"); [r, r.length]"),
+ njs_str("αγγ,3") },
+
+ { njs_str("var r = 'αβγαβγ'.replaceAll('β', \"$'\"); [r, r.length]"),
+ njs_str("αγαβγγαγγ,9") },
+
+ { njs_str("var r = 'αβγ'.replace('β', \"$`\"); [r, r.length]"),
+ njs_str("ααγ,3") },
+
+ { njs_str("var r = 'αβγαβγ'.replaceAll('β', \"$`\"); [r, r.length]"),
+ njs_str("ααγααβγαγ,9") },
{ njs_str("'ABC'.replace('B', '$<g>')"),
njs_str("A$<g>C") },