Jacek Caban : jscript: Added '==' expression implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 18 07:55:44 CDT 2008
Module: wine
Branch: master
Commit: d699834892c0a47362c2f004a3222713ebda39ba
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d699834892c0a47362c2f004a3222713ebda39ba
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 17 23:29:16 2008 +0200
jscript: Added '==' expression implementation.
---
dlls/jscript/engine.c | 119 ++++++++++++++++++++++++++++++++++++++++++-
dlls/jscript/tests/lang.js | 12 +++++
2 files changed, 128 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 2b663d3..65eeaf7 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1853,10 +1853,123 @@ HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, js
return E_NOTIMPL;
}
-HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+/* ECMA-262 3rd Edition 11.9.3 */
+static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, BOOL *ret)
{
- FIXME("\n");
- return E_NOTIMPL;
+ if(V_VT(lval) == V_VT(rval) || (is_num_vt(V_VT(lval)) && is_num_vt(V_VT(rval))))
+ return equal2_values(lval, rval, ret);
+
+ /* FIXME: NULL disps should be handled in more general way */
+ if(V_VT(lval) == VT_DISPATCH && !V_DISPATCH(lval)) {
+ VARIANT v;
+ V_VT(&v) = VT_NULL;
+ return equal_values(ctx, &v, rval, ei, ret);
+ }
+
+ if(V_VT(rval) == VT_DISPATCH && !V_DISPATCH(rval)) {
+ VARIANT v;
+ V_VT(&v) = VT_NULL;
+ return equal_values(ctx, lval, &v, ei, ret);
+ }
+
+ if((V_VT(lval) == VT_NULL && V_VT(rval) == VT_EMPTY) ||
+ (V_VT(lval) == VT_EMPTY && V_VT(rval) == VT_NULL)) {
+ *ret = TRUE;
+ return S_OK;
+ }
+
+ if(V_VT(lval) == VT_BSTR && is_num_vt(V_VT(rval))) {
+ VARIANT v;
+ HRESULT hres;
+
+ hres = to_number(ctx->parser->script, lval, ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ return equal_values(ctx, &v, rval, ei, ret);
+ }
+
+ if(V_VT(rval) == VT_BSTR && is_num_vt(V_VT(lval))) {
+ VARIANT v;
+ HRESULT hres;
+
+ hres = to_number(ctx->parser->script, rval, ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ return equal_values(ctx, lval, &v, ei, ret);
+ }
+
+ if(V_VT(rval) == VT_BOOL) {
+ VARIANT v;
+
+ V_VT(&v) = VT_I4;
+ V_I4(&v) = V_BOOL(rval) ? 1 : 0;
+ return equal_values(ctx, lval, &v, ei, ret);
+ }
+
+ if(V_VT(lval) == VT_BOOL) {
+ VARIANT v;
+
+ V_VT(&v) = VT_I4;
+ V_I4(&v) = V_BOOL(lval) ? 1 : 0;
+ return equal_values(ctx, &v, rval, ei, ret);
+ }
+
+
+ if(V_VT(rval) == VT_DISPATCH && (V_VT(lval) == VT_BSTR || is_num_vt(V_VT(lval)))) {
+ VARIANT v;
+ HRESULT hres;
+
+ hres = to_primitive(ctx->parser->script, rval, ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ hres = equal_values(ctx, lval, &v, ei, ret);
+
+ VariantClear(&v);
+ return hres;
+ }
+
+
+ if(V_VT(lval) == VT_DISPATCH && (V_VT(rval) == VT_BSTR || is_num_vt(V_VT(rval)))) {
+ VARIANT v;
+ HRESULT hres;
+
+ hres = to_primitive(ctx->parser->script, lval, ei, &v);
+ if(FAILED(hres))
+ return hres;
+
+ hres = equal_values(ctx, &v, rval, ei, ret);
+
+ VariantClear(&v);
+ return hres;
+ }
+
+
+ *ret = FALSE;
+ return S_OK;
+}
+
+/* ECMA-262 3rd Edition 11.9.1 */
+HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+{
+ binary_expression_t *expr = (binary_expression_t*)_expr;
+ VARIANT rval, lval;
+ BOOL b;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ hres = get_binary_expr_values(ctx, expr, ei, &rval, &lval);
+ if(FAILED(hres))
+ return hres;
+
+ hres = equal_values(ctx, &rval, &lval, ei, &b);
+ if(FAILED(hres))
+ return hres;
+
+ return return_bool(ret, b);
}
/* ECMA-262 3rd Edition 11.9.4 */
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index bd2cfc9..c231180 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -37,6 +37,18 @@ ok(!(undefined === null), "!(undefined === null) is false");
ok(1 !== 2, "1 !== 2 is false");
ok(null !== undefined, "null !== undefined is false");
+ok(1 == 1, "1 == 1 is false");
+ok(!(1 == 2), "!(1 == 2) is false");
+ok(1.0 == 1, "1.0 == 1 is false");
+ok("abc" == "abc", "\"abc\" == \"abc\" is false");
+ok(true == true, "true == true is false");
+ok(null == null, "null == null is false");
+ok(undefined == undefined, "undefined == undefined is false");
+ok(undefined == null, "undefined == null is false");
+ok(true == 1, "true == 1 is false");
+ok(!(true == 2), "true == 2");
+ok(0 == false, "0 == false is false");
+
var trueVar = true;
ok(trueVar, "trueVar is not true");
More information about the wine-cvs
mailing list