Module: wine Branch: master Commit: a6ee830fd249ee96176e62c5261ed6cc70107b55 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a6ee830fd249ee96176e62c526...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Sep 15 14:19:41 2011 +0200
vbscript: Added object member call implementation.
---
dlls/vbscript/compile.c | 7 ++++- dlls/vbscript/interp.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/vbscript/vbscript.h | 2 + 3 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 36bf04c..698ea8d 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -318,8 +318,11 @@ static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t return hres;
if(expr->obj_expr) { - FIXME("obj_expr not implemented\n"); - hres = E_NOTIMPL; + hres = compile_expression(ctx, expr->obj_expr); + if(FAILED(hres)) + return hres; + + hres = push_instr_bstr_uint(ctx, ret_val ? OP_mcall : OP_mcallv, expr->identifier, arg_cnt); }else { hres = push_instr_bstr_uint(ctx, ret_val ? OP_icall : OP_icallv, expr->identifier, arg_cnt); } diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index f8e0011..beacfe9 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -327,6 +327,57 @@ static HRESULT interp_icallv(exec_ctx_t *ctx) return do_icall(ctx, NULL); }
+static HRESULT do_mcall(exec_ctx_t *ctx, VARIANT *res) +{ + const BSTR identifier = ctx->instr->arg1.bstr; + const unsigned arg_cnt = ctx->instr->arg2.uint; + IDispatch *obj; + DISPPARAMS dp; + DISPID id; + HRESULT hres; + + hres = stack_pop_disp(ctx, &obj); + if(FAILED(hres)) + return hres; + + if(!obj) { + FIXME("NULL obj\n"); + return E_FAIL; + } + + vbstack_to_dp(ctx, arg_cnt, &dp); + + hres = disp_get_id(obj, identifier, &id); + if(SUCCEEDED(hres)) + hres = disp_call(ctx->script, obj, id, &dp, res); + IDispatch_Release(obj); + if(FAILED(hres)) + return hres; + + stack_popn(ctx, arg_cnt); + return S_OK; +} + +static HRESULT interp_mcall(exec_ctx_t *ctx) +{ + VARIANT res; + HRESULT hres; + + TRACE("\n"); + + hres = do_mcall(ctx, &res); + if(FAILED(hres)) + return hres; + + return stack_push(ctx, &res); +} + +static HRESULT interp_mcallv(exec_ctx_t *ctx) +{ + FIXME("\n"); + return E_NOTIMPL; +} + static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, VARIANT *val, BOOL own_val) { ref_t ref; diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 4c2d977..8defcd6 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -146,6 +146,8 @@ typedef enum { X(jmp, 0, ARG_ADDR, 0) \ X(jmp_false, 0, ARG_ADDR, 0) \ X(long, 1, ARG_INT, 0) \ + X(mcall, 1, ARG_BSTR, ARG_UINT) \ + X(mcallv, 1, ARG_BSTR, ARG_UINT) \ X(mod, 1, 0, 0) \ X(mul, 1, 0, 0) \ X(neg, 1, 0, 0) \