Module: wine Branch: master Commit: a822569db2ec0fab893af53d97a1331720cc3211 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a822569db2ec0fab893af53d97...
Author: Jacek Caban jacek@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) \