diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 6c30a40a4a5..1fc66128757 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 6227e0c465d..245badc2ba7 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 f67abd5ceab..c3454322953 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 2a1bbb07157..02d443809c0 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)