From 2613f8bfe688d42acd8c320e21a3e95fab347b0b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 8 Oct 2021 19:13:59 +0200 Subject: [PATCH] vbscript: Use a dedicated opcode for identifier expressions. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/vbscript/compile.c | 21 ++++++++++++++++++--- dlls/vbscript/interp.c | 29 ++++++++++++++++++++++++----- dlls/vbscript/vbscript.h | 1 + 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index 821d85310b6..da56eac74b2 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -446,7 +446,8 @@ static HRESULT compile_args(compile_ctx_t *ctx, expression_t *args, unsigned *re return S_OK; } -static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t *expr, unsigned arg_cnt, BOOL ret_val) +static HRESULT compile_member_call_expression(compile_ctx_t *ctx, member_expression_t *expr, + unsigned arg_cnt, BOOL ret_val) { HRESULT hres; @@ -471,6 +472,20 @@ static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t return hres; } +static HRESULT compile_member_expression(compile_ctx_t *ctx, member_expression_t *expr) +{ + expression_t *const_expr; + + if (expr->obj_expr) /* FIXME: we should probably have a dedicated opcode as well */ + return compile_member_call_expression(ctx, expr, 0, TRUE); + + const_expr = lookup_const_decls(ctx, expr->identifier, TRUE); + if(const_expr) + return compile_expression(ctx, const_expr); + + return push_instr_bstr(ctx, OP_ident, expr->identifier); +} + static HRESULT compile_call_expression(compile_ctx_t *ctx, call_expression_t *expr, BOOL ret_val) { unsigned arg_cnt = 0; @@ -484,7 +499,7 @@ static HRESULT compile_call_expression(compile_ctx_t *ctx, call_expression_t *ex for(call = expr->call_expr; call->type == EXPR_BRACKETS; call = ((unary_expression_t*)call)->subexpr); if(call->type == EXPR_MEMBER) - return compile_member_expression(ctx, (member_expression_t*)call, arg_cnt, ret_val); + return compile_member_call_expression(ctx, (member_expression_t*)call, arg_cnt, ret_val); hres = compile_expression(ctx, call); if(FAILED(hres)) @@ -582,7 +597,7 @@ static HRESULT compile_expression(compile_ctx_t *ctx, expression_t *expr) case EXPR_ME: return push_instr(ctx, OP_me) ? S_OK : E_OUTOFMEMORY; case EXPR_MEMBER: - return compile_member_expression(ctx, (member_expression_t*)expr, 0, TRUE); + return compile_member_expression(ctx, (member_expression_t*)expr); case EXPR_MOD: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_mod); case EXPR_MUL: diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index f648f073bc8..e2c1d5cc53d 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -615,10 +615,8 @@ static HRESULT variant_call(exec_ctx_t *ctx, VARIANT *v, unsigned arg_cnt, VARIA return S_OK; } -static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res) +static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res, BSTR identifier, unsigned arg_cnt) { - BSTR identifier = ctx->instr->arg1.bstr; - const unsigned arg_cnt = ctx->instr->arg2.uint; DISPPARAMS dp; ref_t ref; HRESULT hres; @@ -687,12 +685,14 @@ static HRESULT do_icall(exec_ctx_t *ctx, VARIANT *res) static HRESULT interp_icall(exec_ctx_t *ctx) { + BSTR identifier = ctx->instr->arg1.bstr; + const unsigned arg_cnt = ctx->instr->arg2.uint; VARIANT v; HRESULT hres; TRACE("\n"); - hres = do_icall(ctx, &v); + hres = do_icall(ctx, &v, identifier, arg_cnt); if(FAILED(hres)) return hres; @@ -701,8 +701,12 @@ static HRESULT interp_icall(exec_ctx_t *ctx) static HRESULT interp_icallv(exec_ctx_t *ctx) { + BSTR identifier = ctx->instr->arg1.bstr; + const unsigned arg_cnt = ctx->instr->arg2.uint; + TRACE("\n"); - return do_icall(ctx, NULL); + + return do_icall(ctx, NULL, identifier, arg_cnt); } static HRESULT interp_vcall(exec_ctx_t *ctx) @@ -788,6 +792,21 @@ static HRESULT interp_mcallv(exec_ctx_t *ctx) return do_mcall(ctx, NULL); } +static HRESULT interp_ident(exec_ctx_t *ctx) +{ + BSTR identifier = ctx->instr->arg1.bstr; + VARIANT v; + HRESULT hres; + + TRACE("%s\n", debugstr_w(identifier)); + + hres = do_icall(ctx, &v, identifier, 0); + if(FAILED(hres)) + return hres; + + return stack_push(ctx, &v); +} + static HRESULT assign_value(exec_ctx_t *ctx, VARIANT *dst, VARIANT *src, WORD flags) { VARIANT value; diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 9ef2cae81e5..f5353b33cae 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -242,6 +242,7 @@ typedef enum { X(gteq, 1, 0, 0) \ X(icall, 1, ARG_BSTR, ARG_UINT) \ X(icallv, 1, ARG_BSTR, ARG_UINT) \ + X(ident, 1, ARG_BSTR, 0) \ X(idiv, 1, 0, 0) \ X(imp, 1, 0, 0) \ X(incc, 1, ARG_BSTR, 0) \