Jacek Caban : vbscript: Added interp_step implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 22 13:39:48 CDT 2011


Module: wine
Branch: master
Commit: d55aa556ad6fcd89106d4d5220250834f579fbb7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d55aa556ad6fcd89106d4d5220250834f579fbb7

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 22 14:23:51 2011 +0200

vbscript: Added interp_step implementation.

---

 dlls/vbscript/interp.c |   41 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 5e41845..c95183d 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -245,6 +245,12 @@ static inline VARIANT *stack_pop(exec_ctx_t *ctx)
     return ctx->stack + --ctx->top;
 }
 
+static inline VARIANT *stack_top(exec_ctx_t *ctx, unsigned n)
+{
+    assert(ctx->top >= n);
+    return ctx->stack + (ctx->top-n-1);
+}
+
 static HRESULT stack_push(exec_ctx_t *ctx, VARIANT *v)
 {
     if(ctx->stack_size == ctx->top) {
@@ -745,8 +751,39 @@ static HRESULT interp_new(exec_ctx_t *ctx)
 static HRESULT interp_step(exec_ctx_t *ctx)
 {
     const BSTR ident = ctx->instr->arg2.bstr;
-    FIXME("%s\n", debugstr_w(ident));
-    return E_NOTIMPL;
+    BOOL gteq_zero;
+    VARIANT zero;
+    ref_t ref;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(ident));
+
+    V_VT(&zero) = VT_I2;
+    V_I2(&zero) = 0;
+    hres = VarCmp(stack_top(ctx, 0), &zero, ctx->script->lcid, 0);
+    if(FAILED(hres))
+        return hres;
+
+    gteq_zero = hres == VARCMP_GT || hres == VARCMP_EQ;
+
+    hres = lookup_identifier(ctx, ident, VBDISP_ANY, &ref);
+    if(FAILED(hres))
+        return hres;
+
+    if(ref.type != REF_VAR) {
+        FIXME("%s is not REF_VAR\n", debugstr_w(ident));
+        return E_FAIL;
+    }
+
+    hres = VarCmp(ref.u.v, stack_top(ctx, 1), ctx->script->lcid, 0);
+    if(FAILED(hres))
+        return hres;
+
+    if(hres == VARCMP_EQ || hres == (gteq_zero ? VARCMP_LT : VARCMP_GT))
+        ctx->instr++;
+    else
+        instr_jmp(ctx, ctx->instr->arg1.uint);
+    return S_OK;
 }
 
 static HRESULT interp_jmp(exec_ctx_t *ctx)




More information about the wine-cvs mailing list