jscript: Added logical negation implementation.
This commit is contained in:
parent
b60898353c
commit
11153d0e05
|
@ -86,6 +86,24 @@ static HRESULT exprval_to_value(script_ctx_t *ctx, exprval_t *val, jsexcept_t *e
|
||||||
return exprval_value(ctx, val, ei, ret);
|
return exprval_value(ctx, val, ei, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT exprval_to_boolean(script_ctx_t *ctx, exprval_t *exprval, jsexcept_t *ei, VARIANT_BOOL *b)
|
||||||
|
{
|
||||||
|
if(exprval->type != EXPRVAL_VARIANT) {
|
||||||
|
VARIANT val;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
hres = exprval_to_value(ctx, exprval, ei, &val);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
hres = to_boolean(&val, b);
|
||||||
|
VariantClear(&val);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
return to_boolean(&exprval->u.var, b);
|
||||||
|
}
|
||||||
|
|
||||||
static void exprval_set_idref(exprval_t *val, IDispatch *disp, DISPID id)
|
static void exprval_set_idref(exprval_t *val, IDispatch *disp, DISPID id)
|
||||||
{
|
{
|
||||||
val->type = EXPRVAL_IDREF;
|
val->type = EXPRVAL_IDREF;
|
||||||
|
@ -440,6 +458,15 @@ HRESULT try_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT return_bool(exprval_t *ret, DWORD b)
|
||||||
|
{
|
||||||
|
ret->type = EXPRVAL_VARIANT;
|
||||||
|
V_VT(&ret->u.var) = VT_BOOL;
|
||||||
|
V_BOOL(&ret->u.var) = b ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
FIXME("\n");
|
||||||
|
@ -808,10 +835,26 @@ HRESULT binary_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWO
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
/* ECMA-262 3rd Edition 11.4.9 */
|
||||||
|
HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
unary_expression_t *expr = (unary_expression_t*)_expr;
|
||||||
return E_NOTIMPL;
|
exprval_t exprval;
|
||||||
|
VARIANT_BOOL b;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
hres = exprval_to_boolean(ctx->parser->script, &exprval, ei, &b);
|
||||||
|
exprval_release(&exprval);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
return return_bool(ret, !b);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
||||||
|
|
|
@ -91,6 +91,8 @@ HRESULT disp_call(IDispatch*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,I
|
||||||
HRESULT disp_propget(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
|
HRESULT disp_propget(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
|
||||||
HRESULT disp_propput(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
|
HRESULT disp_propput(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
|
||||||
|
|
||||||
|
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
|
||||||
|
|
||||||
typedef struct named_item_t {
|
typedef struct named_item_t {
|
||||||
IDispatch *disp;
|
IDispatch *disp;
|
||||||
DWORD flags;
|
DWORD flags;
|
||||||
|
|
|
@ -132,3 +132,34 @@ void jsheap_free(jsheap_t *heap)
|
||||||
|
|
||||||
jsheap_init(heap);
|
jsheap_init(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ECMA-262 3rd Edition 9.2 */
|
||||||
|
HRESULT to_boolean(VARIANT *v, VARIANT_BOOL *b)
|
||||||
|
{
|
||||||
|
switch(V_VT(v)) {
|
||||||
|
case VT_EMPTY:
|
||||||
|
case VT_NULL:
|
||||||
|
*b = VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
case VT_I4:
|
||||||
|
*b = V_I4(v) ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
case VT_R8:
|
||||||
|
*b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
case VT_BSTR:
|
||||||
|
*b = V_BSTR(v) && *V_BSTR(v) ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
case VT_DISPATCH:
|
||||||
|
*b = V_DISPATCH(v) ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
case VT_BOOL:
|
||||||
|
*b = V_BOOL(v);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("unimplemented for vt %d\n", V_VT(v));
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -17,5 +17,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ok(true, "true is not true?");
|
ok(true, "true is not true?");
|
||||||
|
ok(!false, "!false is not true");
|
||||||
|
ok(!undefined, "!undefined is not true");
|
||||||
|
ok(!null, "!null is not true");
|
||||||
|
ok(!0, "!0 is not true");
|
||||||
|
ok(!0.0, "!0.0 is not true");
|
||||||
|
|
||||||
reportSuccess();
|
reportSuccess();
|
||||||
|
|
Loading…
Reference in New Issue