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