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