jscript: Added regexp 'pre-parser' to support non-backslash-sequenced non-terminating '/' in characted classes.

This commit is contained in:
Jacek Caban 2012-04-20 11:08:08 +02:00 committed by Alexandre Julliard
parent a7137ef035
commit 4733fd0623
2 changed files with 27 additions and 5 deletions

View File

@ -957,6 +957,7 @@ int parser_lex(void *lval, parser_ctx_t *ctx)
literal_t *parse_regexp(parser_ctx_t *ctx)
{
const WCHAR *re, *flags_ptr;
BOOL in_class = FALSE;
DWORD re_len, flags;
literal_t *ret;
HRESULT hres;
@ -965,14 +966,29 @@ literal_t *parse_regexp(parser_ctx_t *ctx)
while(*--ctx->ptr != '/');
/* Simple regexp pre-parser; '/' if used in char class does not terminate regexp literal */
re = ++ctx->ptr;
while(ctx->ptr < ctx->end && *ctx->ptr != '/') {
if(*ctx->ptr++ == '\\' && ctx->ptr < ctx->end)
ctx->ptr++;
while(ctx->ptr < ctx->end) {
if(*ctx->ptr == '\\') {
if(++ctx->ptr == ctx->end)
break;
}else if(in_class) {
if(*ctx->ptr == '\n')
break;
if(*ctx->ptr == ']')
in_class = FALSE;
}else {
if(*ctx->ptr == '/')
break;
if(*ctx->ptr == '[')
in_class = TRUE;
}
ctx->ptr++;
}
if(ctx->ptr == ctx->end) {
WARN("unexpected end of file\n");
if(ctx->ptr == ctx->end || *ctx->ptr != '/') {
WARN("pre-parsing failed\n");
return NULL;
}

View File

@ -592,4 +592,10 @@ ok(tmp === "xxx", '"xxx".replace(/^\s*|\s*$/g, "y") = ' + tmp);
tmp = "xxx".replace(/^\s*|\s*$/g, "y");
ok(tmp === "yxxxy", '"xxx".replace(/^\s*|\s*$/g, "y") = ' + tmp);
tmp = "x/y".replace(/[/]/, "*");
ok(tmp === "x*y", '"x/y".replace(/[/]/, "*") = ' + tmp);
tmp = "x/y".replace(/[xy/]/g, "*");
ok(tmp === "***", '"x/y".replace(/[xy/]/, "*") = ' + tmp);
reportSuccess();