Jacek Caban : vbscript: Added support for exit property statement.

Alexandre Julliard julliard at winehq.org
Fri Sep 16 13:28:32 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep 16 13:28:29 2011 +0200

vbscript: Added support for exit property statement.

---

 dlls/vbscript/compile.c      |   22 +++++++++++++++++++++-
 dlls/vbscript/parse.h        |    1 +
 dlls/vbscript/parser.y       |    1 +
 dlls/vbscript/tests/lang.vbs |    6 ++++++
 4 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 6c30a40..1fc6612 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -40,6 +40,7 @@ typedef struct {
 
     unsigned sub_end_label;
     unsigned func_end_label;
+    unsigned prop_end_label;
 
     dim_decl_t *dim_decls;
     dynamic_var_t *global_vars;
@@ -585,6 +586,16 @@ static HRESULT compile_exitfunc_statement(compile_ctx_t *ctx)
     return push_instr_addr(ctx, OP_jmp, ctx->func_end_label);
 }
 
+static HRESULT compile_exitprop_statement(compile_ctx_t *ctx)
+{
+    if(ctx->prop_end_label == -1) {
+        FIXME("Exit Property outside Property?\n");
+        return E_FAIL;
+    }
+
+    return push_instr_addr(ctx, OP_jmp, ctx->prop_end_label);
+}
+
 static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
 {
     HRESULT hres;
@@ -603,6 +614,9 @@ static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat)
         case STAT_EXITFUNC:
             hres = compile_exitfunc_statement(ctx);
             break;
+        case STAT_EXITPROP:
+            hres = compile_exitprop_statement(ctx);
+            break;
         case STAT_EXITSUB:
             hres = compile_exitsub_statement(ctx);
             break;
@@ -654,6 +668,7 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
 
     ctx->sub_end_label = -1;
     ctx->func_end_label = -1;
+    ctx->prop_end_label = -1;
 
     switch(func->type) {
     case FUNC_FUNCTION:
@@ -669,7 +684,10 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
     case FUNC_PROPGET:
     case FUNC_PROPLET:
     case FUNC_PROPSET:
-        /* FIXME */
+        ctx->prop_end_label = alloc_label(ctx);
+        if(ctx->prop_end_label == -1)
+            return E_OUTOFMEMORY;
+        break;
     case FUNC_GLOBAL:
         break;
     }
@@ -685,6 +703,8 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
         label_set_addr(ctx, ctx->sub_end_label);
     if(ctx->func_end_label != -1)
         label_set_addr(ctx, ctx->func_end_label);
+    if(ctx->prop_end_label != -1)
+        label_set_addr(ctx, ctx->prop_end_label);
 
     if(push_instr(ctx, OP_ret) == -1)
         return E_OUTOFMEMORY;
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index 6227e0c..245badc 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -94,6 +94,7 @@ typedef enum {
     STAT_CALL,
     STAT_DIM,
     STAT_EXITFUNC,
+    STAT_EXITPROP,
     STAT_EXITSUB,
     STAT_FUNC,
     STAT_IF,
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index f67abd5..c345432 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -155,6 +155,7 @@ Statement
     | IfStatement                           { $$ = $1; }
     | FunctionDecl                          { $$ = new_function_statement(ctx, $1); CHECK_ERROR; }
     | tEXIT tFUNCTION                       { $$ = new_statement(ctx, STAT_EXITFUNC, 0); CHECK_ERROR; }
+    | tEXIT tPROPERTY                       { $$ = new_statement(ctx, STAT_EXITPROP, 0); CHECK_ERROR; }
     | tEXIT tSUB                            { $$ = new_statement(ctx, STAT_EXITSUB, 0); CHECK_ERROR; }
     | tSET MemberExpression Arguments_opt '=' Expression
                                             { $2->args = $3; $$ = new_set_statement(ctx, $2, $5); CHECK_ERROR; }
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 2a1bbb0..02d4438 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -402,6 +402,8 @@ Class TestClass
     Public Property Get gsProp()
         gsProp = privateProp
         funcCalled = "gsProp get"
+        exit property
+        Call ok(false, "exit property not returned?")
     End Property
 
     Public publicProp2
@@ -412,10 +414,14 @@ Class TestClass
     Public Property Let gsProp(val)
         privateProp = val
         funcCalled = "gsProp let"
+        exit property
+        Call ok(false, "exit property not returned?")
     End Property
 
     Public Property Set gsProp(val)
         funcCalled = "gsProp set"
+        exit property
+        Call ok(false, "exit property not returned?")
     End Property
 
     Public Sub setPrivateProp(x)




More information about the wine-cvs mailing list