diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index e166b21ca84..8a875ee4021 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -614,8 +614,26 @@ static HRESULT interp_or(exec_ctx_t *ctx) static HRESULT interp_xor(exec_ctx_t *ctx) { - FIXME("\n"); - return E_NOTIMPL; + variant_val_t r, l; + VARIANT v; + HRESULT hres; + + TRACE("\n"); + + hres = stack_pop_val(ctx, &r); + if(FAILED(hres)) + return hres; + + hres = stack_pop_val(ctx, &l); + if(SUCCEEDED(hres)) { + hres = VarXor(l.v, r.v, &v); + release_val(&l); + } + release_val(&r); + if(FAILED(hres)) + return hres; + + return stack_push(ctx, &v); } static HRESULT interp_eqv(exec_ctx_t *ctx) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index c6a336d36e5..329df36cf1f 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -97,6 +97,11 @@ call ok(false and false or true, "false and false or true is false?") call ok(true or false and false, "true or false and false is false?") call ok(null or true, "null or true is false") +call ok(true xor false, "true xor false is false?") +call ok(not (false xor false), "false xor false is true?") +call ok(not (true or false xor true), "true or false xor true is true?") +call ok(not (true xor false or true), "true xor false or true is true?") + x = 3 Call ok(2+2 = 4, "2+2 = " & (2+2)) Call ok(false + 6 + true = 5, "false + 6 + true <> 5")