Jacek Caban : vbscipt: Added object member assign parser/ compiler implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 13 12:18:09 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep 13 11:35:33 2011 +0200

vbscipt: Added object member assign parser/compiler implementation.

---

 dlls/vbscript/compile.c  |    7 +++++--
 dlls/vbscript/interp.c   |    6 ++++++
 dlls/vbscript/parser.y   |    4 ++--
 dlls/vbscript/vbscript.h |    1 +
 4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 8cc55c7..877780d 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -303,8 +303,11 @@ static HRESULT compile_assign_statement(compile_ctx_t *ctx, assign_statement_t *
     }
 
     if(stat->member_expr->obj_expr) {
-        FIXME("obj_expr not implemented\n");
-        hres = E_NOTIMPL;
+        hres = compile_expression(ctx, stat->member_expr->obj_expr);
+        if(FAILED(hres))
+            return hres;
+
+        hres = push_instr_bstr(ctx, OP_assign_member, stat->member_expr->identifier);
     }else {
         hres = push_instr_bstr(ctx, OP_assign_ident, stat->member_expr->identifier);
     }
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 4099642..3212935 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -257,6 +257,12 @@ static HRESULT interp_assign_ident(exec_ctx_t *ctx)
     return assign_ident(ctx, arg, v.v, v.owned);
 }
 
+static HRESULT interp_assign_member(exec_ctx_t *ctx)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
 static HRESULT interp_ret(exec_ctx_t *ctx)
 {
     TRACE("\n");
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 0d56acd..5d9ae7d 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -113,8 +113,8 @@ Statement
                                             { $1->args = $2; $$ = new_assign_statement(ctx, $1, $4); CHECK_ERROR; }
 
 MemberExpression
-    : tIdentifier                   { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; }
-    /* FIXME: MemberExpressionArgs '.' tIdentifier */
+    : tIdentifier                           { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; }
+    | CallExpression '.' tIdentifier        { $$ = new_member_expression(ctx, $1, $3); CHECK_ERROR; }
 
 Arguments_opt
     : EmptyBrackets_opt             { $$ = NULL; }
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 49b2cfa..6367c12 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -91,6 +91,7 @@ typedef enum {
 #define OP_LIST                                   \
     X(add,            1, 0,           0)          \
     X(assign_ident,   1, ARG_BSTR,    0)          \
+    X(assign_member,  1, ARG_BSTR,    0)          \
     X(bool,           1, ARG_INT,     0)          \
     X(concat,         1, 0,           0)          \
     X(double,         1, ARG_DOUBLE,  0)          \




More information about the wine-cvs mailing list