Module: wine Branch: master Commit: 374280aa047100106a02548e79851b3387ab14ca URL: http://source.winehq.org/git/wine.git/?a=commit;h=374280aa047100106a02548e79...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Jul 20 16:29:00 2012 +0200
vbscript: Added interp_case implementation.
---
dlls/vbscript/interp.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index c908716..28c1b14 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -1302,6 +1302,20 @@ static HRESULT interp_imp(exec_ctx_t *ctx) return stack_push(ctx, &v); }
+static HRESULT var_cmp(exec_ctx_t *ctx, VARIANT *l, VARIANT *r) +{ + TRACE("%s %s\n", debugstr_variant(l), debugstr_variant(r)); + + if(V_VT(l) == VT_NULL || V_VT(r) == VT_NULL) { + FIXME("comparing nulls is not implemented\n"); + return E_NOTIMPL; + } + + /* FIXME: Fix comparing string to number */ + + return VarCmp(l, r, ctx->script->lcid, 0); + } + static HRESULT cmp_oper(exec_ctx_t *ctx) { variant_val_t l, r; @@ -1313,16 +1327,11 @@ static HRESULT cmp_oper(exec_ctx_t *ctx)
hres = stack_pop_val(ctx, &l); if(SUCCEEDED(hres)) { - if(V_VT(l.v) == VT_NULL || V_VT(r.v) == VT_NULL) { - FIXME("comparing nulls is not implemented\n"); - hres = E_NOTIMPL; - }else { - hres = VarCmp(l.v, r.v, ctx->script->lcid, 0); - } + hres = var_cmp(ctx, l.v, r.v); + release_val(&l); }
release_val(&r); - release_val(&l); return hres; }
@@ -1424,8 +1433,29 @@ static HRESULT interp_lteq(exec_ctx_t *ctx)
static HRESULT interp_case(exec_ctx_t *ctx) { - FIXME("\n"); - return E_NOTIMPL; + const unsigned arg = ctx->instr->arg1.uint; + variant_val_t v; + HRESULT hres; + + TRACE("%d\n", arg); + + hres = stack_pop_val(ctx, &v); + if(FAILED(hres)) + return hres; + + hres = var_cmp(ctx, stack_top(ctx, 0), v.v); + release_val(&v); + if(FAILED(hres)) + return hres; + + if(hres == VARCMP_EQ) { + stack_popn(ctx, 1); + instr_jmp(ctx, arg); + }else { + ctx->instr++; + } + + return S_OK; }
static HRESULT disp_cmp(IDispatch *disp1, IDispatch *disp2, VARIANT_BOOL *ret)