Add handling for RegExp unicode and sticky flags (#3341)

JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai@inf.u-szeged.hu
This commit is contained in:
Dániel Bátyai
2019-11-22 14:04:03 +01:00
committed by Zoltan Herczeg
parent fc2218e828
commit 279d4d4119
10 changed files with 310 additions and 47 deletions
+26 -18
View File
@@ -66,54 +66,62 @@ ecma_regexp_parse_flags (ecma_string_t *flags_str_p, /**< Input string with flag
uint16_t *flags_p) /**< [out] parsed flag bits */
{
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
uint16_t result_flags = RE_FLAG_EMPTY;
ECMA_STRING_TO_UTF8_STRING (flags_str_p, flags_start_p, flags_start_size);
const lit_utf8_byte_t *flags_str_curr_p = flags_start_p;
const lit_utf8_byte_t *flags_str_end_p = flags_start_p + flags_start_size;
while (flags_str_curr_p < flags_str_end_p
&& ecma_is_value_empty (ret_value))
while (flags_str_curr_p < flags_str_end_p)
{
ecma_regexp_flags_t flag;
switch (*flags_str_curr_p++)
{
case 'g':
{
if (*flags_p & RE_FLAG_GLOBAL)
{
ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp flags."));
}
*flags_p |= RE_FLAG_GLOBAL;
flag = RE_FLAG_GLOBAL;
break;
}
case 'i':
{
if (*flags_p & RE_FLAG_IGNORE_CASE)
{
ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp flags."));
}
*flags_p |= RE_FLAG_IGNORE_CASE;
flag = RE_FLAG_IGNORE_CASE;
break;
}
case 'm':
{
if (*flags_p & RE_FLAG_MULTILINE)
{
ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp flags."));
}
*flags_p |= RE_FLAG_MULTILINE;
flag = RE_FLAG_MULTILINE;
break;
}
case 'y':
{
flag = RE_FLAG_STICKY;
break;
}
case 'u':
{
flag = RE_FLAG_UNICODE;
break;
}
default:
{
ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp flags."));
flag = RE_FLAG_EMPTY;
break;
}
}
if (flag == RE_FLAG_EMPTY || (result_flags & flag) != 0)
{
ret_value = ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp flags."));
break;
}
result_flags = (uint16_t) (result_flags | flag);
}
ECMA_FINALIZE_UTF8_STRING (flags_start_p, flags_start_size);
*flags_p = result_flags;
return ret_value;
} /* ecma_regexp_parse_flags */
@@ -38,7 +38,9 @@ typedef enum
RE_FLAG_EMPTY = 0u, /* Empty RegExp flags */
RE_FLAG_GLOBAL = (1u << 1), /**< ECMA-262 v5, 15.10.7.2 */
RE_FLAG_IGNORE_CASE = (1u << 2), /**< ECMA-262 v5, 15.10.7.3 */
RE_FLAG_MULTILINE = (1u << 3) /**< ECMA-262 v5, 15.10.7.4 */
RE_FLAG_MULTILINE = (1u << 3), /**< ECMA-262 v5, 15.10.7.4 */
RE_FLAG_STICKY = (1u << 4), /**< ECMA-262 v6, 21.2.5.12 */
RE_FLAG_UNICODE = (1u << 5) /**< ECMA-262 v6, 21.2.5.15 */
} ecma_regexp_flags_t;
/**