Module: wine Branch: master Commit: 01e2bea114b88f2c5f45533b6a8f9367e573ab90 URL: http://source.winehq.org/git/wine.git/?a=commit;h=01e2bea114b88f2c5f45533b6a...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Sep 8 14:57:45 2011 +0200
vbscript: Added interp_bool implementation.
---
dlls/vbscript/interp.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index b498a91..df296fa 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -29,6 +29,10 @@ typedef struct { vbscode_t *code; instr_t *instr; script_ctx_t *script; + + unsigned stack_size; + unsigned top; + VARIANT *stack; } exec_ctx_t;
typedef HRESULT (*instr_func_t)(exec_ctx_t*); @@ -72,6 +76,37 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, ref_t *ref) return S_OK; }
+static inline VARIANT *stack_pop(exec_ctx_t *ctx) +{ + assert(ctx->top); + return ctx->stack + --ctx->top; +} + +static HRESULT stack_push(exec_ctx_t *ctx, VARIANT *v) +{ + if(ctx->stack_size == ctx->top) { + VARIANT *new_stack; + + new_stack = heap_realloc(ctx->stack, ctx->stack_size*2); + if(!new_stack) { + VariantClear(v); + return E_OUTOFMEMORY; + } + + ctx->stack = new_stack; + ctx->stack_size *= 2; + } + + ctx->stack[ctx->top++] = *v; + return S_OK; +} + +static void stack_popn(exec_ctx_t *ctx, unsigned n) +{ + while(n--) + VariantClear(stack_pop(ctx)); +} + static HRESULT interp_icallv(exec_ctx_t *ctx) { BSTR identifier = ctx->instr->arg1.bstr; @@ -115,8 +150,14 @@ static HRESULT interp_ret(exec_ctx_t *ctx)
static HRESULT interp_bool(exec_ctx_t *ctx) { - FIXME("\n"); - return E_NOTIMPL; + const VARIANT_BOOL arg = ctx->instr->arg1.lng; + VARIANT v; + + TRACE("%s\n", arg ? "true" : "false"); + + V_VT(&v) = VT_BOOL; + V_BOOL(&v) = arg; + return stack_push(ctx, &v); }
static HRESULT interp_string(exec_ctx_t *ctx) @@ -143,6 +184,12 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func) vbsop_t op; HRESULT hres = S_OK;
+ exec.stack_size = 16; + exec.top = 0; + exec.stack = heap_alloc(exec.stack_size * sizeof(VARIANT)); + if(!exec.stack) + return E_OUTOFMEMORY; + exec.code = func->code_ctx; exec.instr = exec.code->instrs + func->code_off; exec.script = ctx; @@ -152,11 +199,15 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func) hres = op_funcs[op](&exec); if(FAILED(hres)) { FIXME("Failed %08x\n", hres); + stack_popn(&exec, exec.top); break; }
exec.instr += op_move[op]; }
+ assert(!exec.top); + heap_free(exec.stack); + return hres; }