Jacek Caban : vbscript: Support non-member calls in compiler.
Alexandre Julliard
julliard at winehq.org
Mon Oct 28 16:43:36 CDT 2019
Module: wine
Branch: master
Commit: 25248362ea670fa077d7f41af9bb67622bd8430f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=25248362ea670fa077d7f41af9bb67622bd8430f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Oct 28 18:40:18 2019 +0100
vbscript: Support non-member calls in compiler.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vbscript/compile.c | 13 +++++++++----
dlls/vbscript/interp.c | 12 ++++++++++++
dlls/vbscript/vbscript.h | 4 +++-
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 8309e5819c..0cbdae6e19 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -453,17 +453,22 @@ static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t
static HRESULT compile_call_expression(compile_ctx_t *ctx, call_expression_t *expr, BOOL ret_val)
{
unsigned arg_cnt = 0;
+ expression_t *call;
HRESULT hres;
hres = compile_args(ctx, expr->args, &arg_cnt);
if(FAILED(hres))
return hres;
- if(expr->call_expr->type == EXPR_MEMBER)
- return compile_member_expression(ctx, (member_expression_t*)expr->call_expr, arg_cnt, ret_val);
+ call = expr->call_expr;
+ if(call->type == EXPR_MEMBER)
+ return compile_member_expression(ctx, (member_expression_t*)call, arg_cnt, ret_val);
- FIXME("non-member call expression\n");
- return E_NOTIMPL;
+ hres = compile_expression(ctx, call);
+ if(FAILED(hres))
+ return hres;
+
+ return push_instr_uint(ctx, ret_val ? OP_vcall : OP_vcallv, arg_cnt);
}
static HRESULT compile_unary_expression(compile_ctx_t *ctx, unary_expression_t *expr, vbsop_t op)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index fee3e72959..d8ed679788 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -635,6 +635,18 @@ static HRESULT interp_icallv(exec_ctx_t *ctx)
return do_icall(ctx, NULL);
}
+static HRESULT interp_vcall(exec_ctx_t *ctx)
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT interp_vcallv(exec_ctx_t *ctx)
+{
+ FIXME("\n");
+ return E_NOTIMPL;
+}
+
static HRESULT do_mcall(exec_ctx_t *ctx, VARIANT *res)
{
const BSTR identifier = ctx->instr->arg1.bstr;
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 71f42aaff9..0382a80290 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -220,7 +220,7 @@ typedef enum {
X(assign_ident, 1, ARG_BSTR, ARG_UINT) \
X(assign_member, 1, ARG_BSTR, ARG_UINT) \
X(bool, 1, ARG_INT, 0) \
- X(catch, 1, ARG_ADDR, ARG_UINT) \
+ X(catch, 1, ARG_ADDR, ARG_UINT) \
X(case, 0, ARG_ADDR, 0) \
X(concat, 1, 0, 0) \
X(const, 1, ARG_BSTR, 0) \
@@ -271,6 +271,8 @@ typedef enum {
X(string, 1, ARG_STR, 0) \
X(sub, 1, 0, 0) \
X(val, 1, 0, 0) \
+ X(vcall, 1, ARG_UINT, 0) \
+ X(vcallv, 1, ARG_UINT, 0) \
X(xor, 1, 0, 0)
typedef enum {
More information about the wine-cvs
mailing list