Jacek Caban : jscript: Fixed parsing regexps starting with '='.
Alexandre Julliard
julliard at winehq.org
Thu Aug 27 10:31:19 CDT 2009
Module: wine
Branch: master
Commit: 05b104c6a3d0193302b8e2cd0c00d54090dade5b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=05b104c6a3d0193302b8e2cd0c00d54090dade5b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 27 01:20:37 2009 +0200
jscript: Fixed parsing regexps starting with '='.
---
dlls/jscript/lex.c | 7 +++++--
dlls/jscript/parser.y | 13 ++++++++++---
dlls/jscript/tests/lang.js | 3 +++
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 1b33737..680ce55 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -735,7 +735,7 @@ int parser_lex(void *lval, parser_ctx_t *ctx)
if(*ctx->ptr == '=') { /* /= */
ctx->ptr++;
*(int*)lval = EXPR_ASSIGNDIV;
- return tAssignOper;
+ return kDIVEQ;
}
}
return '/';
@@ -772,7 +772,10 @@ literal_t *parse_regexp(parser_ctx_t *ctx)
TRACE("\n");
- re = ctx->ptr;
+ while(*ctx->ptr != '/')
+ ctx->ptr--;
+
+ re = ++ctx->ptr;
while(ctx->ptr < ctx->end && *ctx->ptr != '/') {
if(*ctx->ptr++ == '\\' && ctx->ptr < ctx->end)
ctx->ptr++;
diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y
index 29d805f..7e74880 100644
--- a/dlls/jscript/parser.y
+++ b/dlls/jscript/parser.y
@@ -172,7 +172,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
/* keywords */
%token kBREAK kCASE kCATCH kCONTINUE kDEFAULT kDELETE kDO kELSE kIF kFINALLY kFOR kIN
%token kINSTANCEOF kNEW kNULL kUNDEFINED kRETURN kSWITCH kTHIS kTHROW kTRUE kFALSE kTRY kTYPEOF kVAR kVOID kWHILE kWITH
-%token tANDAND tOROR tINC tDEC tHTMLCOMMENT
+%token tANDAND tOROR tINC tDEC tHTMLCOMMENT kDIVEQ
%token <srcptr> kFUNCTION '}'
@@ -245,6 +245,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
%type <literal> PropertyName
%type <literal> BooleanLiteral
%type <srcptr> KFunction
+%type <ival> AssignOper
%nonassoc LOWER_THAN_ELSE
%nonassoc kELSE
@@ -515,12 +516,16 @@ ExpressionNoIn
| ExpressionNoIn ',' AssignmentExpressionNoIn
{ $$ = new_binary_expression(ctx, EXPR_COMMA, $1, $3); }
+AssignOper
+ : tAssignOper { $$ = $1; }
+ | kDIVEQ { $$ = EXPR_ASSIGNDIV; }
+
/* ECMA-262 3rd Edition 11.13 */
AssignmentExpression
: ConditionalExpression { $$ = $1; }
| LeftHandSideExpression '=' AssignmentExpression
{ $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); }
- | LeftHandSideExpression tAssignOper AssignmentExpression
+ | LeftHandSideExpression AssignOper AssignmentExpression
{ $$ = new_binary_expression(ctx, $2, $1, $3); }
/* ECMA-262 3rd Edition 11.13 */
@@ -529,7 +534,7 @@ AssignmentExpressionNoIn
{ $$ = $1; }
| LeftHandSideExpression '=' AssignmentExpressionNoIn
{ $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); }
- | LeftHandSideExpression tAssignOper AssignmentExpressionNoIn
+ | LeftHandSideExpression AssignOper AssignmentExpressionNoIn
{ $$ = new_binary_expression(ctx, $2, $1, $3); }
/* ECMA-262 3rd Edition 11.12 */
@@ -800,6 +805,8 @@ Literal
| tStringLiteral { $$ = new_string_literal(ctx, $1); }
| '/' { $$ = parse_regexp(ctx);
if(!$$) YYABORT; }
+ | kDIVEQ { $$ = parse_regexp(ctx);
+ if(!$$) YYABORT; }
/* ECMA-262 3rd Edition 7.8.2 */
BooleanLiteral
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index fa100ea..fd14c93 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -896,6 +896,9 @@ ok(""+str === "test", "''+str = " + str);
ok((function (){return 1;})() === 1, "(function (){return 1;})() = " + (function (){return 1;})());
+var re = /=(\?|%3F)/g;
+ok(re.source === "=(\\?|%3F)", "re.source = " + re.source);
+
ok(createNullBSTR() === '', "createNullBSTR() !== ''");
function do_test() {}
More information about the wine-cvs
mailing list