Jacek Caban : jscript: Added support for no new line between break and identifier rule.
Alexandre Julliard
julliard at winehq.org
Mon Sep 10 15:22:12 CDT 2012
Module: wine
Branch: master
Commit: dc2133cc66e12f8749e467909f5568d8d5054af2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dc2133cc66e12f8749e467909f5568d8d5054af2
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Sep 10 14:44:51 2012 +0200
jscript: Added support for no new line between break and identifier rule.
---
dlls/jscript/engine.h | 1 +
dlls/jscript/lex.c | 26 +++++++++++++++-----------
dlls/jscript/tests/lang.js | 17 +++++++++++++++++
3 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index d0dec0d..b3648af 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -28,6 +28,7 @@ typedef struct {
script_ctx_t *script;
source_elements_t *source;
BOOL nl;
+ BOOL implicit_nl_semicolon;
BOOL is_html;
BOOL lexer_error;
HRESULT hres;
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index d2b87ac..39a1197 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -68,8 +68,9 @@ static const WCHAR withW[] = {'w','i','t','h',0};
static const struct {
const WCHAR *word;
int token;
+ BOOL no_nl;
} keywords[] = {
- {breakW, kBREAK},
+ {breakW, kBREAK, TRUE},
{caseW, kCASE},
{catchW, kCATCH},
{continueW, kCONTINUE},
@@ -161,8 +162,10 @@ static int check_keywords(parser_ctx_t *ctx, const WCHAR **lval)
i = (min+max)/2;
r = check_keyword(ctx, keywords[i].word, lval);
- if(!r)
+ if(!r) {
+ ctx->implicit_nl_semicolon = keywords[i].no_nl;
return keywords[i].token;
+ }
if(r > 0)
min = i+1;
@@ -173,14 +176,6 @@ static int check_keywords(parser_ctx_t *ctx, const WCHAR **lval)
return 0;
}
-static void skip_spaces(parser_ctx_t *ctx)
-{
- while(ctx->ptr < ctx->end && isspaceW(*ctx->ptr)) {
- if(is_endline(*ctx->ptr++))
- ctx->nl = TRUE;
- }
-}
-
static BOOL skip_html_comment(parser_ctx_t *ctx)
{
const WCHAR html_commentW[] = {'<','!','-','-',0};
@@ -509,11 +504,20 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
static int next_token(parser_ctx_t *ctx, void *lval)
{
do {
- skip_spaces(ctx);
+ while(ctx->ptr < ctx->end && isspaceW(*ctx->ptr)) {
+ if(is_endline(*ctx->ptr++))
+ ctx->nl = TRUE;
+ }
if(ctx->ptr == ctx->end)
return tEOF;
}while(skip_comment(ctx) || skip_html_comment(ctx));
+ if(ctx->implicit_nl_semicolon) {
+ if(ctx->nl)
+ return ';';
+ ctx->implicit_nl_semicolon = FALSE;
+ }
+
if(isalphaW(*ctx->ptr)) {
int ret = check_keywords(ctx, lval);
if(ret)
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index cb127da..d7f6884 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1355,6 +1355,23 @@ ok(name_override_func === 3, "name_override_func = " + name_override_func);
function name_override_func() {};
ok(name_override_func === 3, "name_override_func = " + name_override_func);
+/* NoNewline rule parser tests */
+while(true) {
+ if(true) break
+ tmp = false
+}
+
+while(true) {
+ if(true) break /*
+ * no semicolon, but comment present */
+ tmp = false
+}
+
+while(true) {
+ if(true) break // no semicolon, but comment present
+ tmp = false
+}
+
/* Keep this test in the end of file */
undefined = 6;
ok(undefined === 6, "undefined = " + undefined);
More information about the wine-cvs
mailing list