Jacek Caban : vbscript: Added support for do.. loop statement without an expression.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 14:04:29 CDT 2012


Module: wine
Branch: master
Commit: 5a2b3e0de64bdebf71400ed70eccf06758f29adb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5a2b3e0de64bdebf71400ed70eccf06758f29adb

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep 18 12:25:42 2012 +0200

vbscript: Added support for do..loop statement without an expression.

---

 dlls/vbscript/compile.c      |   15 +++++++++++----
 dlls/vbscript/parser.y       |    1 +
 dlls/vbscript/tests/lang.vbs |    7 +++++++
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 89e290d..327d97b 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -625,6 +625,7 @@ static HRESULT compile_dowhile_statement(compile_ctx_t *ctx, while_statement_t *
 {
     statement_ctx_t loop_ctx = {0};
     unsigned start_addr;
+    vbsop_t jmp_op;
     HRESULT hres;
 
     start_addr = ctx->instr_cnt;
@@ -636,11 +637,17 @@ static HRESULT compile_dowhile_statement(compile_ctx_t *ctx, while_statement_t *
     if(FAILED(hres))
         return hres;
 
-    hres = compile_expression(ctx, stat->expr);
-    if(FAILED(hres))
-        return hres;
+    if(stat->expr) {
+        hres = compile_expression(ctx, stat->expr);
+        if(FAILED(hres))
+            return hres;
+
+        jmp_op = stat->stat.type == STAT_DOUNTIL ? OP_jmp_false : OP_jmp_true;
+    }else {
+        jmp_op = OP_jmp;
+    }
 
-    hres = push_instr_addr(ctx, stat->stat.type == STAT_DOUNTIL ? OP_jmp_false : OP_jmp_true, start_addr);
+    hres = push_instr_addr(ctx, jmp_op, start_addr);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index d5a9934..3f86b04 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -185,6 +185,7 @@ SimpleStatement
     | tDO tNL StatementsNl_opt tLOOP DoType Expression
                                             { $$ = new_while_statement(ctx, $5 ? STAT_DOWHILE : STAT_DOUNTIL, $6, $3);
                                               CHECK_ERROR; }
+    | tDO tNL StatementsNl_opt tLOOP        { $$ = new_while_statement(ctx, STAT_DOWHILE, NULL, $3); CHECK_ERROR; }
     | FunctionDecl                          { $$ = new_function_statement(ctx, $1); CHECK_ERROR; }
     | tEXIT tDO                             { $$ = new_statement(ctx, STAT_EXITDO, 0); CHECK_ERROR; }
     | tEXIT tFOR                            { $$ = new_statement(ctx, STAT_EXITFOR, 0); CHECK_ERROR; }
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index fd93df6..76f4003 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -346,6 +346,13 @@ do until false
 loop
 
 x = false
+do
+    if x then exit do
+    x = true
+loop
+call ok(x, "x is false after do..loop?")
+
+x = false
 y = false
 do
     if x then




More information about the wine-cvs mailing list