Jacek Caban : vbscript: Allow assignment left expression to be member expression.
Alexandre Julliard
julliard at winehq.org
Thu Jan 30 16:10:25 CST 2020
Module: wine
Branch: master
Commit: c9941184016f3b21340a5112acb9aad2709e5196
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c9941184016f3b21340a5112acb9aad2709e5196
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jan 30 17:25:59 2020 +0100
vbscript: Allow assignment left expression to be member expression.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/compile.c | 28 +++++++++++++++++++++-------
dlls/vbscript/parse.h | 2 +-
dlls/vbscript/parser.y | 11 ++---------
3 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index e52d8b1a24..eac048daa1 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -993,15 +993,27 @@ static HRESULT compile_select_statement(compile_ctx_t *ctx, select_statement_t *
return S_OK;
}
-static HRESULT compile_assignment(compile_ctx_t *ctx, call_expression_t *left, expression_t *value_expr, BOOL is_set)
+static HRESULT compile_assignment(compile_ctx_t *ctx, expression_t *left, expression_t *value_expr, BOOL is_set)
{
+ call_expression_t *call_expr = NULL;
member_expression_t *member_expr;
- unsigned args_cnt;
+ unsigned args_cnt = 0;
vbsop_t op;
HRESULT hres;
- assert(left->call_expr->type == EXPR_MEMBER);
- member_expr = (member_expression_t*)left->call_expr;
+ switch(left->type) {
+ case EXPR_MEMBER:
+ member_expr = (member_expression_t*)left;
+ break;
+ case EXPR_CALL:
+ call_expr = (call_expression_t*)left;
+ assert(call_expr->call_expr->type == EXPR_MEMBER);
+ member_expr = (member_expression_t*)call_expr->call_expr;
+ break;
+ default:
+ assert(0);
+ return E_FAIL;
+ }
if(member_expr->obj_expr) {
hres = compile_expression(ctx, member_expr->obj_expr);
@@ -1017,9 +1029,11 @@ static HRESULT compile_assignment(compile_ctx_t *ctx, call_expression_t *left, e
if(FAILED(hres))
return hres;
- hres = compile_args(ctx, left->args, &args_cnt);
- if(FAILED(hres))
- return hres;
+ if(call_expr) {
+ hres = compile_args(ctx, call_expr->args, &args_cnt);
+ if(FAILED(hres))
+ return hres;
+ }
hres = push_instr_bstr_uint(ctx, op, member_expr->identifier, args_cnt);
if(FAILED(hres))
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h
index 568d8b9a42..ab81bb3ae4 100644
--- a/dlls/vbscript/parse.h
+++ b/dlls/vbscript/parse.h
@@ -145,7 +145,7 @@ typedef struct {
typedef struct {
statement_t stat;
- call_expression_t *left_expr;
+ expression_t *left_expr;
expression_t *value_expr;
} assign_statement_t;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 8ebfc82f00..39287bb7a6 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -763,16 +763,9 @@ static statement_t *new_assign_statement(parser_ctx_t *ctx, unsigned loc, expres
if(!stat)
return NULL;
+ stat->left_expr = left;
stat->value_expr = right;
- if(left->type == EXPR_CALL) {
- stat->left_expr = (call_expression_t*)left;
- }else {
- stat->left_expr = new_call_expression(ctx, left, NULL);
- if(!stat->left_expr)
- return NULL;
- }
-
return &stat->stat;
}
@@ -785,7 +778,7 @@ static statement_t *new_set_statement(parser_ctx_t *ctx, unsigned loc, member_ex
return NULL;
stat->value_expr = right;
- stat->left_expr = new_call_expression(ctx, &left->expr, arguments);
+ stat->left_expr = (expression_t*)new_call_expression(ctx, &left->expr, arguments);
if(!stat->left_expr)
return NULL;
More information about the wine-cvs
mailing list